使用lm进行预测

时间:2017-06-25 09:55:39

标签: r dataframe apply operations

我有以下数据框:

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
 }

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