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

时间:2015-12-17 19:28:20

标签: r lm

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

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)所以残差会保留列名? (显然,一种方法是再次手动添加它们。)

1 个答案:

答案 0 :(得分:1)

不幸的是没有。

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

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

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

  • 如果您的回复是一个包含多个列的矩阵,则这是一个矩阵;
  • 如果您的回答是矢量,或者甚至是单列矩阵,那么这是一个矢量。

稍后,使用例如拟合值展开z,最终形成一个完整的lm对象。

无法更改内部C代码的行为,因此您无法控制lm获取所需内容。所以,是的,如果你真的想要一个残留的单列矩阵,那就自己动手吧。