如何通过虚拟变量 运行 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
}
}
我的三个(?)问题是:
- 在 -if- 函数的第一部分中,我是否只在 "reg" 之前包含 "i" 以便我的代码生成结果 "d1reg, d2reg, etc."?并且,
- 包含在上面的代码中,我应该在-else- 语句之后放什么?
- 这一切都在回避问题,是不是把if-else语句放在的-for-循环中是错误的approach/is有没有更合适的循环?
抱歉,如果这太多了,请告诉我是否太多,我可以将其缩减或分成多个问题。我找不到类似的问题,可能是因为我对 R 中的 运行ning 循环还很陌生,不知道要寻找什么。
- 在 -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(...)
}
- 我应该在 -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)))
- 将 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)
而不是正交表示。
如果这样做,drop1
、anova
等的输出将考虑到不应将一阶变量测试为二阶交互。
我有以下代码:
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
}
}
我的三个(?)问题是:
- 在 -if- 函数的第一部分中,我是否只在 "reg" 之前包含 "i" 以便我的代码生成结果 "d1reg, d2reg, etc."?并且,
- 包含在上面的代码中,我应该在-else- 语句之后放什么?
- 这一切都在回避问题,是不是把if-else语句放在的-for-循环中是错误的approach/is有没有更合适的循环?
抱歉,如果这太多了,请告诉我是否太多,我可以将其缩减或分成多个问题。我找不到类似的问题,可能是因为我对 R 中的 运行ning 循环还很陌生,不知道要寻找什么。
- 在 -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(...)
}
- 我应该在 -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)))
- 将 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)
而不是正交表示。
如果这样做,drop1
、anova
等的输出将考虑到不应将一阶变量测试为二阶交互。