【问题标题】:How do I select two factors and perform regression如何选择两个因素并执行回归
【发布时间】:2020-07-30 07:17:17
【问题描述】:

我有一个这样的数据集:

library(tidyverse)
set.seed(123)
Data <- data.frame(
        X = sample(c("A", "B", "C"), 20, replace = TRUE),
    Y = sample(1:20)
)
Data%>%
    arrange(X)

我想运行一系列回归,使得 DV 为 Y,但每个回归的自变量是一次取两个的因子。例如,A&B、A&C、B&A、B&C 感谢您的帮助。

【问题讨论】:

  • 我不明白你想在这里适应什么类型的模型。您是否尝试对每个回归的数据进行子集化?最好包含一个适当的reproducible example 与样本输入(不包括“...”)和可用于测试和验证可能解决方案的所需输出。您是否期望 A&B 的结果与 B&A 不同?
  • 我已经编辑了一个可重现示例的问题。 A&B 可能与 B&A 没有什么不同,但我最终需要计数。感谢您的帮助。
  • 我仍然不明白“每个回归的自变量是一次取两个因素”的意思。 Y 旁边的唯一变量是 X。您想如何将 X 的值调整为变量?您想对每次迭代进行子集化和重塑吗?样本输入是可重现的,但仍不清楚您想要的输出是什么。您对此输入的期望值是多少?
  • 好的,首先我想运行一个回归,其中因子水平 A 和 B 是预测变量,对应的 Y 值是 DV,然后我想运行另一个回归,因子水平 A 和 C 作为预测变量以及它们对应的 Y 值如 DV 等。
  • 示例中的数据只有一个因子,具有 3 个级别 A、B、C。您是否需要在三个级别中的两个级别执行 Y 与 X 的回归,我的意思是对数据子集进行 3 次回归:数据 [ Data$X != 级别( Data$X )[ i ], ] 对于 i = 1、2 和 3?

标签: r loops lm


【解决方案1】:

对于线性回归:

> combos <- as.data.frame(x = combn(x = c("A", "B", "C"), m = 2))
names(combos) <- sapply(
  X = 1:3, 
  FUN = function(x){paste(combos[,x], collapse = "")}
)

> fit.list <- list()
> for (combo in names(combos)){
  fit.list[[combo]] <- subset(Data, X %in% combos[,combo]) %>% 
    lm(formula = .$Y ~ .$X, data = .)
}

> fit.list
$AB

Call:
lm(formula = .$Y ~ .$X, data = .)

Coefficients:
(Intercept)         .$XB  
       10.4          3.6  


$AC

Call:
lm(formula = .$Y ~ .$X, data = .)

Coefficients:
(Intercept)         .$XC  
       10.4         -2.9  


$BC

Call:
lm(formula = .$Y ~ .$X, data = .)

Coefficients:
(Intercept)         .$XC  
       14.0         -6.5 

编辑要添加协变量(例如 Z),一种方法是在 data.frame 中添加为新列,然后将列名称添加到模型中:

> set.seed(123)
> Data <- data.frame(
  X = sample(c("A", "B", "C"), 20, replace = TRUE),
  Y = sample(1:20),
  Z = sample(1:20)
)

> fit.list <- list()
> for (combo in names(combos)){
  fit.list[[combo]] <- subset(Data, X %in% combos[,combo]) %>% 
    lm(formula = .$Y ~ .$X + .$Z, data = .)
}
> fit.list
$AB

Call:
lm(formula = .$Y ~ .$X + .$Z, data = .)

Coefficients:
(Intercept)         .$XB          .$Z  
     3.6697       3.1921       0.5099  


$AC

Call:
lm(formula = .$Y ~ .$X + .$Z, data = .)

Coefficients:
(Intercept)         .$XC          .$Z  
     7.9306      -1.5063       0.1871  


$BC

Call:
lm(formula = .$Y ~ .$X + .$Z, data = .)

Coefficients:
(Intercept)         .$XC          .$Z  
   14.89888     -7.02970     -0.06421 

【讨论】:

  • 谢谢,这行得通。如果我要在模型中添加一些协变量,例如 X1=sample(1:20),您将如何修改代码?
  • 太棒了!我编辑了我的答案以包含一个协变量(例如 Z)。
  • 非常感谢。知道为什么输出没有显示 p 值吗?
  • 可以使用summary()函数获取每个fit的统计信息。 summary(fit.list$AB)
猜你喜欢
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多