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

如何在R中使用relaimpo包按组计算变量相对重要性?

按分组计算变量相对重要性的实现方法

你遇到的问题是直接用group_by(cyl)后,lm()和calc.relimp()不会自动按分组执行计算。要实现按组计算,需要用分组迭代函数对每个分组单独拟合模型并计算相对重要性,以下是两种可行方案:

方案一:使用dplyr + purrr(推荐,代码更整洁)

通过group_modify()函数对每个分组执行自定义计算逻辑,自动保留分组标识:

library(relaimpo)
library(dplyr)
library(purrr)

# 按cyl分组计算相对重要性
group_rel_imp <- mtcars %>%
  group_by(cyl) %>%
  group_modify(function(sub_data, group_info) {
    # 对当前分组拟合线性模型
    model <- lm(mpg ~ disp + hp + drat + wt, data = sub_data)
    # 计算lmg类型的相对重要性
    rel_imp_result <- calc.relimp(model, type = "lmg", rela = TRUE)
    # 整理结果为结构化数据框
    tibble(
      变量名 = names(rel_imp_result$lmg),
      lmg相对重要性 = rel_imp_result$lmg,
      占比百分比 = rel_imp_result$lmg * 100
    )
  })

# 查看最终结果
print(group_rel_imp)

方案二:使用Base R(无需额外加载dplyr/purrr)

通过split()拆分数据,再用lapply()遍历每个分组计算,最后合并结果:

library(relaimpo)

# 按cyl将数据集拆分为列表(每个元素对应一个分组)
split_mtcars <- split(mtcars, mtcars$cyl)

# 遍历每个分组计算相对重要性
rel_imp_list <- lapply(split_mtcars, function(sub_data) {
  model <- lm(mpg ~ disp + hp + drat + wt, data = sub_data)
  rel_imp_result <- calc.relimp(model, type = "lmg", rela = TRUE)
  # 整理结果
  data.frame(
    变量名 = names(rel_imp_result$lmg),
    lmg相对重要性 = rel_imp_result$lmg,
    占比百分比 = rel_imp_result$lmg * 100,
    stringsAsFactors = FALSE
  )
})

# 为每个分组结果添加cyl标识并合并为一个数据框
final_result <- do.call(rbind, Map(function(df, cyl_val) {
  df$cyl <- as.integer(cyl_val)
  df
}, rel_imp_list, names(rel_imp_list)))

# 查看结果
print(final_result)

关键说明

直接使用group_by(cyl)只是给数据集标记分组属性,lm()和calc.relimp()并不会识别这个属性自动分组计算。必须借助group_modify()(dplyr)或lapply()(Base R)这类迭代函数,对每个分组单独执行完整的建模和计算流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:01:06