【问题标题】:Numerous multiple regressions, changing one variable each time多次回归,每次改变一个变量
【发布时间】:2019-01-09 00:10:12
【问题描述】:

我有用于运行多元回归的基本 R 代码:

适合 cold ~ breed + gender + 237, data=rweights)

但是,我想多次运行此代码,每次稍作调整。上面写着“237”(列标题),可以是 1 到 1000 之间的任何数字(也是列标题),我想对每一列运行多元回归。所以我希望它运行相当于:

适合 var1 ~ var2 + var3 + 1, data=rweights)

适合 var1 ~ var2 + var3 + 2, data=rweights)

....

适合 var1 ~ var2 + var3 + 1000, data=rweights)

然后我打算分析这些多重回归的结果,因此理想情况下会有一个很好的输出来整理所有内容,但我很感激这可能是另一个问题!任何建议将不胜感激。

【问题讨论】:

  • 您的列名只是数字?我不认为这些是有效的名字。你的意思是他们有X237的形式?
  • 它们只是数字,但在我给出的示例代码中它工作正常,只要我在它们周围加上一个`。不确定这是否是一个更大的问题?
  • 也许不会,但我怀疑反引号会不断出现。如果您对此感到满意,那也没关系。
  • 我希望这只是一件快速的事情(尽管事实证明它比我想象的要复杂得多),但我一定会记住它以备不时之需 - 谢谢。

标签: r


【解决方案1】:

下面是一些可以帮助您入门的示例代码:

### Generate fake data
n = 1000
var1 = rnorm(n)
var2 = rnorm(n)
var3 = rnorm(n)
k = 10
dat = data.frame(var1, var2, var3, matrix(runif(n*k), n, k))

### Object where all the fitted models are stored
mods = rep(list(NULL), k)

### Loop through the different models
for (i in 1:k){
    form = paste0("var1 ~ var2 + var3 + X", i)
    mods[[i]] = lm(as.formula(form), data = dat)
    }

### Examples
summary(mods[[1]])
summary(mods[[2]])

正如 Tom Haddow 在 cmets 中所建议的,您可以概括这一点的一种方法是使用 colnames

mods = rep(list(NULL), k)

# Get column names, remove the ones you don't want to loop through
varlist = colnames(dat)[-(1:3)]

for (i in 1:k){
    form = paste0("var1 ~ var2 + var3 + ", varlist[i])
    mods[[i]] = lm(as.formula(form), data = dat)
    }
summary(mod[[1]])

甚至

mods = rep(list(NULL), k)
varlist = colnames(dat)[-(1:3)]

for (v in varlist){
    form = paste0("var1 ~ var2 + var3 + ", v)
    mods[[v]] = lm(as.formula(form), data = dat)
    }
summary(mods$X1)

唯一的区别是您将如何访问mods 中的元素。

【讨论】:

  • 感谢您的帮助,我运行了您的假人,它有效,并试图将原理转移到我自己的数据中。不能说我运气很好。我认为我的问题是知道我应该用自己的脚本替换脚本的哪些部分。我想我可以忽略整个顶级公园来生成虚假数据......?如果是这样,那么 'k' 将无法继续工作,我也不知道 k 似乎是为了什么。我需要提高我的 R 技能。
  • k 与您的 1000 列相当,我只是使用了较小的数字。所以你可以试试k=1000 或更一般的k=NCOL(rweight)(可能减去额外的列。
  • 问题中提到有一些变量作为名称给出。创建一个变量列表来循环而不是使用循环粘贴数字是一个想法吗?类似于varlist <- as.character(1:1000)varlist <- paste0("X",varlist)varlist <- c("foo", "bar", varlist),然后将你的for循环更改为for (i in varlist){
  • 感谢@TomHaddow,我根据您的想法编辑了答案以包含更通用的方法。
  • 感谢大家的帮助。今天不得不放弃,明天再决定是否继续尝试。诚然,它比我想象的要复杂得多。
猜你喜欢
  • 1970-01-01
  • 2015-01-01
  • 2017-10-11
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 2019-03-09
相关资源
最近更新 更多