ошибка повторяющихся пар (id-time) в plm только с двумя идентификаторами - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь запустить регрессию с фиксированными эффектами, используя пакет plm. Код регрессии выглядит следующим образом:

fixed = plm(hp~crime,index=c('year','country'),data=data,model='within')

, который возвращает следующий код ошибки:

ошибка в pdim.default (index [[1]], index [[2] ]): повторяющиеся пары (id-time)

Я искал в Интернете, включая stackoverflow. Я понимаю, что plm может работать только с двумя идентификаторами, поэтому, если у вас несколько идентификаторов, вы сможете «обмануть» plm, объединив их перед индексацией. Однако мои данные состоят только из столбцов: страна, год, здоровье и преступность, поэтому я не понимаю, как это возможно.

По сути, то, что я спрашиваю, делаю ли я что-то не так? Мне все еще нужно объединить эти два идентификатора, или это ошибка в моих дубликатах моих строк, если это так, возможно ли найти дубликаты с помощью кодирования? (Я попытался вручную просмотреть данные своей панели, чтобы найти дубликаты идентификаторов, то есть несколько значений цен на жилье за ​​год 1 для страны 1.

Если я запустил

any(table(data$country,data$year)!=1) 

, я получаю ВЕРНО. Насколько я понимаю, это показывает, что нет никаких дубликатов комбинации страна + год.

1 Ответ

1 голос
/ 07 мая 2020

Рассмотрим следующие подходящие данные.

set.seed(42)
(d1 <- transform(expand.grid(id=1:2, time=1:2), X=rnorm(4), y=rnorm(4)))
#   id time          X           y
# 1  1    1  1.3709584  0.40426832
# 2  2    1 -0.5646982 -0.10612452
# 3  1    2  0.3631284  1.51152200
# 4  2    2  0.6328626 -0.09465904

library(plm)
plm(y ~ X, index=c("id", "time"), d1)
# works

Теперь давайте продублируем последнюю строку, чтобы смоделировать ошибку в данных,

(d1 <- rbind(d1, d1[nrow(d1), ]))
#    id time          X           y
# 1   1    1  1.3709584  0.40426832
# 2   2    1 -0.5646982 -0.10612452
# 3   1    2  0.3631284  1.51152200
# 4   2    2  0.6328626 -0.09465904
# 41  2    2  0.6328626 -0.09465904  ## duplicated (X and y may be different though)

, где мы получим ошибку:

plm(y ~ X, index=c("id", "time"), d1)
# Error in pdim.default(index[[1]], index[[2]]) : 
#   duplicate couples (id-time)

Точно так же мы получаем ошибку, если у нас есть данные с id, time и некоторыми cond ition:

(d2 <- transform(expand.grid(id=1:2, time=1:2, cond=0:1), X=rnorm(4), y=rnorm(4)))
#   id time cond          X          y
# 1  1    1    0  2.0184237 -1.3888607
# 2  2    1    0 -0.0627141 -0.2787888
# 3  1    2    0  1.3048697 -0.1333213
# 4  2    2    0  2.2866454  0.6359504
# 5  1    1    1  2.0184237 -1.3888607
# 6  2    1    1 -0.0627141 -0.2787888
# 7  1    2    1  1.3048697 -0.1333213
# 8  2    2    1  2.2866454  0.6359504


plm(y ~ X, index=c("id", "time"), d2)
# Error in pdim.default(index[[1]], index[[2]]) : 
#   duplicate couples (id-time)

Чтобы преодолеть это, мы можем технически объединить два индекса , что бы это ни значило статистически:

(d2 <- transform(d2, id2=apply(d2[c("id", "cond")], 1, paste, collapse=".")))
#   id time cond          X          y id2
# 1  1    1    0  2.0184237 -1.3888607 1.0
# 2  2    1    0 -0.0627141 -0.2787888 2.0
# 3  1    2    0  1.3048697 -0.1333213 1.0
# 4  2    2    0  2.2866454  0.6359504 2.0
# 5  1    1    1  2.0184237 -1.3888607 1.1
# 6  2    1    1 -0.0627141 -0.2787888 2.1
# 7  1    2    1  1.3048697 -0.1333213 1.1
# 8  2    2    1  2.2866454  0.6359504 2.1

plm(y ~ X, index=c("id2", "time"), d2)
# works

В конце, это stopifnot должно не выдавать ошибку, где c("id", "time") соответствует тому, что вы определили в plm(..., index=c("id", "time")):

stopifnot(!any(duplicated(d1[c("id", "time")])))
# Error: !any(duplicated(d1[c("id", "time")])) is not TRUE
...