R中含%>%的lm模型predict结果不一致的原因咨询
R中含管道符的lm模型predict结果不一致的原因
问题背景
基于模型 y = (中心化x) + (中心化x)²,我构建了两个看似一样的lm模型:
model1 = lm(y ~ scale(x, center=T, scale=F) + I( (scale(x, center=T, scale=F))^2 ), data=data) model2 = lm(y ~ (x %>% scale(center=T, scale=F)) + I( (x %>% scale(center=T, scale=F))^2 ), data=data)
两个模型跑出来的summary()结果完全一致,但用predict()计算x=42的置信区间时:
predict(model1, data.frame(x=42), interval="confidence", level=0.95) predict(model2, data.frame(x=42), interval="confidence", level=0.95)
得到的结果却不一样,想问是不是R对带%>%的公式处理方式有区别?
数据集用的是Kutner教材里的SENIC.txt,y是第11列,x是第12列。
原因解析
问题出在R对公式里管道符的解析逻辑上,直接用scale()和用%>%套scale(),在predict()阶段处理新数据的方式完全不同:
- 对于
model1:公式里的scale(x, center=T, scale=F)会被R识别为“基于训练集均值对x做中心化”,predict()时会自动拿训练集的mean(data$x)去给新输入的42做中心化,再代入模型计算。 - 对于
model2:用x %>% scale(center=T, scale=F)后,R会把这个表达式当成独立的函数调用,predict()时会单独对新输入的42做中心化——单个值的中心化结果就是0,这就导致代入模型的自变量和model1完全不同,最终预测结果自然有差异。
说白了,model1用的是训练集的全局均值做中心化,model2在预测时却给新数据单独做了中心化,这才是结果不同的根本原因,和管道符的解析机制直接相关。
内容的提问来源于stack exchange,提问作者iwsmtech
相关产品推荐
相关产品推荐

