将嵌套Logit预测结果转成长格式并编写通用处理函数
通用函数
make_plotdata实现方案 直接上可用的函数代码,基于tidyverse工具链实现,适配任意行数的newdata和任意数量的响应类别:
make_plotdata <- function(prob_matrix, se_matrix, newdata) { # 检查tidyverse是否安装 if (!requireNamespace("tidyverse", quietly = TRUE)) { stop("请先安装tidyverse包:install.packages('tidyverse')") } # 处理预测概率矩阵:转长格式+标记行号 prob_long <- prob_matrix %>% as.data.frame() %>% mutate(row_id = row_number()) %>% pivot_longer(-row_id, names_to = "response_category", values_to = "pred_prob") # 处理标准误矩阵:同概率矩阵的格式转换逻辑 se_long <- se_matrix %>% as.data.frame() %>% mutate(row_id = row_number()) %>% pivot_longer(-row_id, names_to = "response_category", values_to = "pred_se") # 合并概率与标准误数据(按行号+响应类别匹配) prob_se_combined <- inner_join(prob_long, se_long, by = c("row_id", "response_category")) # 复制newdata的每一行,次数等于响应类别数量 newdata_replicated <- newdata %>% mutate(row_id = row_number()) %>% slice(rep(row_number(), each = ncol(prob_matrix))) # 最终合并所有数据,清理临时行号 plot_data <- inner_join(newdata_replicated, prob_se_combined, by = "row_id") %>% select(-row_id) return(plot_data) }
函数逻辑说明
- 格式转换:把宽格式的概率/标准误矩阵转成长格式,用
row_id标记每个原始观测的位置,确保每个响应类别的数据能对应到正确的newdata行 - 数据复制:将newdata的每一行重复
响应类别数次,保证每个观测的所有响应类别都能关联到原始协变量 - 最终合并:把协变量、预测概率、标准误整合到同一个长格式数据框里,直接满足ggplot等绘图工具的输入要求
示例用法
# 模拟测试数据 set.seed(123) # 3个观测,4个响应类别的概率矩阵 pred_prob <- matrix(runif(12), nrow = 3, dimnames = list(NULL, c("A", "B", "C", "D"))) # 对应标准误矩阵 pred_se <- matrix(runif(12, 0.01, 0.1), nrow = 3, dimnames = list(NULL, c("A", "B", "C", "D"))) # 协变量数据框 new_data <- data.frame(x = c(1, 2, 3), group = factor(c("low", "medium", "high"))) # 生成绘图数据 plotdata <- make_plotdata(pred_prob, pred_se, new_data) # 查看结果 head(plotdata)
运行后得到的plotdata就是长格式,直接可以用来画误差棒图、分组折线图等。
内容的提问来源于stack exchange,提问作者user101089
相关产品推荐
相关产品推荐

