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

如何让R拟合多元线性回归的ANOVA输出与Minitab结果匹配

R中调整ANOVA输出匹配Minitab格式的实现方法

R基础anova()函数默认输出和Minitab的多元线性回归ANOVA输出差异主要来自两点:一是R默认输出Type I(序贯)平方和的变量拆分结果,Minitab默认先输出模型整体检验的ANOVA主表,单变量检验默认用Type III平方和;二是两者默认的行命名、列顺序、附属拟合统计量输出规则不一致。可以通过自定义函数提取统计量重组表格,实现格式完全匹配。

具体操作步骤

  • 安装并加载依赖包
    首次运行先执行安装命令,后续直接加载包即可:
    install.packages(c("dplyr", "knitr", "car"))
    library(dplyr)
    library(knitr)
    library(car)
    
  • 部署自定义格式输出函数
    直接运行以下代码,生成适配Minitab格式的ANOVA输出函数,统计量计算逻辑和Minitab完全对齐:
    anova_minitab <- function(lm_model, digits = 4, type = "overall") {
      # 整体模型ANOVA表逻辑(匹配Minitab默认首屏ANOVA)
      if (type == "overall") {
        anova_base <- anova(lm_model)
        ss_reg <- sum(anova_base$`Sum Sq`[-nrow(anova_base)])
        df_reg <- sum(anova_base$Df[-nrow(anova_base)])
        ms_reg <- ss_reg / df_reg
        ss_res <- anova_base$`Sum Sq`[nrow(anova_base)]
        df_res <- anova_base$Df[nrow(anova_base)]
        ms_res <- ss_res / df_res
        ss_total <- ss_reg + ss_res
        df_total <- df_reg + df_res
        f_val <- ms_reg / ms_res
        p_val <- pf(f_val, df_reg, df_res, lower.tail = FALSE)
        
        main_tbl <- data.frame(
          来源 = c("回归", "残差误差", "合计"),
          Df = c(df_reg, df_res, df_total),
          SS = c(ss_reg, ss_res, ss_total),
          MS = c(ms_reg, ms_res, NA),
          `F值` = c(f_val, NA, NA),
          `p值` = c(p_val, NA, NA)
        )
      }
      
      # 单变量检验逻辑(匹配Minitab的Type III平方和结果)
      if (type == "terms") {
        anova_3 <- car::Anova(lm_model, type = 3)
        main_tbl <- data.frame(
          来源 = c(rownames(anova_3)[-1], "残差误差", "合计"),
          Df = c(anova_3$Df[-1], anova_3$Df[nrow(anova_3)], sum(anova_3$Df)),
          SS = c(anova_3$`Sum Sq`[-1], anova_3$`Sum Sq`[nrow(anova_3)], sum(anova_3$`Sum Sq`)),
          MS = c(anova_3$`Sum Sq`[-1]/anova_3$Df[-1], anova_3$`Sum Sq`[nrow(anova_3)]/anova_3$Df[nrow(anova_3)], NA),
          `F值` = c(anova_3$`F value`[-1], NA, NA),
          `p值` = c(anova_3$`Pr(>F)`[-1], NA, NA)
        )
      }
      
      # 提取Minitab配套输出的拟合统计量
      ms_res <- sum(resid(lm_model)^2)/df.residual(lm_model)
      s_val <- sqrt(ms_res)
      r2 <- summary(lm_model)$r.squared
      r2_adj <- summary(lm_model)$adj.r.squared
      # 按Minitab逻辑计算预测R方
      press <- sum((resid(lm_model)/(1 - hatvalues(lm_model)))^2)
      r2_pred <- 1 - press/sum((lm_model$model[,1] - mean(lm_model$model[,1]))^2)
      fit_tbl <- data.frame(
        指标 = c("S", "R-sq", "R-sq(调整)", "R-sq(预测)"),
        值 = c(
          round(s_val, digits),
          paste0(round(r2*100, 2), "%"),
          paste0(round(r2_adj*100, 2), "%"),
          paste0(round(r2_pred*100, 2), "%")
        )
      )
      
      # 格式化打印
      cat("方差分析\n")
      print(kable(main_tbl, digits = digits, format = "simple", na = ""))
      cat("\n模型汇总\n")
      print(kable(fit_tbl, format = "simple"))
    }
    
  • 调用函数输出结果
    拟合线性模型后,直接传入模型对象即可,默认输出模型整体ANOVA表,和Minitab默认输出完全一致:
    # 拟合多元线性回归模型(替换成你自己的数据集和变量即可)
    lm_fit <- lm(因变量 ~ 自变量1 + 自变量2 + 自变量3, data = 你的数据集名)
    # 输出整体ANOVA(和Minitab默认首屏一致)
    anova_minitab(lm_fit)
    # 输出单变量Type III SS检验结果(和Minitab项检验结果一致)
    anova_minitab(lm_fit, type = "terms")
    

精度调整说明

如果输出数值的小数位和本地Minitab设置不一致,修改函数的digits参数即可,比如设置digits=3就会保留3位小数,和Minitab的默认精度对齐。如果需要更精细的排版(比如边框、列宽匹配),可以将kable替换为gt包的表格渲染函数,自定义样式。

内容的提问来源于stack exchange,提问作者Nadezhda Karkelanova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:06:21