【问题标题】:R regression output incorrect referent?R回归输出不正确的参考?
【发布时间】:2019-04-08 19:28:34
【问题描述】:

我希望这个问题与之前的问题不同,而是用不同的词。我已经尝试使用以前问题的解决方案,但它们对我没有用,所以请耐心等待!

所以我在 R 中的线性回归模型输出遇到了一些问题。我担心模型使用了不正确的参照组作为我放入模型中的交互项的一部分,即使我'我试图在将各个术语放入交互术语之前重新调整它们的级别,但我没有得到预期的输出。

我有一个包含连续变量和分类变量的数据集。假设变量 A 和 B 是连续变量,变量 C、D 和 E 是分类变量(0 = 否,1 = 是)。分类变量的参照组已设置为“否”(0)。这是一个例子:

ID      A      B      C      D      E
1       53.6   25     No     Yes    No
2       51.1   12     Yes    No     Yes
3       50.9   NA     Yes    Yes    No
4       49.3   2      No     No     No
5       48.1   NA     No     Yes    No

我尝试了几种不同的方法来获取交互项,因此我的模型设置如下:

lm1 <- lm(A ~ C*D + E + B, data=example)
lm2 <- lm(A ~ C:D + E + B, data=example)

我希望得到一个输出表,其中列出了截距的回归系数、标准误差等,C 单独,D 单独,E,B,然后是 C * D,分解为 4 个可能的组合组中的 3 个该交互项,减去包含两个参照组的组合组(C 和 D 都为“No”,“C_No:D_No”)。

预期:

Coefficient   Estimate   Std. Error   t value   Pr(>|t|)   
Intercept     90.76369   0.54308      167.127   < 2e-16  ***
C_Yes         -0.28639   0.62044      -0.462    0.644465    
D_Yes         -3.01242   1.14733      -2.626    0.008771 **
E_Yes         0.05865    0.01691      3.468     0.000544 ***
B             -0.20891   0.35982      -0.581    0.561634
C_No:D_Yes    -0.42116   0.47213      2.617     0.01674  *
C_Yes:D_Yes   2.01208    1.43154      1.406     0.160148
C_Yes:D_No    -0.02877   0.65271      -0.345    0.672531 

对于第一个模型,我得到了截距的输出,单独的 C,单独的 D,E,B,然后只有 C * D 的一个组合组。

实际:

Coefficient   Estimate   Std. Error   t value   Pr(>|t|)   
Intercept     90.76369   0.54308      167.127   < 2e-16  ***
C_Yes         -0.28639   0.62044      -0.462    0.644465    
D_Yes         -3.01242   1.14733      -2.626    0.008771 **
E_Yes         0.05865    0.01691      3.468     0.000544 ***
B             -0.20891   0.35982      -0.581    0.561634
C_No:D_Yes    -0.42116   0.47213      2.617     0.01674  *

对于第二个模型,我得到了截距、E、B,然后是 C * D 的所有组合组的输出。

实际:

Coefficient   Estimate   Std. Error   t value   Pr(>|t|)   
Intercept     90.76369   0.54308      167.127   < 2e-16  ***
E_Yes         0.05865    0.01691      3.468     0.000544 ***
B             -0.20891   0.35982      -0.581    0.561634
C_No:D_Yes    -0.42116   0.47213      2.617     0.01674  *
C_Yes:D_Yes   NA  (all not defined because of singularities)
C_Yes:D_No    -0.02877   0.65271      -0.345    0.672531 

所以现在我的问题是:

1) 是否有不同的代码可以在一个模型而不是两个模型中提供我想要的一切?

2) 这个模型是否按原样使用 C_Yes:D_Yes 作为参照组而不是 C_No:D_No,这就是为什么我会收到关于奇点的错误?我的变量是相关的,是的,但并不完美,所以我没想到多重共线性会成为问题。

3) 如果参照组是正确的,为什么我会得到 C_No:D_No(参照组)的系数估计值?

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。with(example, table(C, D)) 返回什么?这些真的编码为 0/1 还是 Yes/No?你的输出与我期望从lm()看到的不符
  • OK @MrFlick,我尝试使用更多信息对其进行编辑,而不会从原始状态更改问题。为了回答您关于表格的问题,它显示了 C_No:D_No 类别中的 939 个、C_Yes:D_Yes 类别中的 70 个、C_Yes:D_No 类别中的 74 个以及 C_No:D_Yes 类别中的 20 个。很抱歉,我无法在这里直观地重现。所有分类变量都存储为带有标签的无序因子变量。

标签: r linear-regression


【解决方案1】:

由于存在共线性问题,您的预期输出无效。使用

lm(A ~ C * D + E + B)

给出什么是可能的。

如果 C=1,则令 C1=1,否则令 C1=0。也让C0 = 1-C1。 D 和 E 也是如此。然后估计我刚才提到的模型会给出一个包含 Intercept、B、C1、D1、E1、C1:D1 的输出。请注意,这些是 C1、D1、E1 而不是“C、D、E 单独”;后者本身会产生共线性。

我们不能添加,比如说,C1:D0,因为 C1:D0 + D1 = C1。同样,C0:D1 + C1 = D1,因此无法添加 C0:D1。 C0:D0 呢?我们有 C0:D0 = 1 - C1 - D1 + C1:D1,又是完美的共线性。

因此,您只能使用截距,无论是 C1 还是 C0(与 D 和 E 相同),以及要包括四个交互项中的哪一个。


跑步

lm(A ~ C:D + E + B)

经过一些重新排列后等效于以前的模型,除了这个模型强制尝试包含所有四个交互项。其中一个不被识别为四个之和总是等于1。


是的,在您的估计模型中,C_Yes:D_Yes 可以称为参考组。您没有描述您打算如何将C_No:D_No 分配为一个,但显然它不起作用;您需要确保 levels(C)c("Yes", "No") 而不是 c("No", "Yes")

【讨论】:

  • 好的,这是一个很好的解释,我想我明白你在说什么。这是否意味着我需要对 C1、C0 等单独的变量进行虚拟编码,而不是将它们保存在同一个变量 C 中?我来自 Stata 背景,我不记得必须这样做才能获得那里的交互组之间的对比。
  • @Caitlin,不,您不必创建单独的变量。我只是想明确一点,lm 并没有真正将 factor 变量添加到回归中;相反,它会创建这些假人并包括C1 和/或C0(假人),而不仅仅是C(因素)。
猜你喜欢
  • 2020-05-22
  • 1970-01-01
  • 2022-01-24
  • 2020-11-04
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
相关资源
最近更新 更多