pred.lm после регрессии с отсутствующими данными в Y

Я не понимаю, как сгенерировать предсказанные значения из линейной регрессии с помощью команды predict.lm, когда какое-то значение зависимой переменной Y отсутствует, даже если отсутствует независимое наблюдение X. С алгебраической точки зрения это не проблема, но я не знаю эффективного метода сделать это на R. Возьмем, к примеру, этот поддельный фрейм данных и регрессионную модель. Я пытаюсь назначить прогнозы в исходном фрейме данных, но не могу сделать это из-за отсутствия одного значения Y: я получаю сообщение об ошибке.

# Create a fake dataframe
x <- c(1,2,3,4,5,6,7,8,9,10)
y <- c(100,200,300,400,NA,600,700,800,900,100)
df <- as.data.frame(cbind(x,y))

# Regress X and Y
model<-lm(y~x+1)
summary(model)

# Attempt to generate predictions in source dataframe but am unable to.
df$y_ip<-predict.lm(testy)

Error in `$<-.data.frame`(`*tmp*`, y_ip, value = c(221.............
  replacement has 9 rows, data has 10

Я решил эту проблему, создав прогнозы с использованием алгебры df$y<-B0+ B1*df$x или создав прогнозы путем вызова коэффициентов модели df$y<-((summary(model)$coefficients[1, 1]) + (summary(model)$coefficients[2, 1]*(df$x)); однако сейчас я работаю с моделью больших данных с сотнями коэффициентов, и эти методы больше не применимы. Я хотел бы знать, как это сделать с помощью функции predict.

Спасибо заранее за вашу помощь!


person Aron    schedule 03.07.2017    source источник
comment
первый аргумент предсказать; lm - это сама модель, а не новые данные   -  person agenis    schedule 03.07.2017
comment
попробуйте найти файл справки ?predict.lm там вы увидите, какие аргументы необходимы для запуска функции, а также пример.   -  person Biranjan    schedule 04.07.2017
comment
Привет, @aron, если какой-либо ответ решит вашу проблему, отметьте его как принятый, чтобы другие люди могли его увидеть   -  person agenis    schedule 05.09.2017
comment
Один из способов решить мою проблему - просто указать новый фрейм данных, используя мои значения x. Продолжая приведенный выше код, я мог бы сделать это: df $ y_ip ‹- предсказать (object = testy, newdata = data.frame (x = df $ x))   -  person Aron    schedule 02.10.2017


Ответы (2)


Для этого в R есть встроенная функция (но не обязательно очевидная): это na.action аргумент / ?na.exclude функция. Если этот параметр установлен, predict() (и аналогичные функции последующей обработки) автоматически заполнят NA значения в соответствующих местах.

Настроить данные:

df <- data.frame(x=1:10,y=100*(1:10))
df$y[5] <- NA

Подходящая модель: по умолчанию na.action - na.omit, что просто удаляет неполные случаи.

mod1 <- lm(y~x+1,data=df)
predict(mod1)
##    1    2    3    4    6    7    8    9   10 
##  100  200  300  400  600  700  800  900 1000 

na.exclude удаляет неполные варианты перед подгонкой, но затем восстанавливает их (заполненные NA) в предсказанных векторах:

mod2 <- update(mod1,na.action=na.exclude)
predict(mod2)
##    1    2    3    4    5    6    7    8    9   10 
##  100  200  300  400   NA  600  700  800  900 1000 
person Ben Bolker    schedule 03.07.2017
comment
Спасибо, Бен! Ваш код определенно более скуп, чем мой - person Aron; 02.10.2017

На самом деле вы неправильно используете функцию predict.lm. В любом случае вы должны ввести саму модель в качестве первого аргумента, таким образом model, с новыми данными или без них. Без новых данных он будет прогнозировать только данные обучения, таким образом исключая вашу строку NA, и вам понадобится этот обходной путь, чтобы соответствовать исходному data.frame:

df$y_ip[!is.na(df$y)] <- predict.lm(model)

Или явно указав какие-то новые данные. Поскольку новый x имеет на одну строку больше, чем обучающий x, он заполнит недостающую строку новым прогнозом:

df$y_ip <- predict.lm(model, newdata = df)
person agenis    schedule 03.07.2017