我在编写用于回归预测的数据生成函数时遇到了一些障碍。人们通常会做我想做的事情(不像我想要的那样自动化),是执行以下操作:
#### 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
函数,但如果不先完成数据生成步骤,目前这样做是徒劳的。我该如何实现这个目标?
我认为你想要的可以通过效果包很容易地实现,一列的示例代码:(对列的简单循环将为每一列执行此操作)
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