使用带有缺失数据的Y进行回归后,如何使用predict.lm进行预测

4

我不明白如何使用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函数进行预测。

非常感谢您的帮助!


predict函数的第一个参数是模型本身,而不是新数据。 - agenis
尝试查找帮助文件?predict.lm,您将看到运行函数所需的必要参数以及示例。 - Biranjan
嗨,@aron如果有任何答案解决了您的问题,请将其标记为“已接受”,以便其他人可以看到。 - agenis
解决我的问题的一种方法是使用我的x值指定一个新的数据框架。继续上面的代码,我可以这样做:df $ y_ip <- predict(object = testy,newdata = data.frame(x = df $ x)) - Aron
2个回答

6
在R中有内置的功能来处理此类问题(但并不显而易见):这是通过na.action参数/?na.exclude函数来实现的。设置此选项后,predict()(以及类似的下游处理函数)将自动填充相关位置上的NA值。
设置数据:
df <- data.frame(x=1:10,y=100*(1:10))
df$y[5] <- NA

适合的模型:默认的na.actionna.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 

谢谢Ben!你的代码绝对比我的更简洁。 - Aron

2
实际上,您没有正确使用predict.lm函数。无论如何,您都必须将模型本身作为其第一个参数输入,即model,无论是否有新数据。如果没有新数据,则仅对训练数据进行预测,因此不包括您的NA行,您需要这个解决方法来适配初始数据框。
df$y_ip[!is.na(df$y)] <- predict.lm(model)

或者明确指定一些新数据。由于新的x比训练x多一行,它将用一个新的预测值来填充缺失的行:

df$y_ip <- predict.lm(model, newdata = df)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接