为按因子分组的每个回归提取 R^2(R 平方)值
Extract R^2 (R-squared) value for each regression grouped by a factor
我想知道是否有办法为每个回归方程提取 R2。
d <- data.frame(
state = rep(c('NY', 'CA'), 10),
year = rep(1:10, 2),
response= rnorm(20)
)
library(plyr)
models <- dlply(d, "state", function(df)
lm(response ~ year, data = df))
ldply(models, coef)
l_ply(models, summary, .print = TRUE)
我试过了
l_ply(models, summary$r.squared, .print = TRUE)
但这会引发以下错误消息
Error in summary$r.squared : object of type 'closure' is not subsettable
你可以试试这个
sapply(models, function(x) summary(x)$r.squared)
CA NY
0.05639 0.23751
您可以这样做以获得 R 平方值和系数:
ldply(models, function(x) {r.sq <- summary(x)$r.squared
intercept <- summary(x)$coefficients[1]
beta <- summary(x)$coefficients[2]
data.frame(r.sq, intercept, beta)})
# state r.sq intercept beta
#1 CA 0.230696121 0.4915617 -0.12343947
#2 NY 0.003506936 0.1971734 -0.01227367
如果你尝试
> typeof( summary )
[1] "closure"
你看'summary'是一个函数。您正在尝试访问结果的一个字段,但是 summary$r.squared
尝试访问函数/闭包中的那个字段。
使用匿名函数,
> l_ply( models, function( m ) summary( m )$r.squared, .print = TRUE )
[1] 0.2319583
[1] 0.01295825
将工作并打印结果。但是,你说你想要"extract the result"。这可能意味着您想要 使用 结果而不仅仅是打印它。
来自 l_ply
的文档(您可以通过在 R 提示符下键入 ?l_ply
获得):
For each element of a list, apply function and discard results.
(所以如果你想挂在结果上,这个功能将不起作用。)
使用标准 sapply
/lapply
将导致
> a <- sapply( models, function( t ) summary( t )$r.squared )
> a
CA NY
0.23195825 0.01295825
> typeof( a )
[1] "double"
> is.vector( a )
[1] TRUE
> # or alternatively
> l <- lapply( models, function( t ) summary( t )$r.squared )
> l
$CA
[1] 0.2319583
$NY
[1] 0.01295825
> typeof( l )
[1] "list"
任何一个都应该工作 -- 选择更容易用于您想要执行的操作的结果(矢量或列表)。 (如果不确定,请选择 sapply
。)
(或者,如果您想使用 plyr
包中的函数,laply
、ldply
和 llply
似乎也可以。但我已经从来没有用过那个包,所以我不能说什么是最好的。)
使用 broom 包将统计分析对象转换为 data.frames 和 dplyr
for bind_rows
:
library(dplyr) ; library(broom)
cbind(
state = attr(models, "split_labels"),
bind_rows(lapply(models, function(x) cbind(
intercept = tidy(x)$estimate[1],
beta = tidy(x)$estimate[2],
glance(x))))
)
state intercept beta r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual
1 CA 0.38653551 -0.05459205 0.01427426 -0.10894146 1.434599 0.1158477 0.7423473 2 -16.68252 39.36505 40.27280 16.46460 8
2 NY 0.09028554 -0.08462742 0.04138985 -0.07843642 1.287909 0.3454155 0.5729312 2 -15.60387 37.20773 38.11549 13.26968 8
我想知道是否有办法为每个回归方程提取 R2。
d <- data.frame(
state = rep(c('NY', 'CA'), 10),
year = rep(1:10, 2),
response= rnorm(20)
)
library(plyr)
models <- dlply(d, "state", function(df)
lm(response ~ year, data = df))
ldply(models, coef)
l_ply(models, summary, .print = TRUE)
我试过了
l_ply(models, summary$r.squared, .print = TRUE)
但这会引发以下错误消息
Error in summary$r.squared : object of type 'closure' is not subsettable
你可以试试这个
sapply(models, function(x) summary(x)$r.squared)
CA NY
0.05639 0.23751
您可以这样做以获得 R 平方值和系数:
ldply(models, function(x) {r.sq <- summary(x)$r.squared
intercept <- summary(x)$coefficients[1]
beta <- summary(x)$coefficients[2]
data.frame(r.sq, intercept, beta)})
# state r.sq intercept beta
#1 CA 0.230696121 0.4915617 -0.12343947
#2 NY 0.003506936 0.1971734 -0.01227367
如果你尝试
> typeof( summary )
[1] "closure"
你看'summary'是一个函数。您正在尝试访问结果的一个字段,但是 summary$r.squared
尝试访问函数/闭包中的那个字段。
使用匿名函数,
> l_ply( models, function( m ) summary( m )$r.squared, .print = TRUE )
[1] 0.2319583
[1] 0.01295825
将工作并打印结果。但是,你说你想要"extract the result"。这可能意味着您想要 使用 结果而不仅仅是打印它。
来自 l_ply
的文档(您可以通过在 R 提示符下键入 ?l_ply
获得):
For each element of a list, apply function and discard results.
(所以如果你想挂在结果上,这个功能将不起作用。)
使用标准 sapply
/lapply
将导致
> a <- sapply( models, function( t ) summary( t )$r.squared )
> a
CA NY
0.23195825 0.01295825
> typeof( a )
[1] "double"
> is.vector( a )
[1] TRUE
> # or alternatively
> l <- lapply( models, function( t ) summary( t )$r.squared )
> l
$CA
[1] 0.2319583
$NY
[1] 0.01295825
> typeof( l )
[1] "list"
任何一个都应该工作 -- 选择更容易用于您想要执行的操作的结果(矢量或列表)。 (如果不确定,请选择 sapply
。)
(或者,如果您想使用 plyr
包中的函数,laply
、ldply
和 llply
似乎也可以。但我已经从来没有用过那个包,所以我不能说什么是最好的。)
使用 broom 包将统计分析对象转换为 data.frames 和 dplyr
for bind_rows
:
library(dplyr) ; library(broom)
cbind(
state = attr(models, "split_labels"),
bind_rows(lapply(models, function(x) cbind(
intercept = tidy(x)$estimate[1],
beta = tidy(x)$estimate[2],
glance(x))))
)
state intercept beta r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual
1 CA 0.38653551 -0.05459205 0.01427426 -0.10894146 1.434599 0.1158477 0.7423473 2 -16.68252 39.36505 40.27280 16.46460 8
2 NY 0.09028554 -0.08462742 0.04138985 -0.07843642 1.287909 0.3454155 0.5729312 2 -15.60387 37.20773 38.11549 13.26968 8