Выходные данные пакета R stargazer: Отсутствует статистика F для регрессии фелм (пакет lfe)

Я пытаюсь использовать пакет stargazer для вывода результатов регрессии. Я выполнил свои регрессии, используя felm из пакета lfe. Выходные таблицы stargazer показывают все правильно, кроме значений F-статистики, которые остаются пустыми. Проблема не возникает с lm результатами.

В чем причина и как я могу получить статистические значения F для моих felm регрессий, которые будут отображаться в выходных данных stargazer?

Я знаю, что могу вручную добавить строку, чтобы показать F-значения, но я бы предпочел более автоматический подход, если это возможно.

Ниже приведен пример кода с использованием данных, предоставленных здесь

library(foreign)
temp_dat <- read.dta("http://www.kellogg.northwestern.edu/faculty/petersen/htm/papers/se/test_data.dta")

temp_lm <- lm(y ~ x, temp_dat)
temp_felm <- felm(y ~ x, temp_dat)

library(stargazer)
stargazer(temp_lm, temp_felm, type = "text")

Выход:

====================================================================
                                        Dependent variable:         
                                ------------------------------------
                                                 y                  
                                            OLS               felm  
                                            (1)               (2)   
--------------------------------------------------------------------
x                                        1.035***           1.035***
                                          (0.029)           (0.029) 

Constant                                   0.030             0.030  
                                          (0.028)           (0.028) 

--------------------------------------------------------------------
Observations                               5,000             5,000  
R2                                         0.208             0.208  
Adjusted R2                                0.208             0.208  
Residual Std. Error (df = 4998)            2.005             2.005  
F Statistic                     1,310.740*** (df = 1; 4998)         
====================================================================
Note:                                    *p<0.1; **p<0.05; ***p<0.01


person Learner Yoda    schedule 16.05.2017    source источник


Ответы (2)


Кажется, нет способа автоматизировать в stargazer, который является отличным пакетом, но не расширяемым. Параметр keep.stat = "f" не создает f-статистику для объекта felm. Однако у texreg есть опция, которая включает f-stat для felm объектов.

library(foreign);library(texreg);library(lfe)
temp_dat <- read.dta("http://www.kellogg.northwestern.edu/faculty/petersen/htm/papers/se/test_data.dta")

temp_lm <- lm(y ~ x, temp_dat)
temp_felm <- felm(y ~ x, temp_dat)

screenreg(list(temp_lm, temp_felm), include.fstatistic = T)

Производит:

==================================================
                          Model 1      Model 2    
--------------------------------------------------
(Intercept)                  0.03         0.03    
                            (0.03)       (0.03)   
x                            1.03 ***     1.03 ***
                            (0.03)       (0.03)   
--------------------------------------------------
R^2                          0.21                 
Adj. R^2                     0.21                 
Num. obs.                 5000         5000       
F statistic               1310.74                 
RMSE                         2.01                 
R^2 (full model)                          0.21    
R^2 (proj model)                          0.21    
Adj. R^2 (full model)                     0.21    
Adj. R^2 (proj model)                     0.21    
F statistic (full model)               1310.74    
F (full model): p-value                   0.00    
F statistic (proj model)               1310.74    
F (proj model): p-value                   0.00    
==================================================
*** p < 0.001, ** p < 0.01, * p < 0.05

Функция createTexreg позволяет вам выбрать конкретную статистику, которую вы хотите извлечь и отобразить. Сначала вам нужно написать небольшую функцию для извлечения объектов из объекта summary.felm, а затем превратить его в объект texreg.

