【问题标题】:How to update a dependent variable for -lm- in a loop if a condition is met如果满足条件,如何在循环中更新 -lm- 的因变量
【发布时间】:2019-08-28 20:05:07
【问题描述】:

我正在尝试运行回归并在虚拟/二元变量取值为 1 时运行它。我有一组 5 个虚拟变量并想要 5 个回归,它们都具有相同的因变量:Y|d1== 1 ~ x1 + x2,Y|d2==1 ~ x1 + x2。我有以下最小的工作示例:

set.seed(123)
df <- data.frame(
  x1 = rnorm(10, mean=0, sd=1),
  x2 = rnorm(10, mean=0, sd=1),
  Y = rnorm(10, mean=0, sd=1),
  d1 = sample(0:1, 10000, replace=T),
  d2 = sample(0:1, 10000, replace=T)
)

n <- 2
regList <- vector(mode = "list", length = n)
names(regList) <- c("first", "second")

for(i in seq_along(regList)){
  regList[[i]] <- lm(Y ~ x1 + x2, df)
}

我不确定如何“更新”因变量。我正在考虑使用:

form <- update(form, ...)

在 -lm- 部分之前的循环中,但不确定如何正确使用它。 我对此很陌生。任何事情都会有所帮助,我找不到足够相似的问题,如果我错过了,请告诉我。我在 -lm- 的开头只有“Y”,但很明显,这只是给了我 n 次相同的输出。不确定如何实现 if 函数或对其进行分层的方法。我想在数据框中使用相同的 Y,但前提是该特定虚拟变量包含 1,或者如果我可以使用原始字符串变量并在 X* 上回归 Y(如果 string=="name")。

【问题讨论】:

  • 我已经相应更新了,感谢您指出这一点。
  • 有一点要提一下,在我的真实数据集中,d1 和 d2 是互斥的——我不知道如何在我的工作示例中包含这个,因为我生成了随机虚拟变量

标签: r for-loop regression


【解决方案1】:

好吧,在这种情况下,您实际上不需要更改公式,您需要过滤传递给回归的数据。你可以做类似的事情

n <- 2
regList <- vector(mode = "list", length = n)    
for(i in seq_along(regList)){
  regList[[i]] <- lm(Y ~ x1 + x2, df[df[[paste0("d", i)]]==1, ])
}

在这里,我们将df 子集化为每个迭代中d1d2 为1 的行。

【讨论】:

  • 我收到一个错误:“lm.fit(x, y, offset = offset,singular.ok = single.ok ...) 中的错误:0(非 NA)案例”。我将更新我的代码,以便它更多地反映我的实际情况,因为我认为它现在可能略有不同
  • 啊,我明白了,我上面例子中的虚拟变量方便地是 d1 和 d2。在我的实际工作中,它们的名称与数字无关(它们有小麦、玉米、大米、大豆、油菜籽的名称)是否有一种解决方法,我可以创建一个列表并通过它运行它?但是是的,上面确实有效,我只是忘了清理我的环境。我会更新代码!
  • @Brennan 而不是 seq_along,只需使用列名向量。并使用 lapply 而不是循环,这样您就不必担心索引结果列表。
  • 我会调查一下,我对此很陌生,所以甚至不知道 lapply 是什么。我会接受答案,因为它适用于我给出的示例,非常感谢!
猜你喜欢
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 2021-09-30
  • 2021-08-22
相关资源
最近更新 更多