Причина использования опции 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