আর এ ক্লাস্টারিং স্ট্যান্ডার্ড ত্রুটি (ম্যানুয়ালি বা প্লামে)


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বিকল্পের ব্যাখ্যাটি ( এখানে ব্যাখ্যা করেছেন ) ক্লাস্টার স্ট্যান্ডার্ড ত্রুটির সাথে আমার নিজস্ব কোভারিয়েন্স ম্যাট্রিক্সও কোড করার চেষ্টা করেছি , যা যেখানে , Si ক্লাস্টার সংখ্যা, অবশিষ্ট নেই জন্য পর্যবেক্ষণ ও ধ্রুবক সহ ভবিষ্যতবক্তা, সারি ভেক্টর আছে (এই Wooldridge এর সমীকরণ (7.22) হিসাবে প্রদর্শিত হবে ক্রস সেকশন এবং প্যানেল ডেটাU=Σতোমার দর্শন লগ করাগুলিটনআমি*xআমিএনআমিআমিটি

V^cluster=(XX)1(j=1ncujuj)(XX)1
uj=cluster jeixinceiithxi)। তবে নিম্নলিখিত কোডটি খুব বড় covariance ম্যাট্রিক্স দেয়। এই খুব বড় মানগুলি কি আমার কাছে সংখ্যক ক্লাস্টার দেওয়া আছে? আমি plmএকটি ফ্যাক্টারে ক্লাস্টার করতে পারব না তা প্রদত্ত, আমি আমার কোডটি কীভাবে বেনমার্ক করব তা নিশ্চিত নই।
> # 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

এটি কি আর-তে করা যায়? এটি ইকোনোমেট্রিক্সে মোটামুটি সাধারণ কৌশল ( এই বক্তৃতায় একটি সংক্ষিপ্ত টিউটোরিয়াল আছে ), তবে আমি আর এটিকে বুঝতে পারি না Thanks ধন্যবাদ!


7
@ricardh, তারা যে শব্দটি ব্যবহার করতে চান তা পরিসংখ্যানের মধ্যে ইতিমধ্যে ব্যবহৃত হয়েছে কিনা তা যাচাই না করার জন্য সমস্ত অর্থনীতিবিদদের অভিশাপ দিন। এই প্রসঙ্গে ক্লাস্টারের অর্থ গ্রুপ এবং এটি ক্লাস্টার বিশ্লেষণের সাথে পুরোপুরি সম্পর্কিত নয়, এ কারণেই আপনাকে রিসাইক সম্পর্কিত নয় এমন ফলাফল দিয়েছে। তাই আমি ক্লাস্টারিং ট্যাগটি সরিয়েছি। প্যানেল ডেটা বিশ্লেষণের জন্য প্যাকেজ plm দেখুন । এটিতে একটি সুন্দর চিত্র রয়েছে, তাই আপনি যা চান তা পেতে পারেন। আপনার প্রশ্নের হিসাবে এটি আপনি কি চান তা পরিষ্কার নয়। গ্রুপ স্ট্যান্ডার্ড ত্রুটি মধ্যে?
এমপিটকাস

@ ক্রিকার, আপনি স্টাটার কয়েকটি ম্যানুয়ালটিতে লিঙ্ক দিতে পারলে এই clusterবিকল্পটি ব্যাখ্যা করা গেলে এটি অনেক সাহায্য করবে । আমি নিশ্চিত যে আর
তে

2
+1 মন্তব্যটির জন্য। অর্থনীতিবিদরা পাগলের মতো পরিভাষা উপনিবেশ করেন। যদিও কখনও কখনও খলনায়ক বাছাই করা শক্ত। আইআই কিছুক্ষণ সময় নিয়েছিল যতক্ষণ না বুঝতে পারলাম এর factorসাথে কিছুই করার নেই factanalতবে শ্রেণিবদ্ধ ভেরিয়েবলগুলি উল্লেখ করে। তবে আর-এ ক্লাস্টারটি ক্লাস্টার বিশ্লেষণকে বোঝায়, কে- মানেগুলি কেবলমাত্র পার্টিশন পদ্ধতি: স্টেটমেডথস.নেট / অ্যাডভিস্ট্যাটস / ক্লসটার হিটটিএমএল । আমি আপনার প্রশ্নটি পাই না, তবে আমি এটিও অনুমান করি যে এটির সাথে ক্লাস্টারের কোনও সম্পর্ক নেই।
hans0l0

