我有以下数据框:
lm mean resids sd resids resid 1 resid 2 resid 3 intercept beta
1 0.000000e+00 6.2806844 -3.6261548 7.2523096 -3.6261548 103.62615 24.989340
2 -2.960595e-16 8.7515899 -5.0527328 10.1054656 -5.0527328 141.96786 -1.047323
3 -2.960595e-16 5.9138984 -3.4143908 6.8287817 -3.4143908 206.29046 -26.448694
4 3.700743e-17 0.5110845 0.2950748 -0.5901495 0.2950748 240.89801 -35.806642
5 7.401487e-16 6.6260504 3.8255520 -7.6511040 3.8255520 187.03479 -23.444762
6 5.921189e-16 8.7217431 5.0355007 -10.0710014 5.0355007 41.43239 3.138396
7 0.000000e+00 5.5269434 3.1909823 -6.3819645 3.1909823 -119.90628 27.817845
8 -1.480297e-16 1.0204260 -0.5891432 1.1782864 -0.5891432 -180.33773 35.623363
9 -5.921189e-16 6.9488186 -4.0119023 8.0238046 -4.0119023 -64.72245 21.820226
10 -8.881784e-16 8.6621512 -5.0010953 10.0021906 -5.0010953 191.65339 -5.218767
每行代表一个窗口长度为3的估计线性模型。我在一个单独的数据帧上使用rollapply
,函数lm(y~t)
将系数和截距提取到一个新的数据帧中,我已将其与来自同一模型的残差及其相应的均值和残差。
由于窗口长度为3,这意味着在渣油1,渣油2和渣油3中每个模型有3个残留物。相应地包括这些残留物的平均值和sd。
我正在寻求预测下一个观察,实质上是k+1
,其中k
是窗口长度,使用截距和beta。
回想一下,lm1
需要观察1,2,3来估计截距和β,而lm2需要2,3,4,lm3需要3,4,5等。预测函数应该是:
predict_lm1 = intercept_lm1 + beta_lm1*(k+1)
k+1 = 4
。对于lm2
:
predict_lm2 = intercept_lm2 + beta_lm2*(k+1)
k+1 = 5
。
显然,每次我向下移动数据集中的一行时,k
都会增加1。这是因为解释变量是时间t
,这是每次观察增加一个的序列。
我应该在这里使用for loop
还是apply
功能?
如何创建一个迭代行并使用该行中的信息相应地计算预测的函数?
感谢。
修改
我设法通过编写以下内容找到了可能的解决方案:
n=nrow(dataset)
for(i in n){
predictions = dataset$Intercept + dataset$beta*(k+1)
}
但是,k
每次迭代不会增加1。因此,k+1
始终为= 4
。
如何确保k
相应地增加1?
编辑2
我设法通过编写以下内容将{1}添加到k
:
n=nrow(dataset)
for(i in n){
x = 0
x[i] = k + 1
preds = dataset$`(Intercept)` + dataset$t*(x[i])
}
但是,第一次预测被高估了。它应该是203,而估计为228,这意味着它将解释变量设置为1太高。 然而,第二个预测是正确的。我不确定我做错了什么。有什么建议吗?
编辑3
我设法找到了如下解决方案:
n=nrow(dataset)
for(i in n){
x = k + 1
preds = dataset$`(Intercept)` + dataset$t*(x)
x = x + 1
}
答案 0 :(得分:0)
你的循环没有迭代:
dataset <- read.table(text="lm meanresids sdresids resid1 resid2 resid3 intercept beta
1 0.000000e+00 6.2806844 -3.6261548 7.2523096 -3.6261548 103.62615 24.989340
2 -2.960595e-16 8.7515899 -5.0527328 10.1054656 -5.0527328 141.96786 -1.047323
3 -2.960595e-16 5.9138984 -3.4143908 6.8287817 -3.4143908 206.29046 -26.448694
4 3.700743e-17 0.5110845 0.2950748 -0.5901495 0.2950748 240.89801 -35.806642
5 7.401487e-16 6.6260504 3.8255520 -7.6511040 3.8255520 187.03479 -23.444762
6 5.921189e-16 8.7217431 5.0355007 -10.0710014 5.0355007 41.43239 3.138396
7 0.000000e+00 5.5269434 3.1909823 -6.3819645 3.1909823 -119.90628 27.817845
8 -1.480297e-16 1.0204260 -0.5891432 1.1782864 -0.5891432 -180.33773 35.623363
9 -5.921189e-16 6.9488186 -4.0119023 8.0238046 -4.0119023 -64.72245 21.820226
10 -8.881784e-16 8.6621512 -5.0010953 10.0021906 -5.0010953 191.65339 -5.218767", header=T)
n <- nrow(dataset)
predictions <- data.frame()
for(i in 1:n){
k <- i ##not sure where k is coming from but put it here
predictions <- rbind(predictions, dataset$intercept[i] + dataset$beta[i]*(k+1))
}
predictions