线性回归中给出的不必要系数

Unnecessary Coefficients given in Linear Regression

我有这样的线性回归:

lmGeneexp = lm(gene_expression ~ (pos1 + pos2 +  pos3), data = donor_snp_sample) 

summary(lmGeneexp)

当我运行这段代码时,结果是这样的:

Coefficients: (2 not defined because of singularities)
            Estimate Std. Error t value Pr(>|t|)
(Intercept)    5.708     64.905   0.088    0.930
pos11        -25.853    436.678  -0.059    0.953
pos12        -48.653    443.310  -0.110    0.913
pos21         25.960    416.159   0.062    0.950
pos22             NA         NA      NA       NA
pos31         24.269    117.284   0.207    0.836
pos32             NA         NA      NA       NA

我不明白为什么每个“pos#”都有2个系数,例如对于变量“pos1”,结果中有“pos11”和“pos12”。代码或我的数据有什么问题?

非常感谢

+++ 这是我的数据示例:

       pos1 pos2  pos3  gene_expression
row1    0    0     1          7.4
row2    0    0     2          8.5
row3    0    0     1          6.3
row4    1    0     2          3.5
row5    2    0     0          2.1
row6    1    0     0          7.4
...           

您的 pos1pos2 等变量似乎被编码为因子,因此它们在回归中被视为分类变量。在这种情况下,“0”值被视为每个变量的参考水平。与每个分类变量的参考水平相比,为每个其他水平估计不同的系数。这是分类变量的非常标准的参考水平编码。它们不是“不必要的”,因为它们指定了每个级别的效果。

看起来有点奇怪,因为你的变量以数字结尾,而且你的因子水平也是数字。因此,值 pos11 = -25.853 实际上意味着“pos1”(变量“pos1”+ 值“1”=“pos11”)的值为“1”的观测值的估计平均值比那些小于 ~25 个单位“pos1”的值“0”。您可以将名称的东西命名为

pos11 => pos1_1_vs_0
pos12 => pos1_2_vs_0
pos21 => pos2_1_vs_0
pos22 => pos2_2_vs_0
pos31 => pos3_1_vs_0
pos32 => pos3_2_vs_0

如果您不打算将这些值视为分类变量,请务必调查如何转换为因子。通常 R 会将数值作为数字读入。 lm 函数会自动将字符转换为因子,因此如果您希望值是数字,请确保它们不会作为字符读入。如果确实需要在回归之前将值转换为数值,则需要 be careful。这是一个可以正确进行转换的辅助函数。

factor_to_numeric <- function(x) {
  stopifnot(is.factor(x))
  as.numeric(levels(x))[x]
}