confronto di gruppi in modelli FE di misure ripetute, con un componente di errore nidificato, stimato utilizzando plm


8

Ho stimato alcune misure ripetute Modelli di effetti fissi, con un componente di errore nidificato, basato su variabili di raggruppamento, ovvero modelli non nidificati, utilizzando . Ora sono interessato a

  1. verifica se i modelli completi sono significativamente diversi, ad es
    Ho:βFemun'le=βMun'le
    dove βFemun'leè il modello completo per FemaleseβMun'leè il modello completo per Malese
  2. successivamente testare i coefficienti di regressione selezionati tra due gruppi, ad es
    Ho:βFemun'le==yeun'r1.5=βMun'le==yeun'r1.5
    dove βFemun'le==yeun'r1.5è il coefficiente di regressione per le femmine a year1.5, eβMun'le==yeun'r1.5è il coefficiente di regressione per i maschi a year1.5.

Illustrerò la situazione usando l'esempio di lavoro qui sotto,

Innanzitutto, sono necessari alcuni pacchetti,

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

In secondo luogo, alcuni preparazione dei dati,

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

In terzo luogo, stima una serie di modelli per ciascun genere di dati

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") )

Avanti, diamo un'occhiata ai due modelli stimati,

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    #> 

Ora, voglio verificare se questi due modelli (OLS lineari) sono significativamente diversi, cfr. punto 1 sopra. Ho guardato in giro SO e Internet e alcuni suggeriscono che devo usare plm::pFtest(), anche suggerito qui , che ho provato, ma non sono convinto. Avrei immaginato qualche test per modelli non nidificati, possibile test Cox lmtest::coxtest, ma non ne sono affatto sicuro. Se qualcuno qui potesse aiutarmi.

Provai,

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

e,

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

In secondo luogo, sono interessato a confrontare i coefficienti di regressione tra due gruppi. Supponiamo che la stima year1.5di 3.04 sia significativamente diversa da 3.17? Cf. punto 2 sopra.

Si prega di chiedere se uno dei precedenti non è chiaro e sarò felice di elaborare. Qualsiasi aiuto sarà molto apprezzato!

Mi rendo conto che questa domanda è un po 'programmabile, ma inizialmente l'ho pubblicata in SO. Tuttavia, DWin è stato così gentile da sottolineare che la domanda apparteneva a CrossValidated e la ha migrata qui.


@ Grazie, grazie. L'ho pubblicato in SO poiché in precedenza ho ottenuto alcune risposte davvero buone riguardo a questo tipo di modelli e al plmpacchetto, su stackoverflow.com. In futuro mi prenderò più cura di pubblicare le mie domande nel posto giusto. Grazie.
Eric Fail,

2
Non pensare che il test F funzionerebbe qui, poiché i tuoi due modelli attuali (maschio e femmina) non sono nidificati. Perché non includere run plm con termini di interazione tra variabili femminili ed esplicative, ad es plm(math ~ Female * (x1 + x2)). Per verificare la prima ipotesi nulla, basta eseguire test F per tutti i coefficienti associati Female:x1, Female:x2. Per testare il secondo null, devi solo t testare il parametro associato Female:year1.5.
semibruin,

1
Grazie per il tuo commento. Sono d'accordo, per quanto riguarda il test F non essere appropriato qui. Apprezzo il tuo suggerimento, ma devo implementarlo in un contesto in cui la soluzione di interazione potrebbe non essere fattibile. Tuttavia, se hai tempo, ti suggerisco di pubblicare la soluzione come risposta. Forse ispirerà gli altri che hanno un problema simile.
Eric Fail,

1
Di recente ho riscontrato anche questo problema, ma non sono stato in grado di risolverlo in R. Ho usato quindi Stata, dove possiamo fare domanda suestper vedere se due modelli sono significativamente diversi. C'è una suest()funzione in un pacchetto per R ma dubito che sia la stessa. In Stata suestè correlato a "Stima apparentemente non correlata". Nota, suregè un po 'diverso. Sono anche interessato a una soluzione R. Spero che possa aiutare in qualche modo.
jay.sf

1
@jaySf, grazie per il tuo contributo. Forse dovremmo migrare di nuovo questa domanda su stackoverflow.com per capire come si fa in r . Non uso più da anni. Potresti forse indicare un po 'di documentazione? Grazie.
Eric Fail,

Risposte:


3

Il codice seguente ha implementato la pratica di mettere l'interazione tra Femalemanichino e anno. Il test F in basso verifica il tuo nullβFemun'le=βMun'le. La statistica t plmdall'output verifica il tuo nullβFemun'le:yeun'r=1.5=βMun'le:yeun'r=1.5. In particolare, per year=1.5, il valore p è 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

Molto interessante. Lo proverò sui miei dati di produzione. Grazie. Puoi pubblicare la stessa risposta qui stackoverflow.com/questions/28334298/… e ottenere la ricompensa anche lì.
Eric Fail,

Domanda veloce, pensi che sia possibile riscrivere il -c(1:5)blocco in qualche modo per rendere il codice più generico? Ho dei vettori di dimensioni variabili che entrano ed escono e una risposta più generica potrebbe anche favorire gli altri.
Eric Fail,

@EricFail Ho sostituito -c(1:5)con espressione regolare. Ora è più generico. In generale, si desidera utilizzare greplper abbinare i pattern in presenza di molte variabili.
semibruin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.