18.6 Tvorba pěkně formátovaných výsledků s balíkem stargazer

Pro porovnání výsledků odhadů je užitečné srovnat si je vedle sebe do tabulky, jakou znáte z empirických článků. Tento úkol umí splnit balík Marka Hlaváče stargazer.

library(stargazer)

Stargazer dokáže vytvářet a do ASCII, HTML a LaTeXu exportovat:

  • regresní tabulky
  • tabulky popisných statistik
  • exportovat vstupní data.frame bez další transformace (to je užitečné například pro export korelačních tabulek)

Balik stargazer obsahuje jedinou funkci stargazer(), ktera ma velke mnozstvi parametru - srozumitelny tutorial najdete napriklad zde: http://jakeruss.com/cheatsheets/stargazer.html

Vstupem do funkce může být:

  • jeden nebo více odhadnutých modelů různých tříd (viz seznam v helpu)
  • data.framy, vektory nebo matice pro tvorbu popisných statistik nebo přímý export

Vstupy mohou být vloženy jednotlivě nebo jako list, popřípadě list v listu.

18.6.1 Tabulka s popisnými statistikami

Tvorbu tabulky s popisnými statistikami je možné ilustrovat na minimalistickém příkladu. Vstupem je v tomto případě data.frame. Klíčovým parametrem je summary = TRUE, který říká stargazeru, že má vytvořit popisné statistiky. V případě FALSE by exportoval vstupní tabulku tak jak je.

Parametr type udává formát, do kterého stargazer exportuje. Možná nastavení jsou html, text a latex (default). Zde nevyužitým parametrem je out – do něj se vkládá jméno výstupního souboru.

stargazer(
    VGAMdata::oly12,
    summary = TRUE,
    type = "latex"
)
Statistic N Mean St. Dev. Min Pctl(25) Pctl(75) Max
Age 10,384 26.069 5.441 13 22 29 71
Height 9,823 1.769 0.113 1.320 1.690 1.850 2.210
Weight 9,104 72.853 16.067 36.000 61.000 81.000 218.000
Gold 10,384 0.017 0.136 0 0 0 2
Silver 10,384 0.017 0.133 0 0 0 2
Bronze 10,384 0.018 0.136 0 0 0 2
Total 10,384 0.052 0.250 0 0 0 5

V základním nastavení stargazer vrací počet pozorování, průměr, směrodatnou odchylku, minimum a maximum. Výčet statistik, stejná jako formátování tabulky, lze měnit pomocí parametrů funkce stargazer().

Pozor, stargazer neumí zpracovat tibble! Tabulka oly12 je tibble:

stargazer(
    oly12,
    summary = TRUE,
    type = "latex"
)

Výstup bude vypadat následovně:

Statistic N Mean St. Dev. Min Pctl(25) Pctl(75) Max

Pro správnou funkci je potřeba tabulku odtibblovat – například pomocí as.data.frame(oly12).

18.6.2 Tabulka s regresními modely

Pokud jsou vstupem stagazeru odhadnuté modely nebo jejich list, potom stargazer automaticky vytvoří regresní tabulku. Pro ilustraci můžeme použít list Spec_models.

Pro vytvoření regresní tabulky ze Spec_models je vhodné použít další z mnoha parametrů funkce stargazer(). Jeden z modelů ve Spec_models obsahuje velké množství fixních efektů. Jejich odhady nás v podstatě nezajímají, ale jejich výpis by tabulku zvětšil do obrovských rozměrů. Použijeme proto parametr omit, který umožňuje potlačit výpis parametrů, jejichž jména odpovídají zadanému regulárnímu výrazu.

V parametru omit.labels je možné nastavit jméno, které se má použít pro signalizaci přítomnosti nevytisknutých proměnných v regresi.

stargazer(
    Spec_models,
    type = pandoc.output.format(),
    omit = "factor\\(Country\\)",
    omit.labels = "Country FE"
)
Dependent variable:
Weight
(1) (2) (3)
Height 94.635*** 78.902*** 94.887***
(1.141) (1.814) (1.234)
Age 0.410*** 0.392*** 0.491***
(0.110) (0.109) (0.110)
I(Age2) -0.004** -0.004** -0.005***
(0.002) (0.002) (0.002)
SexM 5.592*** -39.474*** 5.502***
(0.256) (4.065) (0.266)
Height:SexM 25.695***
(2.313)
Constant -106.013*** -78.891*** -112.691***
(2.385) (3.402) (6.240)
Country FE No No No
Observations 9,038 9,038 9,038
R2 0.603 0.608 0.628
Adjusted R2 0.603 0.608 0.620
Residual Std. Error 10.126 (df = 9033) 10.058 (df = 9032) 9.909 (df = 8837)
F Statistic 3,430.928*** (df = 4; 9033) 2,806.601*** (df = 5; 9032) 74.631*** (df = 200; 8837)
Note: p<0.1; p<0.05; p<0.01

