Clustered Standard Errors mit Daten, die NAs enthalten
Ich bin nicht in der Lage, Standardfehler mithilfe von R und einer darauf basierenden Anleitung zu gruppierenPost. Die Funktion cl gibt den Fehler zurück:
Error in tapply(x, cluster1, sum) : arguments must have same length
Nach dem Lesen auftapply
Ich bin mir immer noch nicht sicher, warum mein Cluster-Argument die falsche Länge hat und was diesen Fehler verursacht.
Hier ist ein Link zu dem Datensatz, den ich verwende.
https://www.dropbox.com/s/y2od7um9pp4vn0s/Ec%201820%20-%20DD%20Data%20with%20Controls.csv
Hier ist der R-Code:
# read in data
charter<-read.csv(file.choose())
View(charter)
colnames(charter)
# standardize NAEP scores
charter$naep.standardized <- (charter$naep - mean(charter$naep, na.rm=T))/sd(charter$naep, na.rm=T)
# change NAs in year.passed column to 2014
charter$year.passed[is.na(charter$year.passed)]<-2014
# Add column with indicator for in treatment (passed legislation)
charter$treatment<-ifelse(charter$year.passed<=charter$year,1,0)
# fit model
charter.model<-lm(naep ~ factor(year) + factor(state) + treatment, data = charter)
summary(charter.model)
# account for clustered standard errors by state
cl(dat=charter, fm=charter.model, cluster=charter$state)
# accounting for controls
charter.model.controls<-lm(naep~factor)
# clustered standard errors
# ---------
# function that calculates clustered standard errors
# source: http://thetarzan.wordpress.com/2011/06/11/clustered-standard-errors-in-r/
cl <- function(dat, fm, cluster){
require(sandwich, quietly = TRUE)
require(lmtest, quietly = TRUE)
M <- length(unique(cluster))
N <- length(cluster)
K <- fm$rank
dfc <- (M/(M-1))*((N-1)/(N-K))
print(K)
uj <- apply(estfun(fm),2, function(x) tapply(x, cluster, sum));
vcovCL <- dfc*sandwich(fm, meat=crossprod(uj)/N)
coeftest(fm, vcovCL)
}
# calculate clustered standard errors
cl(charter, charter.model, charter$state)
Das Innenleben der Funktion geht mir ein wenig über den Kopf.