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

多因变量下线性与二次多项式模型的AIC/BIC拟合比较及代码问题

问题解决:多因变量下线性与二次模型的比较及统计量提取

你的代码里models2其实已经正确保存了每个因变量对应的两个模型(mod1线性、mod2二次),后续用lapply(models2, summary)返回的是每个因变量对应的两个模型汇总结果,并非只保存mod2——你可以通过y[[1]]$mod1查看第一个因变量的线性模型汇总。

要在单个函数内完成模型拟合、比较并提取所需统计量,直接在lapply的匿名函数里完成所有操作即可,无需拆分两个函数。以下是修正后的完整代码:

data(iris)
vars <- names(iris[2:4])

# 遍历每个因变量,拟合模型并提取统计量
model_comparison <- lapply(vars, function(x) {
  # 拟合线性和二次模型
  mod1 <- lm(substitute(i ~ Sepal.Length, list(i = as.name(x))), data = iris)
  mod2 <- lm(substitute(i ~ poly(Sepal.Length, 2), list(i = as.name(x))), data = iris)
  
  # 计算AIC和BIC并合并
  aic_df <- AIC(mod1, mod2)
  bic_df <- BIC(mod1, mod2)
  info_df <- merge(aic_df, bic_df, by = "df", suffixes = c("_aic", "_bic"))
  
  # 计算对数似然
  log_lik <- sapply(list(mod1, mod2), logLik)
  
  # 计算anova结果并提取关键列
  anova_res <- anova(mod1, mod2, test = 'Chisq')
  anova_df <- as.data.frame(anova_res)[-1, c("F value", "Pr(>F)")]
  
  # 合并所有结果,添加模型名称
  result <- cbind(
    Model = c("Linear", "Quadratic"),
    info_df,
    logLik = log_lik,
    `F value` = c(NA, anova_df$`F value`),
    `Pr(>F)` = c(NA, anova_df$`Pr(>F)`)
  )
  
  rownames(result) <- NULL
  result
})

# 为结果列表命名(对应因变量)
names(model_comparison) <- vars

# 查看第一个因变量(Sepal.Width)的比较结果
model_comparison[["Sepal.Width"]]

代码说明:

  • 每个因变量的处理全流程都在同一个匿名函数内完成:从模型拟合,到AIC/BIC、对数似然、anova检验结果的计算与整合。
  • anova是模型间的显著性比较,因此只有二次模型对应有F值和P值(线性模型作为基准无对应值)。
  • 最终model_comparison是一个列表,每个元素对应一个因变量的模型比较结果数据框,方便后续批量处理或单独查看。

输出示例(以Sepal.Width为例):

Model df AIC_aic BIC_aic AIC_bic BIC_bic    logLik  F value   Pr(>F)
1     Linear  3 329.608 339.570 329.608 339.570 -161.8040       NA       NA
2 Quadratic  4 323.188 336.637 323.188 336.637 -157.5940 11.35903 0.000924

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:47:16