【问题标题】:Unnecessary Coefficients given in Linear Regression线性回归中给出的不必要系数
【发布时间】:2023-03-25 07:28:02
【问题描述】:

我有一个像这样的线性回归:

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#”都有两个系数,例如对于变量“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
...           

【问题讨论】:

  • 你能举一个你的数据的例子吗?
  • 特别是我们需要知道pos1pos2pos3 变量的级别(根据您的输出是因素)。 levels()table() 对于这些变量中的每一个都会有所帮助。很有可能您的数据中有空白或类似内容,这会导致 (1) 数据被作为因子而不是数字导入,(2) 因子中的额外水平会导致回归失败。
  • @lil_barnacle 我将我的数据示例添加到问题中
  • 正如@BenBolker 提到的,post1post2post3 有 3 个级别(0、1 和 2)。如果您只希望回归中的每个预测变量有 1 个系数,您可以使用 as.numeric() 将它们转换为数值或删除 1 个级别(例如,将 0 指定为 NA)。

标签: r linear-regression


【解决方案1】:

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

这看起来有点奇怪,因为您的变量以数字结尾,而您的因子水平也是数字。因此,pos11 = -25.853 的值实际上意味着对于“pos1”(变量“pos1”+ 值“1”=“pos11”)的观测值的估计平均值比具有值的观测值少约 25 个单位“0”代表“pos1”。您可以将事物的名称设为

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]
}

【讨论】:

  • 理想情况下,OP 应该返回并找出 为什么 他们的数据被读取为因素(并阻止它发生/让它们正确读取),而不是将列转换回来之后变为数字
  • 我认为根据上下文使用因子或有序因子是有意义的+1
  • @BenBolker 是的,如果这是故意的话。我猜想它们被正确编码为被视为分类的因素,因为它们确实只取三个不同的值。我已经添加了一些说明。我认为真正的问题只是可能令人困惑的名称。
猜你喜欢
  • 2021-08-20
  • 2020-08-26
  • 2016-05-29
  • 1970-01-01
  • 2018-10-02
  • 2021-12-28
  • 2020-06-10
  • 2012-06-27
  • 2016-10-25
相关资源
最近更新 更多