Ich versuche zu verstehen, Standardfehler "Clustering" und wie in R auszuführen (es ist in Stata trivial). In RI ist es mir nicht gelungen, entweder plm
meine eigene Funktion zu verwenden oder zu schreiben. Ich werde die diamonds
Daten aus dem ggplot2
Paket verwenden.
Ich kann feste Effekte mit beiden Dummy-Variablen machen
> library(plyr)
> library(ggplot2)
> library(lmtest)
> library(sandwich)
> # with dummies to create fixed effects
> fe.lsdv <- lm(price ~ carat + factor(cut) + 0, data = diamonds)
> ct.lsdv <- coeftest(fe.lsdv, vcov. = vcovHC)
> ct.lsdv
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
carat 7871.082 24.892 316.207 < 2.2e-16 ***
factor(cut)Fair -3875.470 51.190 -75.707 < 2.2e-16 ***
factor(cut)Good -2755.138 26.570 -103.692 < 2.2e-16 ***
factor(cut)Very Good -2365.334 20.548 -115.111 < 2.2e-16 ***
factor(cut)Premium -2436.393 21.172 -115.075 < 2.2e-16 ***
factor(cut)Ideal -2074.546 16.092 -128.920 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
oder indem Sie die Bedeutung sowohl der linken als auch der rechten Seite aufheben (keine zeitinvarianten Regressoren hier) und Freiheitsgrade korrigieren.
> # by demeaning with degrees of freedom correction
> diamonds <- ddply(diamonds, .(cut), transform, price.dm = price - mean(price), carat.dm = carat .... [TRUNCATED]
> fe.dm <- lm(price.dm ~ carat.dm + 0, data = diamonds)
> ct.dm <- coeftest(fe.dm, vcov. = vcovHC, df = nrow(diamonds) - 1 - 5)
> ct.dm
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
carat.dm 7871.082 24.888 316.26 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Ich kann diese Ergebnisse nicht mit replizieren plm
, da ich keinen "Zeit" -Index habe (dh dies ist nicht wirklich ein Panel, sondern nur Cluster, die in ihren Fehlerbegriffen eine gemeinsame Tendenz aufweisen könnten).
> plm.temp <- plm(price ~ carat, data = diamonds, index = "cut")
duplicate couples (time-id)
Error in pdim.default(index[[1]], index[[2]]) :
Ich habe auch versucht, meine eigene Kovarianzmatrix mit geclusterten Standardfehlern zu codieren, indem ich die Erklärung von Stata zu ihrer cluster
Option ( hier erklärt ) verwendet habe: wobei , si die Anzahl von Clustern ist, der Rest ist für die Beobachtung und ist der Zeilenvektor von Prädiktoren, einschließlich der Konstanten (dies erscheint auch als Gleichung (7.22) in Wooldridges Querschnitts- und Paneldatenuj=Σclusterjei*xinceiith
plm
in der Lage bin, Cluster zu einem bestimmten Faktor zu erstellen, bin ich mir nicht sicher, wie ich meinen Code bewerten soll.
> # with cluster robust se
> lm.temp <- lm(price ~ carat + factor(cut) + 0, data = diamonds)
>
> # using the model that Stata uses
> stata.clustering <- function(x, clu, res) {
+ x <- as.matrix(x)
+ clu <- as.vector(clu)
+ res <- as.vector(res)
+ fac <- unique(clu)
+ num.fac <- length(fac)
+ num.reg <- ncol(x)
+ u <- matrix(NA, nrow = num.fac, ncol = num.reg)
+ meat <- matrix(NA, nrow = num.reg, ncol = num.reg)
+
+ # outer terms (X'X)^-1
+ outer <- solve(t(x) %*% x)
+
+ # inner term sum_j u_j'u_j where u_j = sum_i e_i * x_i
+ for (i in seq(num.fac)) {
+ index.loop <- clu == fac[i]
+ res.loop <- res[index.loop]
+ x.loop <- x[clu == fac[i], ]
+ u[i, ] <- as.vector(colSums(res.loop * x.loop))
+ }
+ inner <- t(u) %*% u
+
+ #
+ V <- outer %*% inner %*% outer
+ return(V)
+ }
> x.temp <- data.frame(const = 1, diamonds[, "carat"])
> summary(lm.temp)
Call:
lm(formula = price ~ carat + factor(cut) + 0, data = diamonds)
Residuals:
Min 1Q Median 3Q Max
-17540.7 -791.6 -37.6 522.1 12721.4
Coefficients:
Estimate Std. Error t value Pr(>|t|)
carat 7871.08 13.98 563.0 <2e-16 ***
factor(cut)Fair -3875.47 40.41 -95.9 <2e-16 ***
factor(cut)Good -2755.14 24.63 -111.9 <2e-16 ***
factor(cut)Very Good -2365.33 17.78 -133.0 <2e-16 ***
factor(cut)Premium -2436.39 17.92 -136.0 <2e-16 ***
factor(cut)Ideal -2074.55 14.23 -145.8 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1511 on 53934 degrees of freedom
Multiple R-squared: 0.9272, Adjusted R-squared: 0.9272
F-statistic: 1.145e+05 on 6 and 53934 DF, p-value: < 2.2e-16
> stata.clustering(x = x.temp, clu = diamonds$cut, res = lm.temp$residuals)
const diamonds....carat..
const 11352.64 -14227.44
diamonds....carat.. -14227.44 17830.22
Kann das in R gemacht werden? Es ist eine in der Ökonometrie weit verbreitete Technik (in dieser Vorlesung gibt es ein kurzes Tutorial ), aber ich kann es in R nicht herausfinden. Danke!
cluster
Option erklärt wird. Ich bin sicher, es wäre möglich, in R.
factor
habe eine Weile gebraucht, bis mir klar wurde, dass ich nichts damit zu tun hatte, factanal
sondern mich auf kategorisierte Variablen bezog. Cluster in R bezieht sich jedoch auf die Clusteranalyse, k-means ist nur DIE Partitionierungsmethode: statmethods.net/advstats/cluster.html . Ich verstehe Ihre Frage nicht, aber ich schätze, Cluster hat nichts damit zu tun.