一系列线性模型的预测值

3

你好:我有一系列使用tidyr和dplyr构建的数据框中的线性模型,如下所示。我该如何使用一个固定的新数据集来生成每个模型的预测值?实际上,我有10个因变量,但只有两个自变量。

#random data
x1<-rnorm(100, mean=10, sd=5)
x2<-rnorm(100, mean=5, sd=2 )
y1<-rnorm(100, mean=5, sd=1)
y2<-rnorm(100, mean=3, sd=1)
#create test data farame
df<-data.frame(y1, y2, x1, x2)
#create models
df%>%
  gather(dv, value, y1, y2, -x1,-x2) %>%
  group_by(dv)%>%
  do(mod=lm(value~x1+x2, data=.))
1个回答

3

一种选择是使用 do 将预测结果作为数据框的一列获取。与其他答案的区别在于使用 data.frame 将预测结果作为一列获取。您可以将变量 dv 添加到此数据集中,以保持事物的顺序。

df %>%
    gather(dv, value, y1, y2, -x1,-x2) %>%
    group_by(dv)%>%
    do(mod=lm(value ~ x1 + x2, data=.)) %>%
        do(data.frame(dv = .$dv, pred = predict(.$mod, newdata = df)))

Source: local data frame [200 x 2]
Groups: <by row>

      dv     pred
   (chr)    (dbl)
1     y1 4.936012
2     y1 4.948939
3     y1 4.992472
4     y1 4.733290
5     y1 4.921581
6     y1 5.115699
7     y1 4.981135
8     y1 4.837326
9     y1 4.641484
10    y1 4.739197
..   ...      ...

那样做的不利之处(对我而言)是您没有数据用于与实际预测值进行比较。你当然可以使用cbind将其与预测数据集合并,但另一个有用的选择是在do中使用包broom中的augment。在这第二种选择中,我在第一次调用do时使用了augment,尽管这不是必需的。

你可以使用newdata参数在augment中添加要预测的数据集/预测结果。在这个例子中,我使用了数据集df2(只是你的df数据集的因变量列)。

library(broom)
df2 = df[ , 3:4] # Dataset for predictions
df %>%
    gather(dv, value, y1, y2, -x1,-x2) %>%
    group_by(dv)%>%
    do( augment(lm(value ~ x1 + x2, data=.), newdata = df2) )

Source: local data frame [200 x 5]
Groups: dv [2]

      dv        x1       x2  .fitted   .se.fit
   (chr)     (dbl)    (dbl)    (dbl)     (dbl)
1     y1  5.863764 6.201406 4.936012 0.1521102
2     y1  4.419014 7.028888 4.948939 0.1936563
3     y1  7.917369 6.081930 4.992472 0.1255001
4     y1  4.338864 4.019565 4.733290 0.1842635
5     y1 13.307611 2.674705 4.921581 0.1757911
6     y1 14.986879 4.666154 5.115699 0.1614377
7     y1 12.941636 3.679022 4.981135 0.1409247
8     y1  7.474526 4.088868 4.837326 0.1310659
9     y1  2.136858 3.706184 4.641484 0.2357699
10    y1  9.307190 1.885127 4.739197 0.2008851
..   ...       ...      ...      ...       ...

比我的回答更好。谢谢,我还在学习dplyr,这很有帮助。(我删除了我的回答,因为我认为你的写得更优雅、更好) - Bishops_Guest
这太棒了。你能解释一下为什么需要指定数据和新数据参数吗?对我来说,模型应该适合原始数据框(df),但预测值应该使用新数据(df2)生成。 - spindoctor
1
@spindoctor 当使用augment进行预测时,只需要newdata参数。 - aosmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接