来自一系列线性模型的预测值
Predicted values from a series of linear models
您好:我在使用 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=.))
一种选择是使用 do
将预测作为 data.frame 中的一列。与其他答案的不同之处在于使用 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
,尽管这不是必需的。
您可以给要预测的数据集 with/add 使用 augment
中的 newdata
参数进行预测。在此示例中,我使用了数据集 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
.. ... ... ... ... ...
您好:我在使用 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=.))
一种选择是使用 do
将预测作为 data.frame 中的一列。与其他答案的不同之处在于使用 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
,尽管这不是必需的。
您可以给要预测的数据集 with/add 使用 augment
中的 newdata
参数进行预测。在此示例中,我使用了数据集 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
.. ... ... ... ... ...