我的数据框未知列数,每列都有不同的特定名称。我想在第一列和其他列之间进行线性回归,不使用列名。锄我能做到吗?
例如,mtcars的数据集
fit1 <- lm(mtcars$mpg ~ ., mtcars)
但我想使用mtcars $ mpg
感谢您的帮助!
答案 0 :(得分:0)
查看来源可能会令人生畏,但信息量很大。在完成所有lm
和其他按摩后解析model.matrix
后,您会看到它调用lm.fit
。如果你看一下帮助,在注意 除非经验丰富的用户 之后通常不会直接使用 ,你可以通过调试它看看是怎么回事lm
正在调用lm.fit
。
debugonce(lm.fit)
lm(mtcars$mpg ~ mtcars$cyl, mtcars)
# debugging in: lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...)
# Browse[2]>
head(x)
# (Intercept) mtcars$cyl
# Mazda RX4 1 6
# Mazda RX4 Wag 1 6
# Datsun 710 1 4
# Hornet 4 Drive 1 6
# Hornet Sportabout 1 8
# Valiant 1 6
# Browse[2]>
head(y)
# Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive
# 21.0 21.0 22.8 21.4
# Hornet Sportabout Valiant
# 18.7 18.1
# Browse[2]>
c
# Call:
# lm(formula = mtcars$mpg ~ mtcars$cyl, data = mtcars)
# Coefficients:
# (Intercept) mtcars$cyl
# 37.885 -2.876
由此看来,y
只是响应变量(mtcars$mpg
)的向量,而x
是一个矩阵,其中包含所有解释变量和一个前导列,截距。 (我将把它留作读者添加其他列的练习。)
直接调用它可能如下所示:
mod <- lm.fit(cbind(Intercept = 1, mtcars$cyl), mtcars$mpg)
str(mod)
# List of 8
# $ coefficients : Named num [1:2] 37.88 -2.88
# ..- attr(*, "names")= chr [1:2] "Intercept" ""
# $ residuals : num [1:32] 0.37 0.37 -3.58 0.77 3.82 ...
# $ effects : Named num [1:32] -113.65 -28.6 -3.7 0.71 3.82 ...
# ..- attr(*, "names")= chr [1:32] "Intercept" "" "" "" ...
# $ rank : int 2
# $ fitted.values: num [1:32] 20.6 20.6 26.4 20.6 14.9 ...
# $ assign : NULL
# $ qr :List of 5
# ..$ qr : num [1:32, 1:2] -5.657 0.177 0.177 0.177 0.177 ...
# .. ..- attr(*, "dimnames")=List of 2
# .. .. ..$ : NULL
# .. .. ..$ : chr [1:2] "Intercept" ""
# ..$ qraux: num [1:2] 1.18 1.02
# ..$ pivot: int [1:2] 1 2
# ..$ tol : num 1e-07
# ..$ rank : int 2
# ..- attr(*, "class")= chr "qr"
# $ df.residual : int 30
一个区别是lm()
的输出属于"lm"
类,而lm.fit
的输出是"list"
。再次,查看lm
的来源,您可以看到它从lm.fit
获取输出并将类和其他一些属性应用于列表。 (这些属性通常用于美学,如summary
,但也可能由其他辅助函数使用。)
只需指定一个类就可以改进它的控制台打印,但是你需要进行测试,看看你的后续计算/分析是否需要应用这些属性和类。
class(mod) <- "lm"
mod
# Call:
# NULL
# Coefficients:
# Intercept
# 37.885 -2.876
警告Emptor:lm
中有几个正在被完全绕过的清洁和按摩步骤。通过使用此功能,您将删除用户期望的包装函数的“安全性”。