我正在尝试使用R中的tidyverse
拟合几个线性模型。我有兴趣使用summary
以及一个自定义函数打印出模型拟合的结果,该函数旨在返回summary
未返回的统计参数(如AIC值(,然后将该模型应用于预测一组已知数据(测试数据集(中的值。下面是我使用mtcars数据集所做工作的一个示例。
library(tidyverse);library(magrittr)
mtcars%>%
filter(gear=="4")%$%
lm(hp~mpg)%>%
summary()
mtcars%>%
filter(gear=="4")%$%
lm(hp~mpg)%>%
AIC()
mtcars%>%
filter(gear=="4")%$%
lm(hp~mpg)%>%
predict(newdata=data.frame(mpg=19))
在调用lm
之前,我经常对我的数据进行大量筛选(因为所有模型都缺少数据,使用mutate
调用、使用summarise
或基于感兴趣的分类变量进行筛选(,并拟合许多不同的模型排列。然而,我最终不得不多次调用同一个代码才能获得汇总统计信息。
通常,我只会将lm
模型保存为一个对象,但在这种情况下,我只想运行一个初步测试,看看结果如何,看看该版本是否值得保存,我不希望大量的lm
对象扰乱我的全局环境。然而,似乎一旦在lm
之后调用管道,就不可能再次调用临时lm
对象。
有没有什么整洁的方法可以保留一个合适的lm
对象并将其派生到同一代码串中,这样我就可以在一次调用中打印summary
、predict
和AIC
函数的结果?
magritter管道允许一个代码块,其中.
是来自链的值。所以
mtcars%>%
filter(gear=="4")%$%
lm(hp~mpg)%>% {list(
summary(.),
AIC(.),
predict(., newdata=data.frame(mpg=19))
)}
会起作用您也可以使用%T>%
(三通(管道。但是,如果你想看到,你需要显式地打印链中的值或其他东西
mtcars%>%
filter(gear=="4")%$%
lm(hp~mpg) %T>%
{print(summary(.))} %T>%
{print(AIC(.))} %>%
predict(newdata=data.frame(mpg=19))
一个选项是创建一个自定义函数,该函数可以一起生成所需的输出。然后,您可以将任何您喜欢的数据作为一行输入。
library(tidyverse)
## function to produce all desired outputs in one object
f <- function(train_data = mtcars,
x = "mpg",
y = "hp",
test_data = data.frame(mpg = 19)) {
formula <- as.formula(paste0(y, "~", x))
mod <- lm(formula, data = train_data)
list(
summary = summary(mod),
AIC = AIC(mod),
prediction = predict(mod, test_data)
)
}
f()
#> $summary
#>
#> Call:
#> lm(formula = formula, data = train_data)
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -59.26 -28.93 -13.45 25.65 143.36
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 324.08 27.43 11.813 8.25e-13 ***
#> mpg -8.83 1.31 -6.742 1.79e-07 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 43.95 on 30 degrees of freedom
#> Multiple R-squared: 0.6024, Adjusted R-squared: 0.5892
#> F-statistic: 45.46 on 1 and 30 DF, p-value: 1.788e-07
#>
#>
#> $AIC
#> [1] 336.8553
#>
#> $prediction
#> 1
#> 156.3174
创建于2022-07-21由reprex包(v2.0.1(