plm 中只有两个 ID 时出现重复对(id-time)错误

Jen*_*ens 2 r dataset duplicates plm

我正在尝试使用 plm 包运行固定效应回归。回归代码如下:

fixed = plm(hp~crime,index=c('year','country'),data=data,model='within')
Run Code Online (Sandbox Code Playgroud)

它返回以下错误代码:

pdim.default(index[[1]], index[[2]]) 中的错误:重复对(id-time)

我在网上搜索过,包括stackoverflow。我的理解是,plm 只能使用两个 ID 运行,因此,如果您有多个 ID,您将如何通过在索引之前合并这些 ID 来“欺骗”plm。 但是,我的数据仅包含以下列:国家、年份、生命值和犯罪,所以我不明白这是怎么可能的。

本质上我要问的是,我做错了什么吗?我是否仍然需要合并这两个 ID,或者是我的行重复项中有问题,如果是这种情况,是否可以通过编码找到重复项?(我手动尝试查看我的面板数据以查找 ID 的重复项,即国家 1 第 1 年房价的几个值。

如果我跑

any(table(data$country,data$year)!=1) 
Run Code Online (Sandbox Code Playgroud)

我明白了。据我所知,这表明国家+年份组合没有任何重复。

jay*_*.sf 6

考虑以下适当的数据。

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
Run Code Online (Sandbox Code Playgroud)

现在让我们复制最后一行来模拟数据中的缺陷,

(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)
Run Code Online (Sandbox Code Playgroud)

我们得到一个错误:

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

类似地,如果我们有包含id,time和一些condition 的数据,我们会得到一个错误:

(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)
Run Code Online (Sandbox Code Playgroud)

为了克服这个问题,我们可以从技术上合并两个指数,无论这在统计上意味着什么:

(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
Run Code Online (Sandbox Code Playgroud)

最后,这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
Run Code Online (Sandbox Code Playgroud)