自动生成均值调整数据以用于 R 中的回归

问题描述 投票:0回答:1

我在编写用于回归预测的数据生成函数时遇到了一些障碍。人们通常会做我想做的事情(不像我想要的那样自动化),是执行以下操作:

#### Fit Data ####
fit <- lm(Petal.Length ~ Petal.Width + Sepal.Width,iris)

#### Create Test Data ####
newdata <- data.frame(
  Petal.Width = mean(iris$Petal.Width),
  Sepal.Width = seq(
    min(iris$Sepal.Width),
    max(iris$Sepal.Width),
    length.out = 100
  )
)

#### Generate Predictions ####
pred <- predict(fit,newdata=newdata)
pred

这个想法是,您选择一个感兴趣的变量并通过将其他值设置为平均值来控制其他值,然后预测数据。因此,这将为您提供以下预测值:

       1        2        3        4        5        6        7        8 
4.133390 4.124783 4.116176 4.107569 4.098962 4.090355 4.081749 4.073142 
       9       10       11       12       13       14       15       16 
4.064535 4.055928 4.047321 4.038714 4.030107 4.021500 4.012893 4.004286 
      17       18       19       20       21       22       23       24 
3.995680 3.987073 3.978466 3.969859 3.961252 3.952645 3.944038 3.935431 
      25       26       27       28       29       30       31       32 
3.926824 3.918217 3.909611 3.901004 3.892397 3.883790 3.875183 3.866576 
      33       34       35       36       37       38       39       40 
3.857969 3.849362 3.840755 3.832148 3.823542 3.814935 3.806328 3.797721 
      41       42       43       44       45       46       47       48 
3.789114 3.780507 3.771900 3.763293 3.754686 3.746079 3.737473 3.728866 
      49       50       51       52       53       54       55       56 
3.720259 3.711652 3.703045 3.694438 3.685831 3.677224 3.668617 3.660010 
      57       58       59       60       61       62       63       64 
3.651404 3.642797 3.634190 3.625583 3.616976 3.608369 3.599762 3.591155 
      65       66       67       68       69       70       71       72 
3.582548 3.573941 3.565335 3.556728 3.548121 3.539514 3.530907 3.522300 
      73       74       75       76       77       78       79       80 
3.513693 3.505086 3.496479 3.487872 3.479266 3.470659 3.462052 3.453445 
      81       82       83       84       85       86       87       88 
3.444838 3.436231 3.427624 3.419017 3.410410 3.401803 3.393197 3.384590 
      89       90       91       92       93       94       95       96 
3.375983 3.367376 3.358769 3.350162 3.341555 3.332948 3.324341 3.315734 
      97       98       99      100 
3.307128 3.298521 3.289914 3.281307

但是,我可能必须一遍又一遍地执行此操作,并且每次都手动编码所有这些内容不会非常有效,因此我希望使用自定义函数将其自动化。

测试用例

到目前为止,这是我想出的尝试自动化该过程的方法,但这显然没有帮助。这个想法是让函数将除一个变量之外的所有变量作为平均值,然后选择一个变量作为序列号(从最小值到最大值),就像我上面的那样。生成的数据还应保留插入的预测变量的名称(因此在输入到函数中时,它们应该显示“test1”等):

#### Create Test Data ####
test.data <- data.frame(
  test1 = rnorm(100),
  test2 = rnorm(100),
  test3 = rnorm(100),
  test4 = rnorm(100)
)

#### Make Function ####
gen.seq <- function(data,x1,x2,x3,x4){
  
  data <- data
  
  newdata <- data.frame(
    x1 = mean(data$x1, na.rm = T),
    x2 = mean(data$x2, na.rm = T),
    x3 = mean(data$x3, na.rm = T),
    x4 = seq(
      min(data$x4, na.rm = T),
      max(data$x4, na.rm = T),
      length.out = 100
    )
  )
}

#### Generate Mean Controlled Data ####
gen.seq(test.data,
        test1,
        test2,
        test3,
        test4)

如果可能的话,我还希望它在该函数中包含

predict
函数,但如果不先完成数据生成步骤,目前这样做是徒劳的。我该如何实现这个目标?

r function regression predict
1个回答
0
投票

我认为你想要的可以通过效果包很容易地实现,一列的示例代码:(对列的简单循环将为每一列执行此操作)

library(effects)
mod=lm(mpg~cyl+qsec+drat,data=mtcars)
Effect(
  "qsec",
  mod,
  xlevels=list("qsec"=seq(min(mtcars$qsec),max(mtcars$qsec),length.out=10))
)
qsec
            14.5 15.4333333333333 16.3666666666667             17.3 18.2333333333333 19.1666666666667 
        20.88945         20.66681         20.44417         20.22153         19.99888         19.77624 
            20.1 21.0333333333333 21.9666666666667             22.9 
        19.55360         19.33096         19.10832         18.88568
© www.soinside.com 2019 - 2024. All rights reserved.