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

ryoqjall  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(112)

我在为回归预测编程数据生成函数时遇到了一点障碍。人们通常会做我想做的事情(不像我想做的那样自动化),是做以下事情:

#### 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

这个想法是你选择一个感兴趣的变量,并通过将它们设置为均值来控制其他值,然后预测数据。因此,这将为您提供以下预测值:
然而,我可能不得不一遍又一遍地做这件事,每次都手工编写代码不会很有效率,所以我希望用一个自定义函数来自动化它。

测试用例

到目前为止,这就是我试图自动化这个过程的方法,但显然没有帮助。这个想法是让函数把除了一个变量之外的所有变量作为它们的均值,然后选择一个变量作为一个序列号(从它的最小值到最大值),就像我上面所做的那样。生成的数据还应该保留插入的预测器的名称(因此当输入到函数时,它们应该说“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函数,但是如果不先完成数据生成步骤,那么现在这样做是徒劳的。我该如何实现这一点?

c9qzyr3d

c9qzyr3d1#

我想你想要的效果包可以很容易地实现

library(effects)
mod=lm(mpg~cyl+qsec+drat,data=mtcars)
allEffects(
  mod,
  xlevels=lapply(mtcars[,names(mod$coefficients[-1])],function(x){
    seq(min(x),max(x),length.out=10)
  })
)

导致

model: mpg ~ cyl + qsec + drat

 cyl effect
cyl
               4 4.44444444444444 4.88888888888889 5.33333333333333 5.77777777777778 6.22222222222222 
        26.06315         24.84969         23.63622         22.42275         21.20929         19.99582 
6.66666666666667 7.11111111111111 7.55555555555556                8 
        18.78236         17.56889         16.35542         15.14196 

 qsec effect
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 

 drat effect
drat
            2.76 3.00111111111111 3.24222222222222 3.48333333333333 3.72444444444444 3.96555555555556 
        18.94643         19.27621         19.60598         19.93576         20.26553         20.59531 
4.20666666666667 4.44777777777778 4.68888888888889             4.93 
        20.92508         21.25486         21.58464         21.91441
dsf9zpds

dsf9zpds2#

一个更一般/不可知的答案,它只是创建了一个框架,

reps=3 # sequence length
cols=c("test1","test2","test4") # columns to vary
test.data.mean=as.data.frame.list(colMeans(test.data))

sapply(
  cols,
  function(x){
    y=names(test.data.mean)[names(test.data.mean)!=x]
    z=setNames(data.frame(seq(min(test.data[x]),max(test.data[x]),length.out=reps)),x)
    z[y]=test.data.mean[y]
    z[colnames(test.data.mean)]
  },
  simplify=F,
  USE.NAMES=T
)

导致

$test1
       test1       test2       test3       test4
1 -1.9394516 -0.03640007 -0.04115825 -0.07265569
2  0.1961531 -0.03640007 -0.04115825 -0.07265569
3  2.3317578 -0.03640007 -0.04115825 -0.07265569

$test2
        test1       test2       test3       test4
1 -0.05502075 -2.66943429 -0.04115825 -0.07265569
2 -0.05502075 -0.02634115 -0.04115825 -0.07265569
3 -0.05502075  2.61675199 -0.04115825 -0.07265569

$test4
        test1       test2       test3       test4
1 -0.05502075 -0.03640007 -0.04115825 -2.60890222
2 -0.05502075 -0.03640007 -0.04115825  0.01795227
3 -0.05502075 -0.03640007 -0.04115825  2.64480676

相关问题