我想在没有拦截的情况下使用lm对数据帧矩阵进行回归。如果矩阵以数据框形式存储,则可以简单地调用lm(矩阵),第一列被假定为因变量,其余为自变量,回归包括截距。我的问题是:如果我想在不包括拦截的情况下倒退,我该如何有效地做到这一点?使用lm对数据帧矩阵进行无截取的回归
最小工作示例:
mat <- matrix(c(2, 4, 3, 1, 5, 7, 3, 5, 30), nrow=3, ncol=3)
mat <- data.frame(mat)
lm(mat)
输出与截距项
我想在没有拦截的情况下使用lm对数据帧矩阵进行回归。如果矩阵以数据框形式存储,则可以简单地调用lm(矩阵),第一列被假定为因变量,其余为自变量,回归包括截距。我的问题是:如果我想在不包括拦截的情况下倒退,我该如何有效地做到这一点?使用lm对数据帧矩阵进行无截取的回归
最小工作示例:
mat <- matrix(c(2, 4, 3, 1, 5, 7, 3, 5, 30), nrow=3, ncol=3)
mat <- data.frame(mat)
lm(mat)
输出与截距项
回归这取决于你所说的 “efficent” 的意思。
如果你的意思是在句法上简短/高效,那么我认为最优雅的方式是直接提供公式@nicola在评论中显示(lm(X1 ~ . + 0, data = mat)
)。
如果你的意思是以编程方式删除拦截(我猜是编程高效),那么下面的代码就可以做到这一点。
mat <- matrix(c(2, 4, 3, 1, 5, 7, 3, 5, 30), nrow=3, ncol=3)
mat <- data.frame(mat)
lm(update(as.formula(mat), . ~ . - 1), data = mat)
#
#Call:
#lm(formula = update(as.formula(mat), . ~ . - 1), data = mat)
#
#Coefficients:
# X2 X3
# 0.9364 -0.1144
注意,当你调用lm(mat)
,lm
将试着将其转换mat
一个公式对象(试运行as.formula(mat)
),并用该公式。正如您所看到的(并且已经注意到),这会自动选择第一列作为因变量,其余为解释变量。我们现在需要做的是更新该公式,以便不包括使用update
的拦截。
完美,谢谢你的接受和解决方案 –
@r_master没问题,谢谢。你当然也可以写'。 + 0'而不是'。 - 1'在公式的右边,如果你愿意的话(我以前不知道)。我实际上认为'0 + .'给代码带来了更清晰的含义。 –
试试'lm(X1〜。+ 0,data = mat)'。 – nicola