在R中同时运行多个带交互项的回归。

3

我有一个类似于以下结构的数据框(df):

yourbehavior  condition  tryreduce  comfortable  vegvalidity
1             2          4          3            3
2             5          7          4            5
3             7          1          2            4

我希望找到一种高效地运行以下回归的方法。

lm(yourbehavior ~ condition + tryreduce + (condition*tryreduce), data = df)
lm(yourbehavior ~ condition + comfortable + (condition*comfortable), data = df)
lm(yourbehavior ~ condition + vegvalidity + (condition*vegvalidity), data = df)

有人知道我该如何同时执行这些回归分析吗?我的实际数据集中比我在此示例中包含的要多。

我读过,在R中使用for循环通常不是进行这些类型分析最有效的方法。如果可能,我更喜欢使用tidyverse,因为那是我最理解的。

1个回答

4
你可以这样做,创建一个列表,其中每个元素都是回归模型之一,每个列表元素的名称将是与condition交互的变量名。
library(tidyverse)

interaction.vars = c("tryreduce", "comfortable", "vegvalidity")

form = paste("yourbehavior ~ condition *", interaction.vars)

models = form %>% 
  set_names(interaction.vars) %>% 
  map(~lm(.x, data=df))

如果您想遍历除前两列之外的每一列,可以执行以下操作:
interaction.vars = names(df)[!names(df) %in% c("yourbehavior","condition")]

请注意,在模型公式中,a*b等同于a + b + a*b,因此您不需要重复每个列名。
for循环并不一定是坏的,上面的map函数本质上是以与for循环相同的方式进行迭代。但是,R中的许多函数都是向量化的,比循环更快且更简洁。

在最后一行,使用lm(.x, data = df)时,我收到了一个错误消息,指出找不到对象.x。当我输入“form”而不是“.x”时,我会收到“错误:无法将'lm'对象转换为函数”的错误消息。 - melbez
1
抱歉,我编辑了我的答案,在 lm 之前添加了一个 ~。这是告诉 map 一个匿名函数即将到来是必要的。 map 正在迭代 form 的每个元素。 .x 告诉 map 在该函数(在此情况下为 lm)中映射的参数的位置。 - eipi10
什么是匿名函数?另外,我如何查看完整的输出?当我键入“models”或“summary(models)”时,输出与R中典型的回归输出不同,并且不包括P值,只有系数。 - melbez
1
models是一个lm对象的列表。要获取单个lm模型的完整摘要,您需要执行 summary(m1)(如果您的模型对象被称为m1)。在这里,您需要遍历模型列表,因此可以执行 map(models, summary) 来获取每个模型的摘要(摘要也将作为列表返回)。要获取特定模型的摘要,例如,您可以执行summary(models[[2]])summary(models[["comfortable"]]) - eipi10
1
“匿名函数”是一种在创建时没有命名的函数。请参阅此处“匿名函数”标题下的前几段以获取更多信息。 - eipi10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接