Прогнозирование с помощью lm

У меня есть следующий фрейм данных:

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 остатка, как показано для каждой модели, в остатке 1, остатке 2 и остатке 3. Среднее значение и sd из них включены соответственно.

Я пытаюсь предсказать следующее наблюдение, по сути, k+1, где k - длина окна, используя точку пересечения и бета.

Напомним, что 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
 }

person Community    schedule 25.06.2017    source источник
comment
Ваши циклы ничего не делают .... i устанавливается на n выполнение блока кода, а затем завершение. n должен быть вектором, если вы хотите выполнить итерацию. Кроме того, неясно, откуда взялся k.   -  person emilliman5    schedule 25.06.2017
comment
Я рассчитал прогнозы вручную, числа, полученные в этом цикле, верны. Первое редактирование переоценило второе предсказание, в то время как второе редактирование переоценило первое предсказание. Третья редакция правильно предсказала их обоих. Из третьего редактирования видно, что в конце цикла он добавляет приращение к x.   -  person    schedule 25.06.2017
comment
Кроме того, k - длина окна для скользящих регрессий, которые я использовал для извлечения коэффициентов и остатков. Вот почему я использую k наблюдений + 1 для оценки прогноза.   -  person    schedule 25.06.2017
comment
Почему-то сейчас это вроде не работает, что странно, ведь раньше это работало.   -  person    schedule 25.06.2017


Ответы (1)


Ваш цикл не повторяется:

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
person emilliman5    schedule 25.06.2017
comment
Спасибо, похоже, это может сработать. Однако мне удалось найти решение, сейчас обновлю, чтобы показать. - person ; 25.06.2017