Vergleichen von Gruppen in FE-Modellen mit wiederholten Messungen mit einer verschachtelten Fehlerkomponente, geschätzt unter Verwendung von plm

8

Ich habe einige Modelle mit und mit einer verschachtelten Fehlerkomponente geschätzt, die auf Gruppierungsvariablen basieren, dh nicht verschachtelten Modellen, die . Ich bin jetzt interessiert daran

  1. Testen Sie, ob die vollständigen Modelle signifikant unterschiedlich sind, dh wobei das vollständige Modell für und das vollständige Modell für und ist
    Ho:βFemale=βMale
    βF.emeinleFemalesβM.einleMales
  2. Testen Sie anschließend ausgewählte Regressionskoeffizienten zwischen zwei Gruppen, dh wobei \ beta_ {Female == year1.5} der Regressionskoeffizient für Frauen ist at und \ beta_ {Male == year1.5} ist der Regressionskoeffizient für Männer at .
    Ho:βFemale==year1.5=βMale==year1.5
    βFemale==year1.5year1.5βMale==year1.5year1.5

Ich werde die Situation anhand des folgenden Arbeitsbeispiels veranschaulichen:

Zunächst werden einige Pakete benötigt,

# install.packages(c("plm","texreg","tidyverse","lmtest"), dependencies = TRUE)
library(plm); library(lmtest); require(tidyverse)

Zweitens einige Datenaufbereitung,

data(egsingle, package = "mlmRev")
dta <-  egsingle %>% mutate(Female = recode(female,.default = 0L,`Female` = 1L))

Drittens schätze ich eine Reihe von Modellen für jedes Geschlecht in Daten

MoSpc <- as.formula(math ~ Female + size + year)
dfMo = dta %>% group_by(female) %>%
    do(fitMo = plm(update(MoSpc, . ~ . -Female), 
       data = ., index = c("childid", "year", "schoolid"), model="within") )

Schauen wir uns zunächst die beiden geschätzten Modelle an.

texreg::screenreg(dfMo[[2]], custom.model.names = paste0('FE: ', dfMo[[1]]))
#> ===================================
#>            FE: Female   FE: Male   
#> -----------------------------------
#> year-1.5      0.79 ***     0.88 ***
#>              (0.07)       (0.10)   
#> year-0.5      1.80 ***     1.88 ***
#>              (0.07)       (0.10)   
#> year0.5       2.51 ***     2.56 ***
#>              (0.08)       (0.10)   
#> year1.5       3.04 ***     3.17 ***
#>              (0.08)       (0.10)   
#> year2.5       3.84 ***     3.98 ***
#>              (0.08)       (0.10)   
#> -----------------------------------
#> R^2           0.77         0.79    
#> Adj. R^2      0.70         0.72    
#> Num. obs.  3545         3685       
#> ===================================
#> *** p < 0.001, ** p < 0.01, * p < 0.05    #> 

Nun möchte ich testen, ob sich diese beiden (linearen OLS) Modelle signifikant unterscheiden, vgl. Punkt 1 oben. Ich habe mich in SO und im Internet umgesehen und einige schlagen vor, dass ich verwenden muss plm::pFtest(), auch hier vorgeschlagen , was ich versucht habe, aber ich bin nicht überzeugt. Ich hätte mir einen Test für nicht verschachtelte Modelle vorgestellt, einen möglichen Cox-Test, lmtest::coxtestbin mir aber überhaupt nicht sicher. Wenn mir hier jemand helfen könnte.

Ich habe es versucht,

plm::pFtest(dfMo[[1,2]], dfMo[[2,2]])
# >
# > F test for individual effects
# >
# >data:  update(MoSpc, . ~ . - Female)
# >F = -0.30494, df1 = 113, df2 = 2693, p-value = 1
# >alternative hypothesis: significant effects

und,

lmtest::coxtest(dfMo[[1,2]], dfMo[[2,2]])
# > Cox test
# > 
# > Model 1: math ~ size + year
# > Model 2: math ~ size + year
# >                 Estimate Std. Error    z value Pr(>|z|)    
# > fitted(M1) ~ M2     0.32    1.66695     0.1898   0.8494    
# > fitted(M2) ~ M1 -1222.87    0.13616 -8981.1963   <2e-16 ***
# > ---
# > Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# > Warning messages:
# > 1: In lmtest::coxtest(dfMo[[1, 2]], dfMo[[2, 2]]) :
# >   models fitted on different subsets
# > 2: In lmtest::coxtest(dfMo[[1, 2]], dfMo[[2, 2]]) :
# >   different dependent variables specified

Zweitens bin ich daran interessiert, Regressionskoeffizienten zwischen zwei Gruppen zu vergleichen. Angenommen, unterscheidet sich die Schätzung für year1.53,04 signifikant von 3,17? Vgl. Punkt 2 oben.

Bitte fragen Sie, ob einer der oben genannten Punkte nicht klar ist, und ich werde ihn gerne näher erläutern. Jede Hilfe wird sehr geschätzt!

Mir ist klar, dass diese Frage ein bisschen programmiert ist, aber ich habe sie ursprünglich in SO gepostet. Allerdings Dwin war nett genug , um darauf hinzuweisen, dass die Frage in CrossValidated gehörte und migriert sie hier.

