R - Ошибка: длина переменных различается (хотя я не понимаю, как они могут): - require(boot)

Я запускаю код для построения 10-кратных ошибок перекрестной проверки (это то, чему я научился на онлайн-курсе в Стэнфорде). Цель состоит в том, чтобы выяснить, какое из множества значений переменных (многочлен степеней от 1 до 5) лучше всего подходит для дальнейших прогнозов вне выборки.

Исходное кодирование:

require(ISLR)
require(boot)
cv.error10=rep(0,5)
for(d in degree){
  glm.fit=glm(mpg~poly(horsepower,d), data=Auto)
  cv.error10[d]=cv.glm(Auto,glm.fit,K=10)$delta[1]
}
plot(degree,cv.error10,type="b",col="red")

Это прекрасно работает. Теперь я пытаюсь сделать то же самое для своих данных (я запускаю отрицательный бином)

glm.fit2<-glm(abs_pb_t ~ RI1 + RA1 + pacl_to + abs_pb + pbf3 + pbf32 + pbs + pbc + suc_inc + cdval +  + cdval:RI1 + cdval:RA1 + pbf3:RI1 + pbf3:RA1 + pbf32:RI1 + pbf32:RA1 + Rfirm, data=p.data, family="quasipoisson") 
cv.error10=rep(0,5)
for(d in degree){
  glm.fit2=update(glm.fit2 , ~. +  poly(yy,d), data=p.data, na.action="na.exclude")
  cv.error10[d]=cv.glm(p.data,glm.fit2,K=10)$delta[1]
}

Я добавил исключение значений NA, потому что люди предлагали это в других вопросах SO (здесь , здесь и здесь).

Я получаю следующую ошибку:

Error in model.frame.default(formula = abs_pb_t ~ RI1 + RA1 + lnRnD +  : 
  variable lengths differ (found for 'poly(yy, d)')

В моей формуле обновления переменная yy — это числовая переменная, которая идеально подходит для моего data.frame (592 наблюдения).

yy<-rep(seq(1:16),times=37) ; poly(yy,1) ; poly(yy,5)

В соответствии с файлом справки по «поли» пропущенные значения не допускаются, поэтому я не понимаю, почему эта переменная внезапно (с использованием полинома) генерирует пропущенные значения. Я проверил это, и полином не создает переменные NA, поэтому что-то еще должно объяснять, почему я получаю эту ошибку.

Есть идеи?

заранее спасибо


person SJDS    schedule 22.04.2014    source источник
comment
na.exclude приводит к тому, что данные содержат меньше наблюдений. Я предлагаю вам подмножить остальные данные на complete.cases(yy), чтобы они были одинаковой длины.   -  person ilir    schedule 22.04.2014
comment
dim(complete.cases(p.data)) и length(poly(yy,d))... Я смущен, похоже, что poly(yy,d) - это список. Как вы можете просто добавить его в glm?   -  person Andrew Cassidy    schedule 22.04.2014
comment
Привет обоим, спасибо за ваши ответы. Я изначально не добавлял опцию na.exclude. Без него проблема та же. Если я добавлю предложение @ilir, я получу новую ошибку (индекс выходит за пределы). @ Эндрю, похоже, что poly(yy,d) — это список. Тем не менее, он имеет точно такую ​​же структуру, что и poly(hp,d), что не вызывает проблем, и что poly(yy,3) (или любое другое значение, кроме 3) можно использовать в регрессиях. Кажется, что фактически используются только значения матрицы в сгенерированном списке.   -  person SJDS    schedule 22.04.2014
comment
Индекс за пределами p.data[complete.cases(yy)] может быть только в том случае, если yy длиннее, чем p.data имеет строки. Убедитесь, что они одного размера.   -  person ilir    schedule 22.04.2014
comment
@ilir еще раз спасибо, что подумали со мной, но это не так. yy точно такой же размер в длине вектора. Столкнувшись с совершенно другой проблемой, я пришел к убеждению, что факт, что yy повторяется для всех фирм, на самом деле является причиной этой проблемы. Другими словами, yy изменяется только во времени, но не в разных фирмах (Rfirm). Я почти уверен, что это причина проблемы. Почему эта причина вызывает именно эту ошибку и как ее решить мне пока не ясно   -  person SJDS    schedule 23.04.2014