如何通过虚拟变量 运行 for 循环到 运行 回归

How to run a for loop to run regressions by dummy variables

我有以下代码:

reg <- lm(Y ~ x1 + x1_sq + x2 + x2_sq + x1x2 + d2 + d3 + d4, df)

其中所有 x_i 都是连续变量,d_i 是互斥的虚拟变量(d1 存在但排除以避免完全多重共线性)。我不想包括虚拟变量,而是想 运行 为每个虚拟变量 == 1 单独回归。我希望通过以下形式的循环实现此目的:

dummylist <- list("d1", "d2", "d3", "d4")
for(i in dummylist){
   if(i==1){
      ireg <- lm(Y ~ x1 + x1_sq + x2 + x2_sq + x1x2, df)
   } else {
      Unsure what to put here
   }
}

我的三个(?)问题是:

  1. 在 -if- 函数的第一部分中,我是否只在 "reg" 之前包含 "i" 以便我的代码生成结果 "d1reg, d2reg, etc."?并且,
  2. 包含在上面的代码中,我应该在-else- 语句之后放什么?
  3. 这一切都在回避问题,是不是把if-else语句放在的-for-循环中是错误的approach/is有没有更合适的循环?

抱歉,如果这太多了,请告诉我是否太多,我可以将其缩减或分成多个问题。我找不到类似的问题,可能是因为我对 R 中的 运行ning 循环还很陌生,不知道要寻找什么。

  1. 在 -if- 函数的第一部分中,我是否只在 "reg" 之前包含 "i" 以便我的代码生成结果 "d1reg, d2reg, etc."?

短:

R 中有许多数据类型。比较通用的 once 之一是 list 对象,它可以存储任何类型的对象。或者,可以创建一个 environment 来存储列表,但这有点矫枉过正。

如果您大致知道列表中应该有多少元素,最简单的方法就是在循环之前将其初始化为

n <- 3
regList <- vector(mode = "list", length = n)
# Optional naming:
#names(regList) <- c("d1 reg", "d2 reg", "d3 reg")

然后在循环中迭代地填写列表:

for(i in seq_along(regList)){
   regList[[i]] <- lm(...)
}
  1. 我应该在 -else- 语句之后放什么?这一切都回避了问题,

不完全清楚你在这里想要什么。要么你想 'only' 包含单独的虚拟变量。为此,最简单的方法可能是保存您的 formula 并迭代更新它。

form <- Y ~ x1 + x1_sq + x2 + x2_sq + x1x2
for(i in seq_along(regList)){
   #paste0 combine strings. ". ~ . + d1" means take the formula and add the element d1 
   form <- update(form, as.formula(paste0(". ~ . + d", i)) 
   regList[[i]] <- lm(form, data = df)
}

或者您可能实际上正在尝试 运行 在 d[i] == 1 的子集上分离回归。这实际上可以用 lm 本身

来完成
form <- Y ~ x1 + x1_sq + x2 + x2_sq + x1x2
d <- list(d1, d2, d3)
for(i in seq_along(regList)){
   #Using the subset argument
   regList[[i]] <- lm(form, data = df, subset = which(d[[i]] == 1))
   #Alternatively:
   #regList[[i]] <- lm(form, data = subset(df, d[[i]] == 1))
}

免责声明: d1、d2、d3 是否是 df 的一部分尚不完全清楚。在这种情况下,下面的示例将起作用

   regList[[i]] <- with(df, lm(form, subset = which(d[[i]] == 1)))
  1. 将 if-else 语句放在 -for- 循环中是错误的 approach/is 有更合适的循环吗?

在这种情况下,这显然不是正确的方法。但这在所有情况下都不是错误的方法。在这里它只是没有明确的目的。并注意 i in dummylist 会 return "d1", "d2", "d3", "d4" 因为变量已经被引用,而不是直接放在列表中。

然而,另一件需要解决的问题是,在执行线性回归之前,您是否自己转换了变量。请注意,R 的内部函数允许您直接在 formula 中执行此操作,这样做可以帮助您避免伪错误,例如测试存在交互的变量,除非这正是您想要做的。例如,我假设 x1_sq = x1^2。也许d1, d2, d3都包含在一个变量d中?在这些情况下,您应该使用如下所示的原始变量:

lm(formula = Y ~ poly(x1, 2, raw = TRUE) + poly(x2, 2, raw = TRUE) + x1:x2, data = df ) #+d if d1, d2, d3 is part of the formula

poly 是二阶多项式,raw = TRUE return 将参数设为 x1 + I(x1^2) 而不是正交表示。

如果这样做,drop1anova 等的输出将考虑到不应将一阶变量测试为二阶交互。