Eric Fail
quelle
@ DWin, danke. Ich habe es in SO gepostet, da ich zuvor auf stackoverflow.com einige wirklich gute Antworten zu diesen plmModelltypen und dem Paket erhalten habe. Ich werde in Zukunft mehr darauf achten, meine Fragen an der richtigen Stelle zu stellen. Vielen Dank.
Eric Fail
2
Denken Sie nicht, dass der F-Test hier funktionieren würde, da Ihre aktuellen zwei Modelle (weiblich und männlich) nicht verschachtelt sind. Warum nicht run plm mit Interaktionstermen zwischen weiblichen und erklärenden Variablen einschließen, z plm(math ~ Female * (x1 + x2)). Um die erste Nullhypothese zu testen, führen Sie einfach den F-Test für alle Koeffizienten aus, die mit Female:x1, Female:x2. Um die zweite Null zu testen, müssen Sie nur den zugeordneten Parameter testen Female:year1.5.
Semibruin
1
Danke für deinen Kommentar. Ich stimme zu, dass der F-Test hier nicht angemessen ist. Ich freue mich über Ihren Vorschlag, muss ihn jedoch in einem Kontext umsetzen, in dem die Interaktionslösung möglicherweise nicht realisierbar ist. Wenn Sie jedoch Zeit haben, empfehle ich Ihnen, Ihre Lösung als Antwort zu veröffentlichen. Vielleicht inspiriert es andere, die ein ähnliches Problem haben.
Eric Fail
1
Ich bin kürzlich auch auf dieses Problem gestoßen, konnte es aber in R nicht lösen. Ich habe damals Stata verwendet, wo wir anwenden können, um suestzu sehen, ob zwei Modelle sich signifikant unterscheiden. Es gibt eine suest()Funktion in einem Paket für R, aber ich bezweifle, dass es dasselbe ist. In Stata suestist verwandt mit "scheinbar nicht verwandter Schätzung". Beachten Sie, dass suregdas etwas anders ist. Ich interessiere mich auch für eine R-Lösung. Hoffe das würde irgendwie helfen.
Jay.sf
1
@ jaySf, danke für deine Eingabe. Vielleicht müssen wir wandern diese Frage zurück zu stackoverflow.com um herauszufinden , wie dies in geschieht r . Ich habe seit Jahren keine Stata mehr benutzt . Könnten Sie möglicherweise auf eine Dokumentation verweisen? Vielen Dank.
Eric Fail

Antworten:

3

FemaleβF.emeinle=βM.einleplmβF.emeinle::yeeinr=1.5=βM.einle::yeeinr=1.5year=1.5beträgt der p-Wert 0,32.

library(plm)  # Use plm
library(car)  # Use F-test in command linearHypothesis
library(tidyverse)
data(egsingle, package = 'mlmRev')
dta <- egsingle %>% mutate(Female = recode(female, .default = 0L, `Female` = 1L))
plm1 <- plm(math ~ Female * (year), data = dta, index = c('childid', 'year', 'schoolid'), model = 'within')

# Output from `summary(plm1)` --- I deleted a few lines to save space.
# Coefficients:
#                 Estimate Std. Error t-value Pr(>|t|)    
# year-1.5          0.8842     0.1008    8.77   <2e-16 ***
# year-0.5          1.8821     0.1007   18.70   <2e-16 ***
# year0.5           2.5626     0.1011   25.36   <2e-16 ***
# year1.5           3.1680     0.1016   31.18   <2e-16 ***
# year2.5           3.9841     0.1022   38.98   <2e-16 ***
# Female:year-1.5  -0.0918     0.1248   -0.74     0.46    
# Female:year-0.5  -0.0773     0.1246   -0.62     0.53    
# Female:year0.5   -0.0517     0.1255   -0.41     0.68    
# Female:year1.5   -0.1265     0.1265   -1.00     0.32    
# Female:year2.5   -0.1465     0.1275   -1.15     0.25    
# ---

xnames <- names(coef(plm1)) # a vector of all independent variables' names in 'plm1'
# Use 'grepl' to construct a vector of logic value that is TRUE if the variable
# name starts with 'Female:' at the beginning. This is generic, to pick up
# every variable that starts with 'year' at the beginning, just write
# 'grepl('^year+', xnames)'.
picked <- grepl('^Female:+', xnames)
linearHypothesis(plm1, xnames[picked])

# Hypothesis:
# Female:year - 1.5 = 0
# Female:year - 0.5 = 0
# Female:year0.5 = 0
# Female:year1.5 = 0
# Female:year2.5 = 0
# 
# Model 1: restricted model
# Model 2: math ~ Female * (year)
# 
#   Res.Df Df Chisq Pr(>Chisq)
# 1   5504                    
# 2   5499  5  6.15       0.29
Semibruin
quelle
Sehr interessant. Ich werde es an meinen Produktionsdaten versuchen. Vielen Dank. Sie können die gleiche Antwort hier auf stackoverflow.com/questions/28334298/… posten und dort auch das Kopfgeld erhalten.
Eric Fail
Kurze Frage: Glauben Sie, dass es möglich ist, den -c(1:5)Block so umzuschreiben , dass der Code allgemeiner wird? Ich habe wechselnde Größenvektoren, die ein- und ausgehen, und eine allgemeinere Antwort würde möglicherweise auch anderen zugute kommen.
Eric Fail
@EricFail Ich habe durch -c(1:5)regulären Ausdruck ersetzt. Es ist jetzt allgemeiner. Im Allgemeinen möchten Sie greplMuster bei Vorhandensein vieler Variablen abgleichen.
Semibruin