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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:36:03