Za povšimnutí stojí, že stargazer defaultně používá jinou hvězdičkovou konvenci, než je tomu ve zbytku R. Ve v tabulce vytvořené stargazerem vidíte stejnou konvenci, na kterou jste zvyklí z Gretlu. R defaultně hvězdičkami více šetří – viz summary výše.

Stargazer poskytuje extrémně užitečnou funkcionalitu, nicméně celkově se jedná o dost nemoderní balík s velmi složitým kódem, který je náchylný k chybám a divnému chování.

Výše ukázané tabulky neobsahují robustní chyby. Protože z testů víme, že rezidua jsou heteroskedastická, musíme je do tabulek dostat.

V defaultním nastavení stargazer získává odhad standardních chyb vnitřním voláním summary. Uživatel však může vložit vlastní odhady robustních chyb do argumentu se. Ten očekává list numerických vektorů. (V nápovědě k parametru se je v aktuální verzi chyba.)

Postup je následující:

  1. Nejprve vytvoříme funkci get.se, která odhadne robustní chyby a vrátí je jako vektor.
  2. Pomocí lapply aplikujeme funkci get.se na všechny modely v listu Spec_models.
  3. Výsledný list vektorů vložíme do parametru se stargazeru.

Zároveň totéž provedeme pro p-hodnoty.

get.se <- function(x) coeftest(x, vcov. = vcovHC) %>% 
    tidy %>% 
    pull(std.error)

get.pval <- function(x) coeftest(x, vcov. = vcovHC) %>% 
    tidy %>% 
    pull(p.value)

se.list <- lapply(Spec_models, get.se)
pval.list <- lapply(Spec_models, get.pval)

stargazer(
    Spec_models,
    type = pandoc.output.format(),
    omit = "Country",
    omit.labels = "Country FE",
    se = se.list,
    p = pval.list
)
Dependent variable:
Weight
(1) (2) (3)
Height 94.635*** 78.902*** 94.887
(1.212) (1.682)
Age 0.410*** 0.392*** 0.491
(0.092) (0.091)
I(Age2) -0.004*** -0.004** -0.005
(0.002) (0.002)
SexM 5.592*** -39.474*** 5.502
(0.244) (4.125)
Height:SexM 25.695***
(2.352)
Constant -106.013*** -78.891*** -112.691
(2.453) (3.149)
Country FE No No No
Observations 9,038 9,038 9,038
R2 0.603 0.608 0.628
Adjusted R2 0.603 0.608 0.620
Residual Std. Error 10.126 (df = 9033) 10.058 (df = 9032) 9.909 (df = 8837)
F Statistic 3,430.928*** (df = 4; 9033) 2,806.601*** (df = 5; 9032) 74.631*** (df = 200; 8837)
Note: p<0.1; p<0.05; p<0.01

Pokud bychom chtěli vytvořit regresní tabulku z modelů odhadnutých pro jednotlivé sporty, můžeme využít toho, že data.frame je ve své podstatě list:

stargazer(
    Sport_models$est_model,
    type = "html"
)

Burns, Patrick. 2011. "The R Inferno." http://www.burns-stat.com/pages/Tutor/R_inferno.pdf.

Grolemund, Garrett, and Hadley Wickham. 2011. "Dates and Times Made Easy with Lubridate." Journal of Statistical Software 40 (3): 1-25. https://www.jstatsoft.org/article/view/v040i03.

Peng, Roger D. 2016. R Programming for Data Science. LeanPub. https://bookdown.org/rdpeng/rprogdatascience/.

Spector, Phil. 2008. Data Manipulation with R. 1st ed. Use R! Springer.

Wickham, Hadley. 2014. Advanced R. 1st ed. Boca Raton, Florida, USA: Chapman; Hall/CRC. http://adv-r.had.co.nz/.

Wickham, Hadley, and Garrett Grolemund. 2017. R forData Science. 1st ed. Sebastopol, California, USA: O'Reilly. http://r4ds.had.co.nz/.