R语言鸢尾花数据集按类计算残差矩阵并绘制双变量残差图求助
你的代码存在3个核心问题
- 未按鸢尾花类别分组拟合:原始代码用整个鸢尾花数据集拟合回归模型,不符合「按每个类别分别计算」的需求
- 多响应回归结果提取错误:
lm拟合双响应变量(Petal.Length + Petal.Width)时,predict()和residuals()返回的是两列矩阵,直接赋值到数据框的单列会导致数据丢失/错位 - 绘图逻辑不符合需求:你需要绘制的是每个类别下两个响应变量残差的双变量散点图,原始代码绘制的是原始变量与预测值的对应关系,和需求完全不符
修正后的实现代码
首先加载依赖包:
library(tidyverse)
按类别分组拟合、提取残差:
# 按Species分组拟合双响应回归,提取残差和预测值 iris_res <- iris %>% group_by(Species) %>% group_modify(~ { # 对当前组拟合双响应回归 fit <- lm(cbind(Petal.Length, Petal.Width) ~ Sepal.Length + Sepal.Width, data = .x) # 提取残差(ng行2列),转置后就是你要的2*ng维残差矩阵 res_mat <- residuals(fit) # 残差矩阵可以单独输出,这里先合并到原始数据方便绘图 .x %>% mutate( res_Petal.Length = res_mat[, "Petal.Length"], res_Petal.Width = res_mat[, "Petal.Width"], pred_Petal.Length = predict(fit)[, "Petal.Length"], pred_Petal.Width = predict(fit)[, "Petal.Width"] ) }) %>% ungroup()
如果要单独提取每个类别的2*ng残差矩阵,可以用以下代码:
res_matrix_list <- iris_res %>% group_split(Species) %>% map(~ { mat <- t(select(.x, res_Petal.Length, res_Petal.Width)) rownames(mat) <- c("Petal.Length残差", "Petal.Width残差") mat }) # 查看第一类(山鸢尾)的残差矩阵维度 dim(res_matrix_list[[1]]) # 输出2 50,符合2*ng的要求
绘制每个类别的残差双变量图:
ggplot(iris_res, aes(x = res_Petal.Length, y = res_Petal.Width, color = Species)) + geom_point(size = 2, alpha = 0.7) + # 每个类别加拟合线观察残差分布规律 geom_smooth(method = "lm", se = FALSE, linetype = "dashed") + facet_wrap(~Species, scales = "free") + labs(x = "花瓣长度残差", y = "花瓣宽度残差", title = "各鸢尾花类别双变量残差图") + theme_bw()
内容的提问来源于stack exchange,提问作者Maxwell
相关产品推荐
相关产品推荐

