如何避免删除线性模型残差中的维度?
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
以获得您想要的。所以是的,如果你真的想要一个单列的残差矩阵,你自己做。
在 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
以获得您想要的。所以是的,如果你真的想要一个单列的残差矩阵,你自己做。