R中面板数据的更高级别集群标准错误

时间:2017-06-14 12:23:31

标签: panel-data

我想估计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.

提前致谢!

1 个答案:

答案 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