2017-07-06 21 views
0

我想在没有拦截的情况下使用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) 

输出与截距项

+2

试试'lm(X1〜。+ 0,data = mat)'。 – nicola

回答

1

回归这取决于你所说的 “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的拦截。

+0

完美,谢谢你的接受和解决方案 –

+0

@r_master没问题,谢谢。你当然也可以写'。 + 0'而不是'。 - 1'在公式的右边,如果你愿意的话(我以前不知道)。我实际上认为'0 + .'给代码带来了更清晰的含义。 –