为何quantile函数在该dplyr代码中无法正常运行?
问题解决:预测值与数据集行数不匹配的错误
错误根源
你遇到的..1长度不匹配问题,核心原因是模型拟合和数据清理的顺序搞反了:
- 先用原始3154行的
wcgs数据集拟合了glm模型 - 之后用
na.omit()得到3140行的wcgsm,但直接调用predict()时,默认返回的是原始训练数据(3154行)的预测值,和当前wcgsm的3140行长度不匹配,导致分组操作时出错。
两种解决方案
方案1:先清理数据,再拟合模型(推荐)
先处理缺失值得到干净的数据集,再基于这个数据集建模,后续的预测、残差计算都会自动匹配行数:
# 加载库和数据 library(faraway) library(tidyverse) data(wcgs) # 先清理缺失值,得到3140行的数据集 wcgsm <- wcgs %>% mutate( y = factor(chd, levels = c("no", "yes")), bmi = weight/(height/100)^2 ) %>% na.omit() # 基于清理后的数据集拟合glm模型 model <- glm(y ~ bmi + age + smoke, data = wcgsm, family = binomial) # 添加残差、线性预测值、预测概率 wcgsm <- wcgsm %>% mutate( residuals = residuals(model), linpred = predict(model, type = "link"), predprob = predict(model, type = "response") ) # 现在可以正常执行分组操作 wcgsm %>% group_by(cut(predprob, quantile(predprob, seq(0,1,0.2)))) %>% summarize(n = n())
方案2:用原始模型对清理后的数据预测(如果必须保留原始模型)
如果已经基于原始数据拟合了模型,需要在predict()中指定newdata = wcgsm,明确告诉R要对清理后的数据集生成预测值:
# 加载库和数据 library(faraway) library(tidyverse) data(wcgs) # 原始流程:先处理变量、拟合模型 wcgs <- wcgs %>% mutate( y = factor(chd, levels = c("no", "yes")), bmi = weight/(height/100)^2 ) model <- glm(y ~ bmi + age + smoke, data = wcgs, family = binomial) # 清理缺失值得到wcgsm wcgsm <- wcgs %>% na.omit() %>% mutate( residuals = residuals(model, newdata = .), # 指定newdata为当前数据集 linpred = predict(model, type = "link", newdata = .), predprob = predict(model, type = "response", newdata = .) ) # 分组操作正常执行 wcgsm %>% group_by(cut(predprob, quantile(predprob, seq(0,1,0.2)))) %>% summarize(n = n())
关键注意点
- 残差计算也需要指定
newdata,否则同样会返回原始训练数据的残差(3154个),导致长度不匹配 - 确保
newdata中包含模型所有自变量,且没有缺失值(这里已经用na.omit()处理过,所以没问题)
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

