Как получить между и в целом R2 из PLM FE регрессии с Stargazer? - PullRequest
0 голосов
/ 09 апреля 2020

Отказ от ответственности: Этот вопрос чрезвычайно связан с этим вопросом, который я задал два дня go - но теперь он касается реализации между и общим R2 в stargazer() выводе, а не в summary() как прежде.

Есть ли способ заставить plm() рассчитать между R2 и R2 для меня и включить их в вывод stargazer()?

Чтобы уточнить, что я имею в виду между, в целом и внутри R2, см. Этот ответ на StackExchange .

Насколько я понимаю, plm вычисляет только в R2. Я запускаю эффекты Twoways в модели.

library(plm)
library(stargazer)

# Create some random data
set.seed(1) 
x=rnorm(100); fe=rep(rnorm(10),each=10); id=rep(1:10,each=10); ti=rep(1:10,10); e=rnorm(100)
y=x+fe+e

data=data.frame(y,x,id,ti)

# Get plm within R2
reg=plm(y~x,model="within",index=c("id","ti"), effect = "twoways", data=data) 
stargazer(reg)

Теперь я также хочу включить между и всем R2 в вывод stargazer(). Как я могу это сделать?

Чтобы было ясно, что я имею в виду между и в целом R2:

# Pooled Version (overall R2)
reg1=lm(y~x)
summary(reg1)$r.squared

# Between R2
y.means=tapply(y,id,mean)[id]
x.means=tapply(x,id,mean)[id]

reg2=lm(y.means~x.means)
summary(reg2)$r.squared

1 Ответ

1 голос
/ 09 апреля 2020

Чтобы сделать это в stargazer, вы можете использовать аргумент add.lines(). Однако , это добавляет строки в начало раздела сводной статистики, и нет никакого способа изменить это, не испортив исходный код, что ужасно. Я очень предпочитаю huxtable, который обеспечивает грамматику построения таблиц и является гораздо более расширяемым и настраиваемым.

library(tidyverse)
library(plm)
library(huxtable)

# Create some random data
set.seed(1) 
x=rnorm(100); fe=rep(rnorm(10),each=10); id=rep(1:10,each=10); ti=rep(1:10,10); e=rnorm(100)
y=x+fe+e

data=data.frame(y,x,id,ti)

# Get plm within R2
reg=plm(y~x,model="within",index=c("id","ti"), effect = "twoways", data=data) 
stargazer(reg, type = "text", 
          add.lines = list(c("Overall R2", round(r.squared(reg, model = "pooled"), 3)),
                           c("Between R2", round(r.squared(update(reg, effect = "individual", model = "between")), 3))))
#> 
#> ========================================
#>                  Dependent variable:    
#>              ---------------------------
#>                           y             
#> ----------------------------------------
#> x                     1.128***          
#>                        (0.113)          
#>                                         
#> ----------------------------------------
#> Overall R2              0.337           
#> Between R2              0.174           
#> Observations             100            
#> R2                      0.554           
#> Adjusted R2             0.448           
#> F Statistic    99.483*** (df = 1; 80)   
#> ========================================
#> Note:        *p<0.1; **p<0.05; ***p<0.01


# I prefer huxreg, which is much more customizable!

# Create a data frame of the R2 values
r2s <- tibble(
  name = c("Overall R2", "Between R2"), 
  value = c(r.squared(reg, model = "pooled"), 
            r.squared(update(reg, effect = "individual", model = "between")))) 

tab <- huxreg(reg) %>% 
  # Add new R2 values
  add_rows(hux(r2s), after = 4)

# Rename R2 
tab[7, 1] <- "Within R2"

tab %>% huxtable::print_screen()
#> ─────────────────────────────────────────────────
#>                                    (1)           
#>                         ─────────────────────────
#>   x                                   1.128 ***  
#>                                      (0.113)     
#>                         ─────────────────────────
#>   N                                 100          
#>   Overall R2                          0.337      
#>   Between R2                          0.174      
#>   Within R2                           0.554      
#> ─────────────────────────────────────────────────
#>   *** p < 0.001; ** p < 0.01; * p < 0.05.        
#> 
#> Column names: names, model1

Создано в 2020-04-08 представляет пакет (v0.3.0)

...