plmを使用して推定された、入れ子になったエラーコンポーネントを含む、反復測定FEモデルのグループの比較


8

を使用して、グループ化変数、つまり非ネストモデルに基づいて、ネストされたエラーコンポーネントを含むいくつかの反復測定Fixed Effectsモデルを推定し。今興味がある

  1. 完全なモデルが有意に異なる場合、テストは、すなわち満杯のためのモデルであるとの完全なモデルであり、そして β FのEのM A L E β M のL E
    HoβFeメートルale=βMale
    βFeメートルaleFemalesβMaleMales
  2. 続いて、2つのグループ間で選択した回帰係数をテストします。つまり、ここで、はの回帰係数ですat 、およびはatの男性の回帰係数です。
    HoβFeメートルale==year1.5=βMale==year1.5
    β M A L E = = Yは、電子R 1.5βFeメートルale==year1.5year1.5βMale==year1.5year1.5

以下の作業例を使用して状況を説明します。

まず、いくつかのパッケージが必要です、

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

第二に、いくつかのデータ準備、

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

3番目に、データの各性別のモデルのセットを推定します

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

第4に、2つの推定モデルを見てみましょう。

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

ここで、これら2つの(線形OLS)モデルが大幅に異なるかどうかをテストしたいと思います。上記のポイント1。私はSOとインターネットを見回し、一部は私が使用する必要があること示唆していますがplm::pFtest()ここでも提案されています。ネストされていないモデルのテスト、Coxテストの可能性などを想像していましたlmtest::coxtestが、まったくわかりません。ここの誰かが私を助けてくれるなら。

私は試した、

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

そして、

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

次に、2つのグループ間で回帰係数を比較することに興味があります。たとえば、year1.53.04 の推定値は3.17と大きく異なりますか?Cf. 上記のポイント2。

上記のいずれかが不明な場合は、お問い合わせください。詳しく説明させていただきます。どんな助けでも大歓迎です!

この質問は少しプログラミングに似ていると思いますが、最初はSOに投稿しました。ただし、DWinは、質問がCrossValidatedに属しており、ここに移行したことを指摘してくれました。


@DWin、ありがとう。私は以前に、このタイプのモデルとplmパッケージに関する非常に良い回答を得るために、stackoverflow.com でSOに投稿しました。質問は適切な場所に投稿するよう、今後さらに注意を払います。ありがとう。
Eric Fail

2
現在の2つのモデル(女性と男性)はネストされていないため、Fテストがここで機能するとは思わないでください。例として、女性と説明変数間の相互作用項を含むrun plmを含めないでくださいplm(math ~ Female * (x1 + x2))。最初の帰無仮説をテストするには、あなただけに関連付けられているすべての係数のためのF検定を実行しFemale:x1Female:x2。2番目のnullをテストするには、に関連付けられているパラメーターをテストするだけですFemale:year1.5
半ば

1
コメントありがとうございます。ここでは、F検定が適切でないことに同意します。私はあなたの提案に感謝しますが、相互作用ソリューションが実行可能でないかもしれない状況でこれを実装しなければなりません。ただし、時間がある場合は、回答としてソリューションを投稿することをお勧めします。多分それは同様の問題を抱えている他の人を刺激するでしょう。
Eric Fail

1
私も最近この問題について話しましたが、Rでは解決できませんでした。そのとき、suest2つのモデルが大幅に異なるかどうかを確認するために適用できるStataを使用しました。suest()Rのパッケージには関数が含まれていますが、同じであるとは思えません。スタタでsuestは「一見無関係な推定」に関連しています。これsuregは多少異なります。Rソリューションにも興味があります。それが何らかの形で役立つことを願っています。
jay.sf

1
@jaySf、ご意見ありがとうございます。多分、我々はする必要があります移動し、これが中で行われているか把握するstackoverflow.comにこの質問の背中を、R。私は何年もスタタを使用していません。おそらくいくつかのドキュメントを指すことができますか?ありがとう。
Eric Fail

回答:


3

FemaleβFeメートルale=βMaleplmβFeメートルaleyear=1.5=βMaleyear=1.5year=1.5、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

とても興味深い。本番データで試してみます。ありがとう。ここに同じ答えをスタックオーバーフロー.com / questions / 28334298 / …に投稿して、賞金を獲得することもできます。
Eric Fail

簡単な質問ですが-c(1:5)、コードをより一般的にするような方法でブロックを書き換えることは可能だと思いますか?私は出入りするサイズベクトルをシフトしていますが、より一般的な答えは他の人にも利益をもたらす可能性があります。
Eric Fail

@EricFail -c(1:5)正規表現に置き換えました。現在はより一般的です。一般に、grepl多くの変数の存在下でパターンを照合するために使用します。
18年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.