在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
)所以残差会保留列名? (显然,一种方法是再次手动添加它们。)
答案 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
获取所需内容。所以,是的,如果你真的想要一个残留的单列矩阵,那就自己动手吧。