R中矩阵与列表的乘法问题
我通过每年执行汇总回归开发了一个预测模型,因此我有不同的模型系数。我用lappy(myregressions,coef)将不同的系数存储在一个列表中,我想使用模型系数对子样本(SS)进行预测 因此,我有一个DF和我想要预测的对象(SS),以及一个“列表”,其中包含每年不同的模型系数:R中矩阵与列表的乘法问题,r,matrix-multiplication,R,Matrix Multiplication,我通过每年执行汇总回归开发了一个预测模型,因此我有不同的模型系数。我用lappy(myregressions,coef)将不同的系数存储在一个列表中,我想使用模型系数对子样本(SS)进行预测 因此,我有一个DF和我想要预测的对象(SS),以及一个“列表”,其中包含每年不同的模型系数: SS id time inc ta div acc dd neg 9 1 1995 10.3995 234.4126 2.5155 3.6462 2
SS
id time inc ta div acc dd neg
9 1 1995 10.3995 234.4126 2.5155 3.6462 2.5155 0
10 1 1996 10.6098 245.7136 2.7936 -3.8121 2.7936 0
11 1 1997 9.9005 271.3418 2.6359 13.7573 2.6359 0
12 1 1998 8.4780 231.6341 2.6580 -19.0560 2.6580 0
13 1 1999 14.2969 293.2106 2.6992 11.7852 2.6992 0
14 1 2000 159.1115 374.4408 2.7745 223.5071 2.7745 0
15 1 2001 -10.2167 315.3258 4.2379 5.8569 4.2379 1
16 1 2002 -10.8737 207.4538 3.2023 -36.4547 3.2023 1
17 1 2003 10.7719 195.9657 3.0622 -12.2817 3.0622 0
18 1 2004 4.6669 269.0332 3.7677 -6.0882 3.7677 0
19 1 2005 5.5542 235.2783 3.9230 -10.7087 3.9230 0
20 1 2006 5.2375 300.8294 3.8623 -18.7482 3.8623 0
21 1 2007 15.1524 305.0057 3.8131 -9.9801 3.8131 0
22 1 2008 20.8307 307.4744 4.3381 -25.4373 4.3381 0
23 1 2009 33.5010 329.3090 5.2710 -16.7450 5.2710 0
24 1 2010 4.5180 344.7620 5.5650 -15.9290 5.5650 0
25 1 2011 5.7310 330.4060 6.1180 -3.2060 6.1180 0
26 1 2012 9.4360 505.8150 2.8510 -14.9710 2.8510 0
73 3 2007 5.4877 240.1564 1.8500 29.3132 1.8500 0
74 3 2008 14.9182 222.5949 0.0000 -76.0916 0.0000 0
以及以下模型系数:
> COEF
Year_1995 Year_1996 Year_1997 Year_1998 Year_1999 Year_2000 Year_2001 Year_2002 Year_2003 Year_2004 Year_2005
(Intercept) -1.416094e+02 -82.29723152 -34.48711235 -6.75285267 39.78186661 51.89597510 23.17918777 6.86072515 5.23465497 -5.08239969 -7.6220984
inc 1.117437e-03 -0.02122991 -0.02947603 -0.05828917 -0.16953822 -0.17572781 0.04419688 0.35492978 0.16529339 0.38122280 0.7805206
ta 9.491843e-02 0.07728032 0.08736790 0.07941649 0.05278938 0.04884008 0.04428136 0.02858724 0.02813507 0.01588882 0.0168884
div -2.110746e+00 -0.41682760 -0.28204986 0.63646277 2.40335454 2.47957711 1.75339550 1.15411677 1.85791345 1.43288590 0.2259217
acc -2.925896e-01 -0.08831186 0.06483823 0.15384923 0.15693459 0.08828990 -0.04028631 -0.04648089 0.03157282 -0.23257706 -0.2823107
dd 8.246035e+01 30.23337379 -23.72154753 -47.38041382 -84.13134965 -95.56086167 -58.06399289 -21.61298500 -12.11352064 -15.77302514 -26.3842782
neg -1.381479e+02 25.15047622 31.05613176 60.76519163 56.06664314 -36.13696534 -27.42185598 -24.58473166 -38.36806501 -25.03186619 17.3447807
Year_2006 Year_2007 Year_2008 Year_2009 Year_2010 Year_2011
(Intercept) -17.46962445 -12.99847554 -32.75957413 -20.99868791 -16.816973260 4.20348639
inc 0.92593004 0.77045742 0.78774688 0.85185356 0.784377210 0.63716695
ta 0.01374169 0.02841329 0.02729613 0.01045620 0.005867683 -0.00203465
div -0.29770950 -0.20114307 -0.18070822 0.04780002 0.310500463 0.69699053
acc -0.23553147 -0.18337198 -0.11535837 -0.12223995 -0.083179505 -0.08493535
dd 12.00464005 -15.31475612 18.57613650 8.13129910 8.855194809 0.86265216
neg 13.84589134 -6.42677325 24.44777629 39.13989889 31.941025536 5.76845025
然而,我对如何通过代码来实现这一点非常迷茫
我试图将时间变量设置为一个因子(级别),然后以某种方式将其与正确的模型(年份)联系起来,但没有成功。以下是我到目前为止的想法:
as.factor(SS$time)
for (f in levels(SS$time)) {
SS$Forecast<-NA
SS[which(set$time == f),]$Forecast <- c(SS[which(SS$time == f),]$SS[,cbind("inc","ta","div","acc","dd","neg"] %*% COEF$Year_(f)[-1,])
如果您想对每年的系数进行不同的估计,那么没有理由对每年的各个模型进行拟合,您只需在所有系数中添加一个交互项即可。例如,这里有一个简化的示例数据集
set.seed(15)
dd<-data.frame(
year=factor(sample(2001:2005, 50, replace=T)),
inc = runif(50),
tc=runif(50),
y=rnorm(50)
)
返回相同的预测
3 6 7 10 15
1.0488444 0.2317228 1.4672413 0.8638882 0.5296259
16 18 21 29 41
0.4944689 1.2231755 0.7690225 0.6869038 -0.5844771
43 49
0.5610021 0.3552466
但是当然,
m1
的优点是能够预测任何一年,而不必为每一年拟合m2
类型的模型。如果不存储系数,而是实际存储模型对象,则会更容易。然后您可以使用标准的predict()
函数。你不这样做有什么原因吗?我也存储了回归,但是我不知道预测函数。我现在会很快读到它。谢谢你的建议,因为预测函数也允许我使用新数据,我想我也可以使用该函数。因此,我执行了以下操作:预测在我看来,使用预测函数(至少在我使用它的方式上)会丢失索引(id、时间)信息。我想我仍然不清楚您到底在做什么,或者您最初是如何生成模型的。所以你希望每年每个变量有不同的斜率?似乎你应该有一个模型,其中包含一年的交互项。t如果我只是每年做一次简单的回归,我相信你的模型和我的模型是等价的(当然你的模型更简单、更方便)。但我是根据从t-5年到t年的6个汇总回归,而不仅仅是从t年,来估计t年的不同斜率。如果我错了,请纠正我再次感谢你的回答。我只是想让你们知道,我重新制定了这个问题,重点放在预测函数上,但我犹豫是否删除这个问题,因为你们已经写了一个答案。你有什么建议?
set.seed(15)
dd<-data.frame(
year=factor(sample(2001:2005, 50, replace=T)),
inc = runif(50),
tc=runif(50),
y=rnorm(50)
)
m1 <- lm(y~(inc+tc)*year, dd)
m2 <- lm(y~inc+tc, subset(dd, year==2005))
predict(m1, subset(dd, year==2005))
predict(m2, subset(dd, year==2005))
3 6 7 10 15
1.0488444 0.2317228 1.4672413 0.8638882 0.5296259
16 18 21 29 41
0.4944689 1.2231755 0.7690225 0.6869038 -0.5844771
43 49
0.5610021 0.3552466