R में मानक त्रुटि क्लस्टरिंग (या तो मैन्युअल रूप से या plm में)


33

मैं मानक त्रुटि "क्लस्टरिंग" को समझने की कोशिश कर रहा हूं और आर में निष्पादित कैसे करना है (यह स्टाटा में तुच्छ है)। आरआई में plmया तो अपने स्वयं के फ़ंक्शन का उपयोग करने या लिखने में असफल रहा है। मैं पैकेज diamondsसे डेटा का उपयोग करूँगा ggplot2

मैं या तो डमी चर के साथ निश्चित प्रभाव कर सकते हैं

> 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 

या दोनों अर्थों में बाएं और दाएं-बाएं हाथ (यहां कोई भी समय के आक्रामक रेजिस्टर नहीं) और स्वतंत्रता की सही डिग्री।

> # 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 

मैं इन परिणामों की नकल नहीं कर सकता plm, क्योंकि मेरे पास "समय" सूचकांक नहीं है (यानी, यह वास्तव में एक पैनल नहीं है, बस क्लस्टर जो उनकी त्रुटि शर्तों में एक आम पूर्वाग्रह हो सकता है)।

> plm.temp <- plm(price ~ carat, data = diamonds, index = "cut")
duplicate couples (time-id)
Error in pdim.default(index[[1]], index[[2]]) : 

cluster

V^cluster=(XX)1(j=1ncujuj)(XX)1
uj=cluster jeixinceiithxiplm
> # 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

क्या यह R में किया जा सकता है? यह अर्थमिति में एक काफी सामान्य तकनीक है ( इस व्याख्यान में एक संक्षिप्त ट्यूटोरियल है ), लेकिन मैं इसे आर। में समझ नहीं पाया!


7
@ricardh, सभी अर्थशास्त्रियों पर यह जाँचने के लिए कि क्या वे जिस शब्द का उपयोग करना चाहते हैं, वह पहले से ही आँकड़ों में उपयोग किया जाता है। इस संदर्भ में क्लस्टर का अर्थ समूह है और क्लस्टर विश्लेषण के लिए पूरी तरह से असंबंधित है, यही कारण है कि rseek ने आपको असंबंधित परिणाम दिए हैं। इसलिए मैंने क्लस्टरिंग टैग को हटा दिया। पैनल डेटा विश्लेषण के लिए पैकेज प्लम देखें । यह एक अच्छा विगनेट है, इसलिए आप जो चाहते हैं वह मिल सकता है। आपके प्रश्न के लिए यह स्पष्ट नहीं है कि आप क्या चाहते हैं। समूह मानक त्रुटियों के भीतर?
mpiktas 7

@ricardh, यह बहुत मदद करेगा यदि आप स्टैटा के कुछ मैनुअल से लिंक कर सकते हैं जहां यह clusterविकल्प समझाया गया है। मुझे यकीन है कि यह आर। में दोहराने के लिए संभव होगा
mpiktas 7

2
उस टिप्पणी के लिए +1। अर्थशास्त्री पागल की तरह शब्दावली का उपनिवेश करते हैं। हालांकि कभी-कभी खलनायक को चुनना मुश्किल होता है। Ii ने कुछ समय लिया जैसे कि जब तक मुझे एहसास हुआ कि factorइसका कोई लेना देना नहीं है factanalलेकिन वर्गीकृत चर को संदर्भित करता है। हालांकि R में क्लस्टर क्लस्टर विश्लेषण को संदर्भित करता है, k- का मतलब सिर्फ विभाजन विधि है: statmethods.net/advstats/cluster.html । मुझे आपका प्रश्न नहीं मिलता है, लेकिन मुझे लगता है कि क्लस्टर का इससे कोई लेना-देना नहीं है।
hans0l0

@mpiktas, @ ran2 - धन्यवाद! मुझे आशा है कि मैंने प्रश्न को स्पष्ट कर दिया है। संक्षेप में, "मानक त्रुटि क्लस्टरिंग" क्यों मौजूद है यदि यह केवल निश्चित प्रभाव है, जो पहले से मौजूद है?
रिचर्ड हेरॉन

1
"multiwayvcov" पैकेज में क्लस्टर। पीवीसीव फ़ंक्शन वह कार्य करता है जो आप खोज रहे हैं।

जवाबों:


29

श्वेत मानक त्रुटियों के लिए समूह द्वारा plmतैयार की गई रूपरेखा के साथ क्लस्टर किए गए त्रुटि

coeftest(model.plm, vcov=vcovHC(model.plm,type="HC0",cluster="group"))

जहां model.plmएक plm मॉडल है

इस लिंक को भी देखें

http://www.inside-r.org/packages/cran/plm/docs/vcovHC या plm पैकेज प्रलेखन

संपादित करें:

