R语言predict函数返回全部拟合值而非单值的问题咨询
R语言lm预测返回所有拟合值而非单个预测值
问题情况
用lm()拟合线性模型后,预测单个数值时返回了训练数据的所有拟合值,复制课程代码、更换数据源均出现同样问题。期望输出为单个预测值(如手动计算的4.134015)。
错误代码及运行结果
错误代码:
DF1 <- read.table("linear.txt",header=T) model <- lm(DF1$Payment~DF1$Claim) newdata <-data.frame(Claim=4.5) predict(model,newdata)
运行结果:
> DF1 <- read.table("linear.txt",header=T) > DF1 Claim Payment 1 2.1 2.18 2 2.4 2.06 3 2.5 2.54 4 3.2 2.61 5 3.6 3.67 6 3.8 3.25 7 4.1 4.02 8 4.2 3.71 9 4.5 4.38 10 5.0 4.45 > model <- lm(DF1$Payment~DF1$Claim) > newdata <-data.frame(Claim=4.5) > predict(model,newdata) 1 2 3 4 5 6 2.016478 2.281170 2.369401 2.987016 3.339938 3.516400 7 8 9 10 3.781092 3.869323 4.134015 4.575168 Warning message: 'newdata' had 1 row but variables found have 10 rows
期望输出:
model$coefficients[1]+model$coefficients[2]*4.5 (Intercept) 4.134015
解决方法
修改lm()的调用方式,通过data参数关联数据框,让模型识别变量名:
DF1 <- read.table("linear.txt",header=T) # 使用data参数指定数据框,公式中直接写变量名 model <- lm(Payment~Claim, data = DF1) newdata <- data.frame(Claim=4.5) predict(model, newdata)
运行后会得到预期的单个预测值:
1 4.134015
原因说明
当使用lm(DF1$Payment~DF1$Claim)时,模型的公式接收的是独立向量,而非数据框中的变量名。predict()在newdata中找不到名为DF1$Claim的变量(newdata只有Claim),因此默认使用训练数据的自变量计算所有拟合值,同时抛出警告提示数据行数不匹配。
内容的提问来源于stack exchange,提问作者calcal
相关产品推荐
相关产品推荐

