【问题标题】:Regressing over a data frame matrix without intercept using lm使用 lm 在不截取的情况下对数据帧矩阵进行回归
【发布时间】:2017-07-06 17:50:04
【问题描述】:

我想在没有截距的情况下使用 lm 对数据帧矩阵进行回归。如果您的矩阵存储为数据框,您可以简单地调用 lm(matrix) 并且第一列被假定为因变量,而其余列被视为自变量,回归包括截距。我的问题是:如果我想在不包括拦截的情况下回归,我该如何有效地做同样的事情?

最小的工作示例:

mat <- matrix(c(2, 4, 3, 1, 5, 7, 3, 5, 30), nrow=3, ncol=3)
mat <- data.frame(mat)
lm(mat)

输出带有截距项的回归

【问题讨论】:

  • 试试lm(X1 ~ . + 0,data=mat)

标签: r


【解决方案1】:

这取决于您所说的“有效”。

如果您的意思是语法简短/高效,那么我认为最优雅的方法是直接提供公式,就像 @nicola 在 cmets (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 + .给了代码更清晰的含义。
猜你喜欢
  • 1970-01-01
  • 2022-07-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 2023-03-03
  • 2014-05-01
相关资源
最近更新 更多