You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:57:17