plm: Исправлена ​​регрессия эффектов - порядок индекса / идентификатора - PullRequest
2 голосов
/ 09 января 2020

Я запускаю регрессии с фиксированными эффектами, используя пакет plm. Почему и как порядок кода идентификации влияет на регрессию?

Я использовал эти коды для запуска регрессий, которые отличаются только между порядком кода идентификатора Company и Year.

Код:

MV_Year <- plm (MVlog ~ LEV + Size + DY + RDlog
                , data=Values, model="within", index= c("Year","Company"))


MV_Company <- plm (MVlog ~ LEV + Size + DY + RDlog,
                   data=Values, model="within", index= c("Company", "Year"))

Соответствующие выходы: MV_Year:

Oneway (individual) effect Within Model

Call:
plm(formula = MVlog ~ LEV + Size + DY + RDlog, data = Values, 
    model = "within", index = c("Year", "Company"))

Unbalanced Panel: n = 17, T = 557-4280, N = 29890

Residuals:
     Min.   1st Qu.    Median   3rd Qu.      Max. 
-5.250901 -0.457100  0.015763  0.476140  6.006483 

Coefficients:
         Estimate  Std. Error t-value Pr(>|t|)    
LEV   -1.95485031  0.04060539 -48.143  < 2e-16 ***
Size   0.75233709  0.00314849 238.952  < 2e-16 ***
DY    -0.00033192  0.00013482  -2.462  0.01382 *  
RDlog  0.13148626  0.00300509  43.755  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Total Sum of Squares:    102610
Residual Sum of Squares: 17568
R-Squared:      0.82879
Adj. R-Squared: 0.82868
F-statistic: 36148 on 4 and 29869 DF, p-value: < 2.22e-16

MV_Company

Oneway (individual) effect Within Model

Call:
plm(formula = MVlog ~ LEV + Size + DY + RDlog, data = Values, 
    model = "within", index = c("Company", "Year"))

Unbalanced Panel: n = 5911, T = 1-17, N = 29890

Residuals:
    Min.  1st Qu.   Median  3rd Qu.     Max. 
-4.35967 -0.38711  0.00000  0.40528  5.48624 

Coefficients:
         Estimate  Std. Error  t-value Pr(>|t|)    
LEV   -1.88958140  0.04392991 -43.0135  < 2e-16 ***
Size   0.74650676  0.00375926 198.5782  < 2e-16 ***
DY    -0.00034308  0.00014585  -2.3524  0.01866 *  
RDlog  0.13904360  0.00331886  41.8950  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Total Sum of Squares:    58168
Residual Sum of Squares: 12747
R-Squared:      0.78085
Adj. R-Squared: 0.72679
F-statistic: 21356.2 on 4 and 23975 DF, p-value: < 2.22e-16

Почему выходы имеют такие маленькие Различия между разными оценками и R ^ 2?

1 Ответ

0 голосов
/ 09 января 2020

Причина использования опции index= заключается в том, что plm() внутренне использует pdata.frame(), что предполагает, что первый столбец будет "id", а второй столбец - "time", если соответствующие имена не указаны index=(<id>, <time>)

С ?pdata.frame мы можем прочитать:

Аргумент индекса указывает размеры панели. Это может быть:

  • вектор из двух символьных строк, который содержит имена отдельных и временных индексов,
  • символьная строка, которая является именем отдельной индексной переменной , В этом случае индекс времени создается автоматически, и
    добавляется новая переменная, называемая «время», предполагая последовательные и
    возрастающие периоды времени в порядке исходных данных, ...

Следующий пример поможет нам понять это. Сначала мы загружаем данные Grunfeld, которые выглядят следующим образом.

library(plm)
data(Grunfeld)
head(Grunfeld, 3)
#   firm year   inv  value capital
# 1    1 1935 317.6 3078.5     2.8
# 2    1 1936 391.8 4661.7    52.6
# 3    1 1937 410.6 5387.1   156.9

Первый столбец - это идентификатор, второй столбец - время. Давайте оценим модель.

summary(plm(inv ~ value + capital, data=Grunfeld,
            model="within"))$coe
#          Estimate Std. Error   t-value     Pr(>|t|)
# value   0.1101238 0.01185669  9.287901 3.921108e-17
# capital 0.3100653 0.01735450 17.866564 2.220007e-42

Теперь, когда мы перепутали первый и второй столбцы,

summary(plm(inv ~ value + capital, data=Grunfeld[c(2, 1, 3:5)],
            model="within"))$coe
#          Estimate  Std. Error   t-value     Pr(>|t|)
# value   0.1167978 0.006331302 18.447672 3.586220e-43
# capital 0.2197066 0.032296107  6.802881 1.503653e-10

результат будет другим. Но когда мы сообщаем plm на index=(<id>, <time>), какие столбцы использовать,

summary(plm(inv ~ value + capital, data=Grunfeld[c(2, 1, 3:5)], 
            index=c("firm", "year"),
            model="within"))$coe
#          Estimate Std. Error   t-value     Pr(>|t|)
# value   0.1101238 0.01185669  9.287901 3.921108e-17
# capital 0.3100653 0.01735450 17.866564 2.220007e-42

мы получаем старый результат. Если мы полностью перепутаем столбцы,

summary(plm(inv ~ value + capital, data=Grunfeld[c(3:5, 1, 2)],
            model="within"))$coe
# Error 

plm() действительно запутан :) Но, как и прежде, когда мы помогаем plm(), он ведет себя как ожидалось и снова возвращает right результат.

summary(plm(inv ~ value + capital, data=Grunfeld[c(3:5, 1, 2)], 
            index=c("firm", "year"),
            model="within"))$coe
#          Estimate Std. Error   t-value     Pr(>|t|)
# value   0.1101238 0.01185669  9.287901 3.921108e-17
# capital 0.3100653 0.01735450 17.866564 2.220007e-42

Обратите внимание, , что вы на самом деле просто рассчитываете фиксированные эффекты компании. Если вы намереваетесь рассчитать модель с фиксированными и устойчивыми по годам эффектами, давайте сделаем это как модель LSDV:

summary(lm(inv ~ value + capital + factor(firm) + factor(year) - 1, Grunfeld))$coe[1:2, ]
#          Estimate Std. Error   t value     Pr(>|t|)
# value   0.1177159 0.01375128  8.560354 6.652575e-15
# capital 0.3579163 0.02271901 15.754043 5.453066e-35

, мы увидим, что значения отличаются от приведенных выше, поскольку plm просто включали твердый фиксированный эффект до сих пор, см .:

summary(lm(inv ~ value + capital + factor(firm) - 1, Grunfeld))$coe[1:2, ]
#          Estimate Std. Error   t value     Pr(>|t|)
# value   0.1101238 0.01185669  9.287901 3.921108e-17
# capital 0.3100653 0.01735450 17.866564 2.220007e-42

Чтобы получить его правильно, нам также необходимо указать effect="twoways", чтобы получить устойчивые и годичные фиксированные эффекты.

summary(plm(inv ~ value + capital, data=Grunfeld,
            index=c("firm", "year"),
            model="within", effect="twoways"))$coe
#          Estimate Std. Error   t-value     Pr(>|t|)
# value   0.1177159 0.01375128  8.560354 6.652575e-15
# capital 0.3579163 0.02271901 15.754043 5.453066e-35
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...