दो-तरफा क्लस्टरिंग के लिए (जैसे समूह और समय) निम्न लिंक देखें:

http://people.su.se/~ma/clustering.pdf

यहाँ विशेष रूप से plm पैकेज के लिए एक और उपयोगी मार्गदर्शिका है जो संकुल मानक त्रुटियों के लिए विभिन्न विकल्पों की व्याख्या करती है:

http://www.princeton.edu/~otorres/Panel101R.pdf

क्लस्टरिंग और अन्य जानकारी, विशेष रूप से स्टाटा के लिए, यहां पाया जा सकता है:

http://www.kellogg.northwestern.edu/faculty/petersen/htm/papers/se/se_programming.htm

संपादित करें 2:

यहां ऐसे उदाहरण दिए गए हैं जो R और stata की तुलना करते हैं: http://www.richard-bluhm.com/clustered-ses-in-r-and-stata-2/

इसके अलावा, multiwayvcovसहायक हो सकता है। यह पोस्ट एक उपयोगी अवलोकन प्रदान करती है: http://rforpublichealth.blogspot.dk/2014/10/easy-clustered-standard-errors-in-r.html

प्रलेखन से:

library(multiwayvcov)
library(lmtest)
data(petersen)
m1 <- lm(y ~ x, data = petersen)

# Cluster by firm
vcov_firm <- cluster.vcov(m1, petersen$firmid)
coeftest(m1, vcov_firm)
# Cluster by year
vcov_year <- cluster.vcov(m1, petersen$year)
coeftest(m1, vcov_year)
# Cluster by year using a formula
vcov_year_formula <- cluster.vcov(m1, ~ year)
coeftest(m1, vcov_year_formula)

# Double cluster by firm and year
vcov_both <- cluster.vcov(m1, cbind(petersen$firmid, petersen$year))
coeftest(m1, vcov_both)
# Double cluster by firm and year using a formula
vcov_both_formula <- cluster.vcov(m1, ~ firmid + year)
coeftest(m1, vcov_both_formula)

मेरे लिए और coeftest(model.plm, vcov=vcovHC(model.plm,type="HC0")) साथ ही coeftest(model.plm, vcov=vcovHC(model.plm,type="HC0",cluster="group"))समान परिणाम का उत्पादन। क्या आप जानते हैं कि ऐसा क्यों है?
पीटर पैन

1
लिंक people.su.se/~ma/clustering.pdf अब काम नहीं कर रहा है। क्या आपको पृष्ठ का शीर्षक याद है?
मेरीस

8

बहुत पढ़ने के बाद, मुझे lmरूपरेखा के भीतर क्लस्टरिंग करने का समाधान मिला ।

महमूद अरी द्वारा एक उत्कृष्ट श्वेत पत्र है lmजो रूपरेखा में क्लस्टरिंग पर एक ट्यूटोरियल प्रदान करता है , जो वह ऊपर मेरे गंदे प्रयासों के बजाय डिग्री-ऑफ-फ्रीडम सुधार के साथ करता है। वह यहां एक-और दो-तरफा क्लस्टरिंग मैट्रिसेस के लिए अपने कार्य प्रदान करता है

अंत में, हालांकि यह सामग्री मुफ्त उपलब्ध नहीं है, लेकिन एंग्रीस्ट और पिस्के के अधिकतर हानिकारक अर्थमिति में क्लस्टरिंग पर एक खंड है जो बहुत उपयोगी था।


ब्लॉग पोस्ट से कोड जोड़ने के लिए 4/27/2015 पर अपडेट करें ।

api=read.csv("api.csv") #create the variable api from the corresponding csv
attach(api) # attach of data.frame objects
api1=api[c(1:6,8:310),] # one missing entry in row nr. 7
modell.api=lm(API00 ~ GROWTH + EMER + YR_RND, data=api1) # creation of a simple linear model for API00 using the regressors Growth, Emer and Yr_rnd.

##creation of the function according to Arai:
clx <- function(fm, dfcw, cluster) {
    library(sandwich)
    library(lmtest)
    library(zoo)
    M <- length(unique(cluster))
    N <- length(cluster)
    dfc <- (M/(M-1))*((N-1)/(N-fm$rank)) # anpassung der freiheitsgrade
    u <- apply(estfun(fm),2, function(x) tapply(x, cluster, sum))
    vcovCL <-dfc * sandwich (fm, meat = crossprod(u)/N) * dfcw
    coeftest(fm, vcovCL)
}

clx(modell.api, 1, api1$DNUM) #creation of results.

1
अराई का पेपर अब ऑनलाइन नहीं है। क्या आप वास्तविक लिंक प्रदान कर सकते हैं?
मेरोस

