多因变量下线性与二次多项式模型的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
相关产品推荐
相关产品推荐

