使用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)有很多额外的输出。具体而言,输出包含三个模型中每个模型的每种情况的残差和关于每个具有缺失数据的情况的信息。建议将不胜感激。感谢。
答案 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
我很长时间没有这个用户,所以可能有更好的方法将这些数据帧加在一起。