如何避免删除线性模型残差中的维度?

How to avoid dropping a dimension in linear model residuals?

在 R 中,lm(...)$residuals 如果传递矩阵响应 returns 具有与响应相同列名的矩阵,除非 矩阵只有一列,在这种情况下,它会下降到一个向量,因此不存在列名。例如:

nc <- 1
Y <- matrix(rnorm(4*nc), ncol = nc, dimnames = list(NULL, letters[1:nc]))
colnames(lm(Y~1)$residual) # returns NULL
nc <- 2
Y <- matrix(rnorm(4*nc), ncol = nc, dimnames = list(NULL, letters[1:nc]))
colnames(lm(Y~1)$residual) # returns c("a", "b")

是否有某种方法可以避免这种情况(类似于 drop=F)以便残差保留列名? (显然,一种方法是手动重新添加它们。)

很遗憾没有。

lm() 调用 lm.fit() 进行模型拟合,进一步调用 C 例程 dqrls (修改后的 LINPACK QR 分解,部分列旋转) .下面这行是lm.fit() / lm()的核心:

z <- .Call(C_Cdqrls, x, y, tol, FALSE)

残差在 z$residuals 中返回。现在,

  • 如果您的回答是多列矩阵,则这是一个矩阵;
  • 而如果您的回答是向量,甚至是单列矩阵,则这是一个向量。

之后,z通过拟合值等进行扩展,最终形成一个完整的lm对象。

无法更改内部 C 代码的行为,因此没有选项供您控制 lm 以获得您想要的。所以是的,如果你真的想要一个单列的残差矩阵,你自己做。