membandingkan kelompok dalam pengukuran FE model berulang, dengan komponen kesalahan bersarang, diperkirakan menggunakan plm


8

Saya memperkirakan beberapa tindakan berulang model Fixed Effects, dengan komponen kesalahan bersarang, berdasarkan pada variabel pengelompokan, yaitu model non-bersarang, menggunakan . Saya sekarang tertarik

  1. uji apakah model lengkap berbeda secara signifikan, yaitu mana adalah model lengkap untuk dan adalah model lengkap untuk dan
    HHai:βFemSebuahle=βM.Sebuahle
    βFemSebuahleFemalesβM.SebuahleMales
  2. selanjutnya menguji koefisien regresi yang dipilih antara dua kelompok, yaitu mana adalah koefisien regresi untuk wanita at , dan adalah koefisien regresi untuk pria di .
    HHai:βFemSebuahle==yeSebuahr1.5=βM.Sebuahle==yeSebuahr1.5
    βFemSebuahle==yeSebuahr1.5year1.5βM.Sebuahle==yeSebuahr1.5year1.5

Saya akan menggambarkan situasi menggunakan contoh kerja di bawah ini,

Pertama, beberapa paket dibutuhkan,

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

Kedua, beberapa persiapan data,

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

Ketiga, saya memperkirakan satu set model untuk setiap gender dalam data

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

Keempat, mari kita lihat dua model yang diperkirakan,

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

Sekarang, saya ingin menguji apakah kedua model (OLS linear) ini berbeda secara signifikan, lih. point1 di atas. Saya melihat - lihat SO dan internet dan beberapa menyarankan bahwa saya perlu menggunakan plm::pFtest(), juga menyarankan di sini , yang telah saya coba, tetapi saya tidak yakin. Saya akan membayangkan beberapa tes untuk model non-bersarang, tes Cox mungkin lmtest::coxtest,, tapi saya tidak yakin sama sekali. Jika seseorang di sini mungkin bisa membantu saya.

Saya mencoba,

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

dan,

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

Kedua, saya tertarik untuk membandingkan koefisien regresi antara dua kelompok. Katakanlah, apakah estimasi untuk year1.53.04 berbeda secara signifikan dari 3.17? Lih poin 2 di atas.

Silakan tanyakan apakah ada di atas yang tidak jelas dan saya akan dengan senang hati menjelaskan. Bantuan apa pun akan sangat dihargai!

Saya menyadari pertanyaan ini agak seperti pemrograman, tetapi saya awalnya mempostingnya di SO. Namun, DWin cukup baik untuk menunjukkan bahwa pertanyaan itu milik CrossValidated dan memigrasikannya di sini.


@Din, Terima kasih. Saya mempostingnya di SO karena saya sebelumnya mendapatkan beberapa jawaban yang sangat bagus mengenai model-model ini, dan plmpaketnya, di stackoverflow.com. Saya akan lebih berhati-hati di masa depan untuk mengirim pertanyaan saya di tempat yang tepat. Terima kasih.
Eric Fail

2
Jangan berpikir uji F akan bekerja di sini, karena dua model Anda saat ini (wanita dan pria) tidak bersarang. Mengapa tidak menyertakan run plm dengan istilah interaksi antara variabel wanita dan penjelasan, mis plm(math ~ Female * (x1 + x2)). Untuk menguji hipotesis nol pertama, Anda hanya menjalankan uji F untuk semua koefisien yang berhubungan dengan Female:x1, Female:x2. Untuk menguji null kedua, Anda hanya perlu menguji parameter yang terkait Female:year1.5.
semibruin

1
Terima kasih atas komentarmu. Saya setuju, berkenaan dengan uji-F yang tidak sesuai di sini. Saya menghargai saran Anda, tetapi saya harus menerapkan ini dalam konteks di mana solusi interaksi mungkin tidak layak. Namun, jika Anda punya waktu, saya sarankan Anda memposting solusi Anda sebagai jawaban. Mungkin itu akan menginspirasi orang lain yang memiliki masalah serupa.
Eric Fail

1
Saya baru-baru ini datang tentang masalah ini juga, tetapi tidak bisa menyelesaikannya di R. Saya kemudian menggunakan Stata, di mana kita dapat mendaftar suestuntuk melihat apakah dua model berbeda secara signifikan. Ada suest()fungsi di dalam sebuah paket untuk R tapi saya ragu itu sama. Dalam Stata suestterkait dengan "Perkiraan yang tampaknya tidak terkait". Catatan, itu suregagak berbeda. Saya juga tertarik dengan solusi R. Semoga itu bisa membantu.
jay.sf

1
@ jaySf, terima kasih atas masukan Anda. Mungkin kita perlu memigrasi pertanyaan ini kembali ke stackoverflow.com untuk mencari tahu bagaimana hal ini dilakukan di r . Saya sudah bertahun-tahun tidak menggunakan stata . Bisakah Anda menunjuk ke beberapa dokumentasi? Terima kasih.
Eric Fail

Jawaban:


3

Kode berikut menerapkan praktik menempatkan interaksi antara Femaleboneka dan tahun. Tes F di bagian bawah menguji nol AndaβFemSebuahle=βM.Sebuahle. Statistik-t dari plmoutput menguji null AndaβFemSebuahle:yeSebuahr=1.5=βM.Sebuahle:yeSebuahr=1.5. Khususnya, untuk year=1.5, nilai-p adalah 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

Sangat menarik. Saya akan mencobanya pada data produksi saya. Terima kasih. Anda dapat memposting jawaban yang sama di sini stackoverflow.com/questions/28334298/… dan dapatkan hadiahnya di sana juga.
Eric Fail

Pertanyaan singkat, apakah menurut Anda dimungkinkan untuk menulis ulang -c(1:5)blok dengan cara yang membuat kode lebih umum? Saya memiliki vektor ukuran bergeser masuk dan keluar dan jawaban yang lebih umum mungkin juga bermanfaat bagi orang lain.
Eric Fail

@EricFail saya diganti -c(1:5)dengan ekspresi reguler. Sekarang lebih umum. Secara umum, Anda ingin menggunakan grepluntuk mencocokkan pola di hadapan banyak variabel.
semibruin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.