texreg на объекте panelmodel (plm);дополнительная информация - PullRequest
0 голосов
/ 24 мая 2018

Как мне настроить качество посадки (gof) при вызове ?

У меня есть несколько моделей, которые я хочу отобразить, но я толькополучить "Num. obs.", "Adj. R^2", и , "R^2" (см. рабочий пример ниже).Я бы хотел, чтобы все отображали маленькие n, T, F-statistic и p-value, все, что я получаю при вызове summary() по умолчанию.

Пример того, что я получил.Во-первых, некоторые данные и необходимые пакеты,

# install.packages(c("wooldridge", "plm", "texreg"), dependencies = TRUE)
library(wooldridge) 
data(wagepan)
library(plm) 

Во-вторых, некоторые модели,

POLS <- plm(lwage ~ educ + black + hisp + exper+I(exper^2)+ married + union +
            factor(year), data = wagepan, index=c("nr","year") , model="pooling")

RE <- plm(lwage ~ educ + black + hisp + exper + I(exper^2) + married + union +
          factor(year), data = wagepan, index = c("nr","year") , model = "random") 

FE <- plm(lwage ~ I(exper^2) + married + union + factor(year), 
          data = wagepan, index = c("nr","year"), model="within")

В-третьих, мой текущий вызов и его вывод,

# library(texreg)                      
texreg::screenreg(list(POLS, RE, FE), custom.coef.map = list('married' = 'Marrtied', 'union' = 'Union'))
#> ================================================
#>            Model 1      Model 2      Model 3    
#> ------------------------------------------------
#> Marrtied      0.11 ***     0.06 ***     0.05 *  
#>              (0.02)       (0.02)       (0.02)   
#> Union         0.18 ***     0.11 ***     0.08 ***
#>              (0.02)       (0.02)       (0.02)   
#> ------------------------------------------------
#> R^2           0.19         0.18         0.18    
#> Adj. R^2      0.19         0.18         0.06    
#> Num. obs.  4360         4360         4360       
#> ================================================
#> *** p < 0.001, ** p < 0.01, * p < 0.05

Я пытался добавить , include.fstatistic = TRUE, но мне кажется, что я не могу этого понять.Я нуждаюсь в дополнительной настройке.

Я стремлюсь к чему-то вроде этого,

#> ------------------------------------------------
#> Obs.  (N)   4360         4360         4360       
#> Indiv.(n)    545          545          545       
#> Time  (T)      8            8            8       
#> R^2           0.19         0.18         0.18    
#> Adj. R^2      0.19         0.18         0.06    
#> F-stat       72.458       68.4124      83.8515  
#> P-value        (2.22e-16)   (2.22e-16)   (2.22e-16) 
#> ================================================
#> *** p < 0.001, ** p < 0.01, * p < 0.05

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Вот одна возможность, используя huxreg из моего пакета huxtable.Вам также понадобится установить пакет broom.

library(huxtable)

ht <- huxreg(POLS, RE, FE, 
      coefs = c("Married" = "married", "Union" = "union"), 
      statistics = c("Obs. (N)" = "nobs", "Adj. R^2" = "adj.r.squared", 
        "F statistic" = "statistic", "P value" = "p.value"))

Количество единиц времени не в broom::glance, поэтому мы добавляем его вручную - вот простой способ:

Ts <- purrr::map_int(list(POLS, RE, FE), list(pdim, "nT", "T"))
ns <- purrr::map_int(list(POLS, RE, FE), list(pdim, "nT", "n"))
ht <- insert_row(ht, c("Time (T)", Ts), after = 6)
ht <- insert_row(ht, c("Indiv. (n)", ns), after = 6)
ht

───────────────────────────────────────────────────────────────
                     (1)             (2)             (3)       
              ─────────────────────────────────────────────────
  Married          0.108 ***       0.064 ***       0.047 *     
                  (0.016)         (0.017)         (0.018)      
  Union            0.182 ***       0.106 ***       0.080 ***   
                  (0.017)         (0.018)         (0.019)      
              ─────────────────────────────────────────────────
  Obs. (N)      4360            4360            4360           
  Indiv. (n)     545             545             545           
  Time (T)         8               8               8           
  Adj. R^2         0.187           0.178           0.061       
  F statistic     72.459          68.412          83.851       
  P value          7.250e-186      5.813e-176      1.655e-156  
───────────────────────────────────────────────────────────────
  *** p < 0.001; ** p < 0.01; * p < 0.05. 

Column names: names, model1, model2, model3

Это автоматически распечатает как TeX / HTML в документе Rmarkdown.Вы можете редактировать его для добавления строк, столбцов и дальнейшего форматирования.

0 голосов
/ 30 мая 2018

Следуя ответу @jaySF, создайте свою собственную функцию извлечения, которая оборачивает значение по умолчанию, и зарегистрируйте его:

