使用R管道调用glm()后,如何用mutate()添加predict()结果列?
管道实现GLM预测结果与数据集合并
方案一:提前定义预测数据集,管道内合并结果
先单独构建用于预测的数据集,再通过管道完成模型训练、预测,最后将预测结果与数据集合并:
# 构建预测用数据集 pred_data <- data.frame( age = c(20,25,30,35,40), bmi = mean(diabetes$BMI), glucose = mean(diabetes$Glucose), pregnancies = mean(diabetes$Pregnancies) ) # 完整管道流程 diabetes %>% rename(dpf = DiabetesPedigreeFunction) %>% clean_names() %>% glm(outcome ~ bmi + glucose + pregnancies + age, data = ., family = binomial()) %>% predict(newdata = pred_data, type = "response") %>% tibble(prob = .) %>% # 将预测向量转为带列名的 tibble bind_cols(pred_data, .) # 合并预测数据集与结果列
方案二:全程管道内完成,无需提前定义数据集
通过大括号{}在管道中暂存中间数据(处理后的数据集与模型),全程在管道内完成预测数据集构建、预测与合并:
diabetes %>% rename(dpf = DiabetesPedigreeFunction) %>% clean_names() %>% # 暂存处理后的数据集与训练好的模型 { processed <- . list(model = glm(outcome ~ bmi + glucose + pregnancies + age, data = processed, family = binomial()), data = processed) } %>% # 构建预测数据集并添加预测列 { data.frame( age = c(20,25,30,35,40), bmi = mean(.$data$bmi), glucose = mean(.$data$glucose), pregnancies = mean(.$data$pregnancies) ) %>% mutate(prob = predict(.$model, newdata = ., type = "response")) }
关键说明
- 原代码中
glm返回的是模型对象,无法直接用mutate,因此需要将预测结果转为数据框格式,再与预测用的数据集合并; - 方案二使用了管道中的大括号语法,允许在管道内执行多步操作并暂存中间变量,避免依赖外部定义的数据集,更符合管道式编程的风格。
内容的提问来源于stack exchange,提问作者Humberto R
相关产品推荐
相关产品推荐

