按因素分组提取每个回归的R^2(R平方)值

3
我想知道是否有一种方法可以提取每个回归方程的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

3
这个对你可行吗:ldply(models, function(x) summary(x)$r.squared) - Jota
1
错误是由于summary是一个函数,你不能在一个函数上使用$运算符。此外,在l_ply的第二个参数必须是一个函数,而在你的情况下它不是。正确的解决方案请参考Frank的方法... - Stibu
感谢@Frank的有益评论。您是否想将您的评论更改为答案?您能帮我通过一个命令获得两个系数和R2吗?谢谢。 - MYaseen208
4个回答

6

您可以通过以下方式获取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

6
使用包将统计分析对象转换为数据框,使用dplyrbind_rows函数: broom 包。
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

2

你可以尝试这个

sapply(models, function(x) summary(x)$r.squared)
     CA      NY 
0.05639 0.23751 

2

如果您尝试

> 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

这段代码将会运行并打印结果。然而,你说你想要“提取结果”。这可能意味着你想要使用结果而不仅仅是打印它。

l_ply的文档中(你可以在R提示符下键入?l_ply来获取):

对于列表的每个元素,应用函数并丢弃结果。

(因此,如果你想保留结果,这个函数就不适用。)

使用标准的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 包的函数,laplyldplyllply 也能够工作。但我从未使用过该包,所以无法说出什么最好。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接