plm 中只有两个 ID 的重复对(id-time)错误
duplicate couples (id-time) error in plm with only two IDs
我正在尝试 运行 使用 plm 包进行固定效应回归。回归代码如下:
fixed = plm(hp~crime,index=c('year','country'),data=data,model='within')
其中returns以下错误代码:
错误 pdim.default(index[[1]], index[[2]]) : 重复对 (id-time)
我已经在网上搜索过,包括 Whosebug。我的理解是 plm 只能 运行 有两个 ID,所以如果你有多个 ID,你将如何 'cheat' plm 通过在索引之前合并它们。
但是,我的数据只包含以下列:国家、年份、生命值和犯罪率,所以我不明白这是怎么可能的。
本质上我要问的是,我做错了什么吗?我是否仍需要合并这两个 ID,或者是我的行重复项中的错误,如果是这种情况,是否可以通过编码找到重复项? (我手动尝试查看我的面板数据以查找 ID 的重复项,即国家 1 第 1 年房价的几个值。
如果我运行
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
现在让我们复制最后一行来模拟数据中的缺陷,
(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
我正在尝试 运行 使用 plm 包进行固定效应回归。回归代码如下:
fixed = plm(hp~crime,index=c('year','country'),data=data,model='within')
其中returns以下错误代码:
错误 pdim.default(index[[1]], index[[2]]) : 重复对 (id-time)
我已经在网上搜索过,包括 Whosebug。我的理解是 plm 只能 运行 有两个 ID,所以如果你有多个 ID,你将如何 'cheat' plm 通过在索引之前合并它们。 但是,我的数据只包含以下列:国家、年份、生命值和犯罪率,所以我不明白这是怎么可能的。
本质上我要问的是,我做错了什么吗?我是否仍需要合并这两个 ID,或者是我的行重复项中的错误,如果是这种情况,是否可以通过编码找到重复项? (我手动尝试查看我的面板数据以查找 ID 的重复项,即国家 1 第 1 年房价的几个值。
如果我运行
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
现在让我们复制最后一行来模拟数据中的缺陷,
(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