extract.felm <- function(model, include.f.full = TRUE, 
                         include.f.proj = TRUE,
                         include.rsquared = TRUE,
                         include.adjrs = TRUE, 
                         include.nobs = TRUE, ...) {

   s <- summary(model, ...)
   names <- rownames(s$coefficients)
   co <- s$coefficients[, 1]
   se <- s$coefficients[, 2]
   pval <- s$coefficients[, 4]

    gof <- numeric()
    gof.names <- character()
    gof.decimal <- logical()
    if (include.rsquared == TRUE) {
      rs <- s$r.squared
      gof <- c(gof, rs)
      gof.names <- c(gof.names, "R$^2$")
      gof.decimal <- c(gof.decimal, TRUE)
      }
   if (include.adjrs == TRUE) {
     adj <- s$adj.r.squared
     gof <- c(gof, adj)
     gof.names <- c(gof.names, "Adj.\\ R$^2$")
     gof.decimal <- c(gof.decimal, TRUE)
     }
   if (include.nobs == TRUE) {
     n <- s$N
     gof <- c(gof, n)
     gof.names <- c(gof.names, "Num.\\ obs.")
     gof.decimal <- c(gof.decimal, FALSE)
   }
    if (include.f.full == TRUE) {
      ffs <- s$fstat
      ffpval <- round(s$F.fstat[4],4)
      gof <- c(gof, ffs, ffpval)
      gof.names <- c(gof.names, "F statistic (Full model)", "F (full model): p-value")
      gof.decimal <- c(gof.decimal, TRUE, TRUE)
    }
    if (include.f.proj == TRUE) {
      fps <- s$P.fstat[5]
      fppval <- s$P.fstat[4]
      gof <- c(gof, fps, fppval)
      gof.names <- c(gof.names, "F statistic (proj. model)", "F (proj. model): p-value") #Modify the names as you see fit
      gof.decimal <- c(gof.decimal, TRUE, TRUE)
    }
     tr <- createTexreg(
       coef.names = names,
       coef = co,
       se = se,
       pvalues = pval,
       gof.names = gof.names,
       gof = gof,
       gof.decimal = gof.decimal
       )
   return(tr)
   }
setMethod("extract", signature = className("felm", "stats"),
             definition = extract.felm)

Теперь запустите функцию, задав аргумент include.f.prof = F и отправьте его screenreg:

> m <- extract.felm(temp_felm, include.f.proj = F)
> screenreg(list(temp_lm, m))

==================================================
                          Model 1      Model 2    
--------------------------------------------------
(Intercept)                  0.03         0.03    
                            (0.03)       (0.03)   
x                            1.03 ***     1.03 ***
                            (0.03)       (0.03)   
--------------------------------------------------
R^2                          0.21         0.21    
Adj. R^2                     0.21         0.21    
Num. obs.                 5000         5000       
RMSE                         2.01                 
F statistic (Full model)               1310.74    
F (full model): p-value                   0.00    
==================================================
*** p < 0.001, ** p < 0.01, * p < 0.05
person paqmo    schedule 16.05.2017
comment
Спасибо. Я никогда не использовал «текрег», но это выглядит очень полезным. Однако этот способ без необходимости увеличивает высоту таблицы - знаете ли вы, как значения R ^ 2 и F-статистики из разных типов моделей могут быть расположены в одной строке вместо того, чтобы занимать разные строки? - person Learner Yoda; 23.05.2017
comment
К счастью, texreg очень расширяемый. Я рекомендую ознакомиться с руководством, чтобы узнать, как используйте функцию createTexreg. Я добавлю функцию выше, которая поможет. - person paqmo; 23.05.2017

Это не совсем удовлетворительное решение вашей проблемы.
Надеюсь, это может вам помочь.

Получите статистику F от lfe:::summary.felm:

(Fstat <- summary(temp_felm)$F.fstat)

###############
            F           df1           df2             p 
 1.310740e+03  1.000000e+00  4.998000e+03 4.252163e-255

Затем добавьте статистику F в примечания к таблице, созданной с помощью stargazer:

stars <- ifelse(Fstat[4]<0.01,"***",ifelse(Fstat[4]<0.05,"**",ifelse(Fstat[4]<0.1,"*","")))
notes <- c(paste("F Statistic(full) \\hfill      ", round(Fstat[1],3),stars," (df = ",Fstat[2],"; ", Fstat[3],")",sep=""),
"Note:\\hfill *p<0.1; **p<0.05; ***p<0.01")

stargazer(temp_felm, notes=notes, notes.append=F, notes.label="", notes.align="l")

Последняя таблица LaTeX:  введите здесь описание изображения

person Marco Sandri    schedule 16.05.2017
comment
В моем столе было около 8 моделей. Вставка значений F для всех в раздел примечаний может быть не очень полезной. Но ваше решение дало мне другую идею - я мог извлечь значения F всех моделей, вставить их в вектор, а затем add.line. Это требует некоторых усилий и не полностью автоматизировано, но кажется лучше, чем вообще не иметь значения F. - person Learner Yoda; 23.05.2017