custom_extract_plm <- function(model, ...) {
  s <- summary(model)
  ex.1 <- texreg:::extract.plm(model, ...)

  fv.1 <- s$fstatistic$statistic
  pv.1 <- s$fstatistic$p.value

  ex.1@gof.names <- c(ex.1@gof.names, "F-stat", "P-value")
  ex.1@gof <- c(ex.1@gof, fv.1, pv.1)
  ex.1@gof.decimal <- c(ex.1@gof.decimal, TRUE, TRUE)

  ex.1
}

setMethod(texreg:::extract, signature = className("plm", "plm"), custom_extract_plm)

Теперь вы получаете F-статистику:

> texreg::screenreg(list(POLS, RE, FE), custom.coef.map = list('married' = 'Marrtied', 'union' = 'Union'))

================================================
           Model 1      Model 2      Model 3    
------------------------------------------------
Marrtied      0.11 ***     0.06 ***     0.05 *  
             (0.02)       (0.02)       (0.02)   
Union         0.18 ***     0.11 ***     0.08 ***
             (0.02)       (0.02)       (0.02)   
------------------------------------------------
R^2           0.19         0.18         0.18    
Adj. R^2      0.19         0.18         0.06    
Num. obs.  4360         4360         4360       
F-stat       72.46        68.41        83.85    
P-value       0.00         0.00         0.00    
================================================
*** p < 0.001, ** p < 0.01, * p < 0.05
0 голосов
/ 24 мая 2018

Вы можете взломать его, используя texreg::extract().

Для получения «small n» нам сначала понадобится небольшая функция.

getIndex <- function(fit){
  # extracts number of factor levels of index variables
  # from raw data used in models
  index.names <- as.character(as.list(summary(fit)$call)$index)[-1]
  if (length(index.names == 1)){
    df.name <- as.character(as.list(summary(fit)$call)$data)
    index.df <- get(df.name)[, index.names]
    length(unique(index.df))
  }
  if (length(index.names == 2)){
    df.name <- as.character(as.list(summary(fit)$call)$data)
    index.df <- get(df.name)[, index.names]
    cbind(length(unique(index.df[, 1])), 
          length(unique(index.df[, 2]))) 
  } else {
    stop("no index variables specified in model")
  }

}

Затем продолжите извлечение.

fv.1 <- summary(POLS)$fstatistic$statistic  # get F statistic
pv.1 <- summary(POLS)$fstatistic$p.value  # get p value
ns.1 <- getIndex(POLS)[1]  # get small n
tm.1 <- getIndex(POLS)[2]  # get times

library(texreg)
ex.1 <- extract(POLS)  # extract coefficients and GOF measures
ex.1@gof.names <- c(ex.1@gof.names[1:3],"Indiv.(n)", "Time (T)", 
                    "F-stat", "P-value")  # the GOF names
ex.1@gof <- c(ex.1@gof[1:3], ns.1, tm.1, fv.1, pv.1)  # the GOF values
ex.1@gof.decimal <- c(ex.1@gof.decimal[1:3], FALSE, FALSE, TRUE, TRUE)  # numeric or integer

fv.2 <- summary(RE)$fstatistic$statistic
pv.2 <- summary(RE)$fstatistic$p.value
ns.2 <- getIndex(RE)[1]
tm.2 <- getIndex(RE)[2]

ex.2 <- extract(RE)
ex.2@gof.names <- c(ex.2@gof.names[1:3],"Indiv.(n)", "Time (T)", 
                    "F-stat", "P-value")
ex.2@gof <- c(ex.2@gof[1:3], ns.2, tm.2, fv.2, pv.2)
ex.2@gof.decimal <- c(ex.2@gof.decimal[1:3], FALSE, FALSE, TRUE, TRUE)

fv.3 <- summary(FE)$fstatistic$statistic
pv.3 <- summary(FE)$fstatistic$p.value
ns.3 <- getIndex(FE)[1]
tm.3 <- getIndex(FE)[2]

ex.3 <- extract(FE)
ex.3@gof.names <- c(ex.3@gof.names[1:3],"Indiv.(n)", "Time (T)", 
                    "F-stat", "P-value")
ex.3@gof <- c(ex.3@gof[1:3], ns.3, tm.3, fv.3, pv.3)
ex.3@gof.decimal <- c(ex.3@gof.decimal[1:3], FALSE, FALSE, TRUE, TRUE)

Уступая

> screenreg(list(ex.1, ex.2, ex.3))

=======================================================
                  Model 1      Model 2      Model 3    
-------------------------------------------------------
[TRUNCATED...]
-------------------------------------------------------
R^2                  0.19         0.18         0.18    
Adj. R^2             0.19         0.18         0.06    
Num. obs.         4360         4360         4360       
Indiv.(n)          545          545          545       
Time (T)             8            8            8       
F-stat              72.46        68.41        83.85    
P-value              0.00         0.00         0.00    
=======================================================
*** p < 0.001, ** p < 0.01, * p < 0.05

Взгляните, например, на str(extract(FE)), чтобы применить это для дополнительных GOF.

Чтобы обернуть его в функциювзгляните на код в ответе @Neal Fultz.

...