【问题标题】:Run all possible interactions in GLM regression using R使用 R 在 GLM 回归中运行所有可能的交互
【发布时间】:2018-10-21 23:52:04
【问题描述】:

我有一个庞大的医疗保险索赔数据集,我想对其应用 GLM 回归。我有 4 个分类预测变量,特别是性别、年龄组、国籍和房间类型(VIP、普通等)。

我的基本 GLM 模型将包括截距项和这 4 个变量。我现在想介绍双向交互,但我不确定哪些交互对模型很重要,哪些不重要。为此,我想运行所有可能的交互组合以及 4 个基本预测变量,然后根据 AIC 或 BIC 或 R-square 等特定特征比较所有模型结果。

我想知道 R 中是否有一个函数或一种简单的方法来运行所有可能的交互并保存它们的 AIC/BIC/R-square,而不必为每个可能的模型写下 glm 函数。

要运行的模型的一些示例是:

 1. intercept + Gender + Age + Nationality + RoomType
 2. intercept + Gender + Age + Nationality + RoomType + gender*age
 3. intercept + Gender + Age + Nationality + RoomType + gender*nationality
 4. intercept + Gender + Age + Nationality + RoomType + gender*roomtype
 5. intercept + Gender + Age + Nationality + RoomType + age*nationality
 6. intercept + Gender + Age + Nationality + RoomType + age*roomtype
 7. intercept + Gender + Age + Nationality + RoomType + nationality*roomtype
 8. intercept + Gender + Age + Nationality + RoomType + gender*age + gender*nationality

等等。

【问题讨论】:

  • 如果你想要所有的交互,试试公式Resp ~ Gender * Age * Nationality * RoomType
  • 如果您希望所有交互顺序,我相信没有简单的功能可以为您做到这一点。我建议使用 combn(x,2) 然后 combn(x,3) ... 手动构建它,与 as.formula 或类似的一起使用。不过,这有点爆炸:想想G+A+N+R+G*AG+A+N+R+G*A+G*NG+A+N+R+G*A+G*R 等。你想要所有2路和2路排列,然后是3路和所有排列3 路和一些 2 路……你知道这怎么会变得一团糟吗?我认为这(以及一些教学原理)可能是为什么(还)不存在这样的功能。
  • 在这个计算机能力和机器学习普及的时代很容易假设,如果你只构建一个花哨的算法,让计算机在它上面运行几十亿个周期,任何问题都可以解决.可悲的是,世界没有那么简单。算法模型选择是一个非常诱人的想法,但它充满了坑。 Gung and others 在 CV 上对此进行了更详细的解释,但简而言之:“均值回归”、“过度拟合”和“多重比较问题”是您应该牢记的概念。

标签: r regression glm interaction


【解决方案1】:

让我们首先生成一些变量名的组合。

vars <- c("Gender", "Age", "Nationality", "RoomType")
comb.vars <- expand.grid(vars, vars, stringsAsFactors = FALSE)
comb.vars <- comb.vars[!(comb.vars[,1] == comb.vars[,2]),]

i.vars <- apply(comb.vars, 1, paste, collapse = "*")

然后,让我们将交互组合成一批详尽的组合(灵感here)。

combs.vars <- list(i.vars)
k <- length(i.vars) - 1
while(k > 1){
 combs <- t(combn(i.vars, k))
 combs.vars <- c(combs.vars, split(combs, seq(nrow(combs))))
 k <- k - 1
}

最后,让我们从组合中创建公式并在它们上运行 GLM。

res <- NULL

for(i in 1:length(combs.vars)){
 f <- formula(paste("response ~ Gender + Age + Nationality + RoomType +", 
                    paste(combs.vars[[i]], collapse = "+")))
 fit <- glm(f, data = input.data)
 res <- c(res, fit$call, AIC(fit))
}

res <- data.frame(matrix(res, ncol = 2, byrow = TRUE))

注意,responseinput.data 需要替换为相应响应变量名称的真实姓名,data.frame 需要替换为数据。

【讨论】:

  • 看起来不错,但这仅包括双向交互,对吧?
  • 是的。所有这些,加上所有双向交互的所有组合。 OP要求双向。要扩展到三向,请包含一个带有expand.grid(vars, vars, vars) 的类比额外部分。但是,正如@r2evans 所说,这种方法合理吗?
  • 从这个问题中并不清楚是否只需要两种方式,但我认为即使你在这里提供的内容也超出了合理范围。我的组合不是很强,所以我不知道有多少种可能的交互组合与 5 个变量,但我怀疑它相当多。
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 2020-04-26
  • 2014-06-20
相关资源
最近更新 更多