首页
学习
活动
专区
圈层
工具
发布

用lm预测
EN

Stack Overflow用户
提问于 2017-06-25 09:55:38
回答 1查看 116关注 0票数 1

我有以下数据框架:

代码语言:javascript
复制
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,它意味着每个模型中有3个残差,在resid 1、resid 2和resid 3中,相应地包含了这些残差的平均值和sd。

我试图预测下一个观察,本质上,k+1,其中k是窗口长度,使用拦截和测试版。

回想一下,lm1需要观察1,2,3来估计拦截和β,lm2需要2,3,4,lm3需要3,4,5等等。预测的函数应该是:

代码语言:javascript
复制
predict_lm1 = intercept_lm1 + beta_lm1*(k+1) 

在哪里k+1 = 4。对于lm2

代码语言:javascript
复制
predict_lm2 = intercept_lm2 + beta_lm2*(k+1)

在哪里k+1 = 5

显然,每次我在dataset中向下移动一行时,k都会增加1。这是因为解释变量是时间,t,它是一个序列,每观察增加一个。

我应该在这里使用for loop还是apply函数?

如何创建一个函数来迭代行,并根据该行中找到的信息计算相应的预测?

谢谢。

编辑:

通过编写以下内容,我设法找到了一个可能的解决方案:

代码语言:javascript
复制
n=nrow(dataset)
for(i in n){
predictions = dataset$Intercept + dataset$beta*(k+1)
}

但是,k不会增加1次迭代。因此,k+1始终是= 4。如何确保k相应地增加1?

编辑2

通过编写以下代码,我设法将1添加到k中:

代码语言:javascript
复制
n=nrow(dataset)
for(i in n){
x = 0
x[i] = k + 1
preds = dataset$`(Intercept)` + dataset$t*(x[i])
}

然而,第一种预测被高估了。它应该是203,而估计为228,这意味着它将解释变量设置为1太高。然而,第二个预测是正确的。我不知道我做错了什么。有什么建议吗?

编辑3

我设法找到了如下解决方案:

代码语言:javascript
复制
n=nrow(dataset)

for(i in n){
 x = k + 1
 preds = dataset$`(Intercept)` + dataset$t*(x)
 x = x + 1
 }
EN

回答 1

Stack Overflow用户

发布于 2017-06-25 12:30:24

您的循环没有迭代:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44745183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档