@ এমপিক্টাস, @ রান 2 - ধন্যবাদ! আমি আশা করি আমি প্রশ্নটি পরিষ্কার করে দিয়েছি। সংক্ষেপে, "স্ট্যান্ডার্ড ত্রুটি ক্লাস্টারিং" কেন বিদ্যমান যদি এটি কেবলমাত্র স্থির প্রভাব, যা ইতিমধ্যে বিদ্যমান ছিল?
রিচার্ড হেরন

1
"মাল্টিওয়েভকভ" প্যাকেজে ক্লাস্টার.ভিসিভ ফাংশন আপনাকে যা খুঁজছে তা করে।

উত্তর:


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

প্লাম প্যাকেজের জন্য এখানে আরও একটি সহায়ক গাইড রয়েছে যা ক্লাস্টার স্ট্যান্ডার্ড ত্রুটির জন্য বিভিন্ন বিকল্প ব্যাখ্যা করে:

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

ক্লাস্টারিং এবং অন্যান্য তথ্য, বিশেষত স্টাতার জন্য, এখানে পাওয়া যাবে:

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

সম্পাদনা 2:

এখানে আর-স্ট্যাটাকে তুলনা করার উদাহরণ রয়েছে: http://www.richard-bluhm.com/clustered-ses-in-r-and-stata-2/

এছাড়াও, multiwayvcovসাহায্যকারী হতে পারে। এই পোস্টটি একটি সহায়ক ওভারভিউ প্রদান করে: http://rforpublichealth.blogspot.dk/2014/10/easy-clustered-standard-erferences-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
আরয়ের কাগজ আর অনলাইনে নেই। আপনি কি প্রকৃত লিঙ্কটি সরবরাহ করতে পারেন?
মেরোস

@ মেরোজ - দুঃখিত! দুর্ভাগ্যক্রমে আমরা পিডিএফএস সংযুক্ত করতে পারি না! আমি এই ব্লগ পোস্টটি পেয়েছি যা কোডটিকে বেঞ্চমার্ক করে। কোডটি অন্তর্ভুক্ত করার জন্য আমি এই উত্তরটি সম্পাদনা করব।
রিচার্ড হেরন


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। (এই বাগটি এখন এসভিএন-এ স্থির করা হয়েছে You আপনি এখান থেকে বিকাশ সংস্করণ ইনস্টল করতে পারেন ))

তবে যেহেতু এটি 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, মূল প্রশ্নে এসইএস) হল কোনো ক্লাস্টারিং সঙ্গে heteroscedasticity-সামঞ্জস্যপূর্ণ এসইএস।


এটির জন্য একটি পৃথক পদ্ধতি হ'ল lmডামি ভেরিয়েবল রিগ্রেশন এবং মাল্টিওয়েভকভ প্যাকেজ to

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প্যাকেজ Arai থেকে মূল ক্লাস্টারিং ফাংশন সরাসরি এবং উল্লেখযোগ্য বিবর্তন হয়।

আপনি উভয় পন্থা থেকে ফলাফল বৈকল্পিক-কোভারিয়েন্স ম্যাট্রিক্সও দেখতে পারেন, এর জন্য একই বৈকল্পিক প্রাক্কলন উপস্থাপন করেছেন 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 

দয়া করে এই লিঙ্কে দেখুন: multiwayvcov অবমূল্যায়ন ঘটেছে: sites.google.com/site/npgraham1/research/code
HoneyBuddha
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.