@MERose - क्षमा करें! दुर्भाग्य से हम pdfs संलग्न नहीं कर सकते हैं! मुझे यह ब्लॉग पोस्ट मिला जो कोड को बेंचमार्क करता है। मैं इस उत्तर को कोड को शामिल करने के लिए संपादित करूंगा।
रिचर्ड हेरॉन


4

आर में क्लस्टर किए गए मानक त्रुटियों की गणना करने का सबसे आसान तरीका संशोधित सारांश फ़ंक्शन का उपयोग करना है।

lm.object <- lm(y ~ x, data = data)
summary(lm.object, cluster=c("c"))

एलएम ढांचे के भीतर क्लस्टरिंग पर एक उत्कृष्ट पोस्ट है । साइट एक और दो-तरफा क्लस्टरिंग के लिए संशोधित सारांश फ़ंक्शन भी प्रदान करती है। आप फ़ंक्शन और ट्यूटोरियल यहां पा सकते हैं ।


1

यदि आपके पास कोई timeइंडेक्स नहीं है , तो आपको एक की आवश्यकता नहीं है: plmअपने आप में एक काल्पनिक जोड़ देगा, और इसका उपयोग तब तक नहीं किया जाएगा जब तक आप इसके बारे में नहीं पूछते। तो यह कॉल काम करना चाहिए :

> x <- plm(price ~ carat, data = diamonds, index = "cut")
 Error in pdim.default(index[[1]], index[[2]]) : 
  duplicate couples (time-id) 

सिवाय इसके कि ऐसा नहीं है, जो बताता है कि आपने बग को मारा है plm। (यह बग अब एसवीएन में तय किया गया है। आप यहां से विकास संस्करण स्थापित कर सकते हैं ।)

लेकिन चूंकि यह एक काल्पनिक timeसूचकांक होगा , इसलिए हम इसे स्वयं बना सकते हैं:

diamonds$ftime <- 1:NROW(diamonds)  ##fake time

अब यह काम करता है:

x <- plm(price ~ carat, data = diamonds, index = c("cut", "ftime"))
coeftest(x, vcov.=vcovHC)
## 
## t test of coefficients:
## 
##       Estimate Std. Error t value  Pr(>|t|)    
## carat  7871.08     138.44  56.856 < 2.2e-16 ***
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

महत्वपूर्ण नोट : vcovHC.plm()में plmडिफ़ॉल्ट अनुमान से इच्छा Arellano समूह सत्र से संकुल। कौन सा है अलग क्या से vcovHC.lm()में sandwich(उदाहरण के लिए अनुमान लगाएगी vcovHC, मूल प्रश्न में SES) है कि कोई क्लस्टरिंग साथ heteroscedasticity-संगत सत्र।


इसके लिए एक अलग दृष्टिकोण lmडमी वैरिएबल रिग्रेशन और मल्टीवेक्सोव पैकेज से चिपका हुआ है ।

library("multiwayvcov")
fe.lsdv <- lm(price ~ carat + factor(cut) + 0, data = diamonds)
coeftest(fe.lsdv, vcov.= function(y) cluster.vcov(y, ~ cut, df_correction = FALSE))
## 
## t test of coefficients:
## 
##                      Estimate Std. Error t value  Pr(>|t|)    
## carat                 7871.08     138.44  56.856 < 2.2e-16 ***
## factor(cut)Fair      -3875.47     144.83 -26.759 < 2.2e-16 ***
## factor(cut)Good      -2755.14     117.56 -23.436 < 2.2e-16 ***
## factor(cut)Very Good -2365.33     111.63 -21.188 < 2.2e-16 ***
## factor(cut)Premium   -2436.39     123.48 -19.731 < 2.2e-16 ***
## factor(cut)Ideal     -2074.55      97.30 -21.321 < 2.2e-16 ***
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

दोनों ही मामलों में आपको समूह द्वारा क्लस्टरिंग के साथ अरेलेनो (1987) एसई मिलेगा। multiwayvcovपैकेज अराइ के मूल क्लस्टरिंग कार्यों का एक सीधा और महत्वपूर्ण विकास है।

आप दोनों दृष्टिकोणों से परिणामी विचरण-सहसंयोजक मैट्रिक्स को भी देख सकते हैं, इसके लिए एक ही विचरण अनुमान लगाते हैं carat:

vcov.plm <- vcovHC(x)
vcov.lsdv <- cluster.vcov(fe.lsdv, ~ cut, df_correction = FALSE)
vcov.plm
##          carat
## carat 19165.28
diag(vcov.lsdv)
##                carat      factor(cut)Fair      factor(cut)Good factor(cut)Very Good   factor(cut)Premium     factor(cut)Ideal 
##            19165.283            20974.522            13820.365            12462.243            15247.584             9467.263 

कृपया इस लिंक को देखें:
मल्टीवेबकोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.