R 只有两个id的plm中存在重复对(id时间)错误
我正在尝试使用plm包运行固定效果回归。回归代码如下所示:R 只有两个id的plm中存在重复对(id时间)错误,r,duplicates,dataset,plm,R,Duplicates,Dataset,Plm,我正在尝试使用plm包运行固定效果回归。回归代码如下所示: fixed = plm(hp~crime,index=c('year','country'),data=data,model='within') 返回以下错误代码: pdim.default(索引[[1]],索引[[2]])中出错:重复的对(id时间) 我在网上搜索过,包括stackoverflow。我的理解是plm只能使用两个ID运行,所以如果您有几个ID,您将了解如何在索引之前通过合并这些ID来“欺骗”plm。 然而,我的数据只包
fixed = plm(hp~crime,index=c('year','country'),data=data,model='within')
返回以下错误代码:
pdim.default(索引[[1]],索引[[2]])中出错:重复的对(id时间)
我在网上搜索过,包括stackoverflow。我的理解是plm只能使用两个ID运行,所以如果您有几个ID,您将了解如何在索引之前通过合并这些ID来“欺骗”plm。
然而,我的数据只包括国家、年份、hp和犯罪列,所以我不明白这是怎么可能的
本质上,我问的是,我做错什么了吗?我是否仍然需要合并这两个ID,或者错误是否在我的行的副本中,如果是这种情况,是否可能通过编码找到副本?(我已经手动查看了我的面板数据,以找到ID的副本,即第一年国家/地区的若干房价值
如果我跑
any(table(data$country,data$year)!=1)
我明白了。据我所知,这表明没有任何国家+年份组合的重复项。考虑以下适当的数据
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
类似地,如果我们有id
、time
和一些cond
条件的数据,我们会得到一个错误:
(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)
感谢您花时间回复!我相信过多的ID是错误的根源,但通过您的直觉,我能够快速解决问题!对于任何可能发现自己有类似问题的人,这展示了如何在大型数据集中找到重复的ID。
plm(y ~ X, index=c("id", "time"), d1)
# Error in pdim.default(index[[1]], index[[2]]) :
# duplicate couples (id-time)
(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(!any(duplicated(d1[c("id", "time")])))
# Error: !any(duplicated(d1[c("id", "time")])) is not TRUE