【问题标题】:Extract R^2 (R-squared) value for each regression grouped by a factor为按因子分组的每个回归提取 R^2(R 平方)值
【发布时间】:2015-04-22 17:55:33
【问题描述】:

我想知道是否有办法为每个回归方程提取 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

【问题讨论】:

  • 这对你有用吗:ldply(models, function(x) summary(x)$r.squared)?
  • 这个错误是由于summary是一个函数,你不能在函数上使用$操作符。此外,l_ply 的第二个参数必须是一个函数,但您的情况并非如此。有关正确的解决方案,请参阅 Frank...
  • 感谢@Frank 的有用评论。你想改变你的评论来回答。你能帮我通过一个命令获得系数和 R2 吗?谢谢

标签: r statistics regression


【解决方案1】:

您可以这样做以获得 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

【讨论】:

    【解决方案2】:

    使用broom 包将统计分析对象转换为data.frames,dplyr 用于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
    

    【讨论】:

      【解决方案3】:

      你可以试试这个

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

      【讨论】:

        【解决方案4】:

        如果你尝试

        > 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 似乎也可以。但我从未使用过那个包,所以我不能说什么是最好的。)

        【讨论】:

          猜你喜欢
          • 2018-08-20
          • 2011-08-01
          • 2013-11-20
          • 2019-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多