R中的线性回归,没有列

时间:2017-03-24 16:43:13

标签: r linear-regression lm

我的数据框未知列数,每列都有不同的特定名称。我想在第一列和其他列之间进行线性回归,不使用列名。锄我能做到吗?

例如,mtcars的数据集

fit1 <- lm(mtcars$mpg ~ ., mtcars)

但我想使用mtcars $ mpg

感谢您的帮助!

1 个答案:

答案 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中有几个正在被完全绕过的清洁和按摩步骤。通过使用此功能,您将删除用户期望的包装函数的“安全性”。