我想估计R中面板模型的群集SE(第一个差异),有100个群体,6,156个人和15年。一些 个人被重复(4,201独特),因为他们是一个人的一部分 匹配样本与一对一获得,具有替换,匹配 方法。 之后我一直用plm来估计模型系数 使用indivuals将我匹配的样本转换为pdata.frame 和年份作为索引。我也能够估计集群 使用vcovHC功能在个人级别上出现标准错误。 但是,这些人聚集在这些群体中,并且 因此,我希望聚集在更高级别的聚合上 而不是在个人层面。不幸的是,我不清楚如何 继续。当然,如果我替换个人的团体 index我重复了row.names然后我无法估计面板 模型与plm。我收到以下错误消息:
row.names中的错误< - .data.frame( tmp ,值= c(“1-1”,“1-1”, “1-1”,:不允许重复'row.names'
为简单起见,我使用以下示例(复制 来自:http://www.richard-bluhm.com/clustered-ses-in-r-and-stata-2/):
#require packages
require(plm)
require(lmtest)
# get data and load as pdata.frame
url <- "http://www.kellogg.northwestern.edu/faculty/petersen/htm/paper/se/test_data.txt"
p.df <- read.table(url)
names(p.df) <- c("firmid", "year", "x", "y")
#Introduce group (State) Id
p.df$State <- rep(1:100, each=50)
p.df2 <- pdata.frame(p.df, index = c("State", "year"), drop.index = F, row.names = T)
# fit model with plm
pm1 <- plm(y ~ x, data = p.df2, model = "within") #this is where the error occurs.
提前致谢!
答案 0 :(得分:2)
当我遇到同样的问题时,我写了一个包(clubTamal
)。 multiwayvcov
将plm对象(通过重新估计)转换为lm对象,以便能够使用teh plm
包对标准错误进行聚类。您可以在此处找到Rpubs示例和文档:https://rpubs.com/eliascis/clubTamal。
该程序包适用于使用固定效果(model='within'
)或第一差异模型(model='fd'
)的vcovTamal
估算。
要获得聚簇协方差矩阵,请使用library(devtools)
install_github("eliascis/clubTamal")
命令。
该软件包仍在开发中,但可以直接从github安装:
spd4testing
不幸的是,您的示例数据的链接不起作用,但clubTamal进一步安装了##packages
library(foreign)
library(lmtest)
library(plm)
library(multiwayvcov)
library(spd4testing)
library(clubTamal)
?spd4testing
?vcovTamal
##simulated data
d<-spd4testing()
##formula
f<- formula(y ~ x + factor(year))
##standard estimation
e<-plm(formula=f,data=d,model="fd")
summary(e)
e<-plm(formula=f,data=d,model="within")
summary(e)
##clustering
#no clustering
v<-e$vcov
coeftest(e)
#clustering at id level with plm-package
v<-vcovHC(e,type="HC1",cluster="group",tol=1*10^-20 )
coeftest(e,v)
##clustering at group level with clubTamal
v<-vcovTamal(estimate=e,data=d,groupvar="gid")
coeftest(e,v)
,它构建了一个模拟的小面板数据集用于测试目的。
library(gplots)
dat <- read.csv("Baguio.csv", header=TRUE)
mat_data<-data.matrix(dat)
my_palette <- colorRampPalette(c("blue","white","red"))(200)
breaks=c(seq(-100,-1,length=100),0,seq(1,100,length=100))
png("heatmap.png", # create PNG for the heat map
width = 5*300, # 5 x 300 pixels
height = 5*300,
res = 300, # 300 pixels per inch
pointsize = 8) # smaller font size
heatmap.2(mat_data,
main = "test", # heat map title
notecol="black", # change font color of cell labels to black
density.info="none", # turns off density plot inside color legend
trace="none", # turns off trace lines inside the heat map
margins =c(5,5), # widens margins around plot
col=my_palette,
breaks=breaks,
dendrogram="none",
symkey=F, xlab="Year", ylab="Date",
Colv="NA",Rowv="NA") # turn off column clustering
dev.off() # close the PNG device