使用lm的R中的线性回归:函数中的不同摘要输出

时间:2014-12-14 22:38:21

标签: r linear-regression lm

使用lm函数关于R中线性回归的简短问题。我注意到当使用summary命令作为函数的一部分时,输出是不同的。

当我进入时:

model1 <- lm (PostVal_Ave ~ Int)
summary(model1)

在控制台中返回以下内容:

Call:
lm(formula = PostVal_Ave ~ Int)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.9871 -0.8897  0.4853  1.0129  1.5129 

Coefficients:
        Estimate Std. Error t value Pr(>|t|)
(Intercept)   5.4871     0.1426  38.491   <2e-16
Int           0.2776     0.1988   1.396    0.164

(Intercept) ***
Int            
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.322 on 175 degrees of freedom
(35 observations deleted due to missingness)
Multiple R-squared:  0.01102,   Adjusted R-squared:  0.005366 
F-statistic: 1.949 on 1 and 175 DF,  p-value: 0.1644

但是,在编写函数以便能够为多个模型生成输出并且能够为多个因变量生成结果时,我输入:

allModels <- function(x){
    model2 <- lm (x ~ Int)
    model2.1 <- lm (x ~ Int + cPreEff)
    model2.2 <- lm (x ~ Int + cPreEff + Gender + Grade)
    return(c(summary(model1), summary(model1.1), summary(model1.2)))}

与模型1的输出相比,我获得了相同的输出,但是这三个模型(model2,model2.1和model2.2)有很多额外的输出。具体而言,输出包含三个模型中每个模型的每种情况的残差和关于每个具有缺失数据的情况的信息。建议将不胜感激。感谢。

2 个答案:

答案 0 :(得分:2)

请注意lm()返回类&#34; lm&#34;的对象。并且该对象上的summary()生成一个&#34; summary.lm&#34;宾语。有自定义print.lm()print.summary.lm()个对象。因此,打印到控制台的内容可能与对象本身的内容不同。

当您手动连接(c())两个summary.lm对象时,您将创建一个聚合列表并丢失正确的类。您可能希望返回对象列表

return(list(summary(model1), summary(model1.1), summary(model1.2)))

答案 1 :(得分:2)

另一种方法是使用David Robinson的broom package,它会将拟合输出转换为数据帧。有关拟合(无系数)的摘要,请使用glance

library(broom)

fitIris <- function() {
  fit1 <- glance(lm(Sepal.Length ~ Species, data = iris))
  fit2 <- glance(lm(Petal.Length ~ Species, data = iris))
  fit3 <- glance(lm(Sepal.Width ~ Species, data = iris))
  out <- rbind(fit1, fit2, fit3)
  cbind(Fit = c("fit1", "fit2", "fit3"), out)
}

fitIris()

#    Fit r.squared adj.r.squared     sigma  statistic      p.value df    logLik      AIC      BIC deviance df.residual
# 1 fit1 0.6187057     0.6135181 0.5147894  119.26450 1.669669e-31  3 -111.7260 231.4520 243.4945  38.9562         147
# 2 fit2 0.9413717     0.9405741 0.4303345 1180.16118 2.856777e-91  3  -84.8467 177.6934 189.7359  27.2226         147
# 3 fit3 0.4007828     0.3926302 0.3396877   49.16004 4.492017e-17  3  -49.3663 106.7326 118.7751  16.9620         147

有关拟合的更多信息,您应该使用tidy,但行数会有所不同,并且应该仔细创建结束data.frame。

fitIris2 <- function() {
  fit1 <- tidy(lm(Sepal.Length ~ Species, data = iris))
  fit2 <- tidy(lm(Petal.Length ~ Species, data = iris))
  fit3 <- tidy(lm(Sepal.Width  ~ Species, data = iris))
  out <- rbind(fit1, fit2, fit3)
  cbind(Fit = rep(c("fit1", "fit2", "fit3"), each=3), out)
}

fitIris2()

#    Fit              term estimate  std.error statistic       p.value
# 1 fit1       (Intercept)    5.006 0.07280222 68.761639 1.134286e-113
# 2 fit1 Speciesversicolor    0.930 0.10295789  9.032819  8.770194e-16
# 3 fit1  Speciesvirginica    1.582 0.10295789 15.365506  2.214821e-32
# 4 fit2       (Intercept)    1.462 0.06085848 24.022945  9.303052e-53
# 5 fit2 Speciesversicolor    2.798 0.08606689 32.509597  5.254587e-69
# 6 fit2  Speciesvirginica    4.090 0.08606689 47.521176  4.106139e-91
# 7 fit3       (Intercept)    3.428 0.04803910 71.358540 5.707614e-116
# 8 fit3 Speciesversicolor   -0.658 0.06793755 -9.685366  1.832489e-17
# 9 fit3  Speciesvirginica   -0.454 0.06793755 -6.682608  4.538957e-10

我很长时间没有这个用户,所以可能有更好的方法将这些数据帧加在一起。