이 분산 데이터를 처리 할 때 사용할 수있는 옵션이 많이 있습니다. 불행히도, 그들 중 어느 것도 항상 작동한다고 보장되지는 않습니다. 다음은 내가 익숙한 몇 가지 옵션입니다.
- 변형
- 웰치 ANOVA
- 가중 최소 제곱
- 강력한 회귀
- 이분산성 일관된 표준 오류
- 부트 스트랩
- Kruskal-Wallis 테스트
- 순서 형 로지스틱 회귀
업데이트 : 이분산성 / 이질성 분산이있을 때 선형 모델 (즉, 분산 분석 또는 회귀)을 피팅하는 몇 가지 방법에 대한 데모가 R
있습니다.
데이터를 살펴보면서 시작하겠습니다. 편의상 my.data
(그룹당 하나의 열로 위와 같이 구성됨) 및 stacked.data
(두 개의 열 : values
숫자와 ind
그룹 표시기) 라는 두 개의 데이터 프레임에로드했습니다 .
Levene의 테스트 를 통해 이분산성 을 공식적으로 테스트 할 수 있습니다 .
library(car)
leveneTest(values~ind, stacked.data)
# Levene's Test for Homogeneity of Variance (center = median)
# Df F value Pr(>F)
# group 2 8.1269 0.001153 **
# 38
물론, 이분산성이 있습니다. 그룹의 분산이 무엇인지 확인합니다. 경험적으로, 최대 분산이 최소 분산 보다 넘지 않는 한 선형 모델은 분산의 이질성에 대해 상당히 견고하므로 , 그 비율도 찾을 수 있습니다. 4×
apply(my.data, 2, function(x){ var(x, na.rm=T) })
# A B C
# 0.01734578 0.33182844 0.06673060
var(my.data$B, na.rm=T) / var(my.data$A, na.rm=T)
# [1] 19.13021
가장 큰 차이 B
는 가장 작은 차이 입니다. 이것은 이질적인 문제의 수준입니다. 19×A
분산을 안정화하기 위해 로그 또는 제곱근과 같은 변환 을 사용하려고 생각했습니다 . 경우에 따라 작동하지만 Box-Cox 유형 변환은 데이터를 비대칭 적으로 압축하여 가장 높은 데이터를 가장 많이 기록한 데이터를 아래쪽으로 압축하거나 가장 낮은 데이터를 가장 많이 압축 한 데이터를 위쪽으로 압축하여 분산을 안정화합니다. 따라서 최적의 성능을 발휘할 수 있도록 평균을 변경하려면 데이터의 분산이 필요합니다. 데이터에는 분산에 큰 차이가 있지만 평균과 중간 값 사이에는 비교적 작은 차이가 있습니다. 즉 분포가 대부분 겹칩니다. 가르치는 연습으로, 우리는 몇 가지를 만들 수 있습니다 parallel.universe.data
추가하여 모든 값과 에2.7B
.7C
그것이 어떻게 작동하는지 보여주기 위해 :
parallel.universe.data = with(my.data, data.frame(A=A, B=B+2.7, C=C+.7))
apply(parallel.universe.data, 2, function(x){ var(x, na.rm=T) })
# A B C
# 0.01734578 0.33182844 0.06673060
apply(log(parallel.universe.data), 2, function(x){ var(x, na.rm=T) })
# A B C
# 0.12750634 0.02631383 0.05240742
apply(sqrt(parallel.universe.data), 2, function(x){ var(x, na.rm=T) })
# A B C
# 0.01120956 0.02325107 0.01461479
var(sqrt(parallel.universe.data$B), na.rm=T) /
var(sqrt(parallel.universe.data$A), na.rm=T)
# [1] 2.074217
제곱근 변환을 사용하면 해당 데이터가 상당히 안정적으로 유지됩니다. 병렬 유니버스 데이터의 개선 사항은 다음과 같습니다.
다른 변환을 시도하는 것보다 Box-Cox 매개 변수 를 최적화하는 것이보다 체계적인 방법입니다 (일반적으로 해석 가능한 가장 가까운 변환으로 반올림하는 것이 좋습니다). 귀하의 경우에는 제곱근 또는 로그 이 허용되지만 실제로는 작동하지 않습니다. 병렬 유니버스 데이터의 경우 제곱근이 가장 좋습니다. λλ=.5λ=0
boxcox(values~ind, data=stacked.data, na.action=na.omit)
boxcox(values~ind, data=stacked.pu.data, na.action=na.omit)
이 경우는 분산 형이므로 (즉, 연속 변수가 없음) 이질성을 처리하는 한 가지 방법은 Welch 보정 을 검정 에서 분모의 자유도 (nb가 아닌 분수 값)로 사용하는 것 입니다. Fdf = 19.445
df = 38
oneway.test(values~ind, data=stacked.data, na.action=na.omit, var.equal=FALSE)
# One-way analysis of means (not assuming equal variances)
#
# data: values and ind
# F = 4.1769, num df = 2.000, denom df = 19.445, p-value = 0.03097
보다 일반적인 방법은 가중 최소 제곱 을 사용하는 것 입니다. 일부 그룹 ( B
)이 더 널리 퍼지 므로 해당 그룹의 데이터는 다른 그룹의 데이터보다 평균 위치에 대한 정보가 적습니다. 각 데이터 포인트에 가중치를 제공하여 모델에이를 통합시킬 수 있습니다. 일반적인 시스템은 그룹 분산의 역수를 가중치로 사용하는 것입니다.
wl = 1 / apply(my.data, 2, function(x){ var(x, na.rm=T) })
stacked.data$w = with(stacked.data, ifelse(ind=="A", wl[1],
ifelse(ind=="B", wl[2], wl[3])))
w.mod = lm(values~ind, stacked.data, na.action=na.omit, weights=w)
anova(w.mod)
# Response: values
# Df Sum Sq Mean Sq F value Pr(>F)
# ind 2 8.64 4.3201 4.3201 0.02039 *
# Residuals 38 38.00 1.0000
이는 비가 중 분산 분석 ( , ) 과 약간 다른 및 생성 하지만 이질성을 잘 해결했습니다. Fp4.5089
0.01749
그러나 가중 최소 제곱은 만병 통치약이 아닙니다. 불편한 사실 중 하나는 가중치가 올바른 경우에만 옳다는 것입니다. 즉, 무엇보다도 가중치가 알려진 것으로 간주됩니다. 비정규 성 (예 : 기울어 짐) 또는 특이 치를 다루지 않습니다. 데이터에서 추정 된 가중치를 사용하면 특히 합리적 정밀도로 분산을 추정하기에 충분한 데이터가있는 경우에 잘 작동합니다 (이는 또는 을 가질 때 테이블 대신 테이블 을 사용하는 아이디어와 유사합니다).zt50100자유도), 데이터가 충분히 정상이며 특이 치가없는 것으로 보입니다. 불행히도, 상대적으로 적은 데이터 (그룹당 13 또는 15), 일부 비뚤어 짐 및 일부 특이 치가 있습니다. 나는 이것들이 많은 것을 만들 정도로 충분히 나쁘지는 않지만 확실하게 가중 최소 제곱을 강력한 방법 과 혼합 할 수 있습니다. 분산 측정 값으로 분산을 사용하는 대신 (특히 이 낮은 특이 값에 민감 함 ) 사 분위 간 범위의 역수를 사용할 수 있습니다 (각 그룹의 최대 50 % 특이 값에 영향을받지 않음). 이 가중치는 Tukey의 bisquare와 같은 다른 손실 함수를 사용하여 강력한 회귀와 결합 될 수 있습니다. N
1 / apply(my.data, 2, function(x){ var(x, na.rm=T) })
# A B C
# 57.650907 3.013606 14.985628
1 / apply(my.data, 2, function(x){ IQR(x, na.rm=T) })
# A B C
# 9.661836 1.291990 4.878049
rw = 1 / apply(my.data, 2, function(x){ IQR(x, na.rm=T) })
stacked.data$rw = with(stacked.data, ifelse(ind=="A", rw[1],
ifelse(ind=="B", rw[2], rw[3])))
library(robustbase)
w.r.mod = lmrob(values~ind, stacked.data, na.action=na.omit, weights=rw)
anova(w.r.mod, lmrob(values~1,stacked.data,na.action=na.omit,weights=rw), test="Wald")
# Robust Wald Test Table
#
# Model 1: values ~ ind
# Model 2: values ~ 1
# Largest model fitted by lmrob(), i.e. SM
#
# pseudoDf Test.Stat Df Pr(>chisq)
# 1 38
# 2 40 6.6016 2 0.03685 *
여기의 무게는 그다지 크지 않습니다. (예측 그룹 수단은 약간 다를 A
: WLS 0.36673
, 견고 0.35722
] B
: WLS 0.77646
견고 0.70433
; C
WLS : 0.50554
강력한를 0.51845
수단으로) B
및 C
덜 극단적 인 값으로 끌려.
계량 경제학에서 Huber-White ( "샌드위치") 표준 오류는 매우 인기가 있습니다. Welch 보정과 마찬가지로, 이것은 사전에 분산을 알 필요가 없으며 데이터 및 / 또는 정확하지 않은 모형의 우발 물을 추정 할 필요가 없습니다. 다른 한편으로, 나는 이것을 ANOVA와 통합하는 방법을 모른다. 즉, 개별 더미 코드의 테스트를 위해서만 얻을 수 있다는 것을 의미한다.
library(sandwich)
mod = lm(values~ind, stacked.data, na.action=na.omit)
sqrt(diag(vcovHC(mod)))
# (Intercept) indB indC
# 0.03519921 0.16997457 0.08246131
2*(1-pt(coef(mod) / sqrt(diag(vcovHC(mod))), df=38))
# (Intercept) indB indC
# 1.078249e-12 2.087484e-02 1.005212e-01
이 함수 vcovHC
는 베타 (더미 코드)에 대한 이분산성 일관된 분산 공분산 행렬을 계산합니다. 이 함수 는 함수 호출의 문자가 나타내는 것입니다. 표준 오차를 얻으려면 주 대각선을 추출하고 제곱근을 취합니다. 베타에 대한 검정 을 얻으 려면 계수 추정값을 SE로 나누고 결과를 적절한 분포 (즉, 분포와 잔류 자유도) 와 비교합니다 . ttt
대한 R
것을 아래 코멘트에 특정 사용자, @TomWenseleers 노트 ? 분산 분석 의 기능 car
패키지가 받아 들일 수 white.adjust
얻기 위해 인수를 이 분산 일관성 오류를 사용하여 인자 - 값을. p
Anova(mod, white.adjust=TRUE)
# Analysis of Deviance Table (Type II tests)
#
# Response: values
# Df F Pr(>F)
# ind 2 3.9946 0.02663 *
# Residuals 38
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
부트 스트랩 을 통해 테스트 통계의 실제 샘플링 분포가 어떻게 보이는지에 대한 경험적인 추정치를 얻을 수 있습니다 . 먼저 모든 그룹 평균을 정확히 동일하게하여 true null을 만듭니다. 그런 다음 교체와 함께 재 샘플링하고 각 부트 샘플에서 검정 통계량 ( )을 계산하여 정규성 또는 동질성에 관한 상태에 관계없이 데이터가있는 null 에서 의 샘플링 분포를 실험적으로 추정 합니다. 관찰 된 검정 통계량보다 극도 또는 극도의 샘플링 분포 비율은 값입니다. FFp
mod = lm(values~ind, stacked.data, na.action=na.omit)
F.stat = anova(mod)[1,4]
# create null version of the data
nullA = my.data$A - mean(my.data$A)
nullB = my.data$B - mean(my.data$B, na.rm=T)
nullC = my.data$C - mean(my.data$C, na.rm=T)
set.seed(1)
F.vect = vector(length=10000)
for(i in 1:10000){
A = sample(na.omit(nullA), 15, replace=T)
B = sample(na.omit(nullB), 13, replace=T)
C = sample(na.omit(nullC), 13, replace=T)
boot.dat = stack(list(A=A, B=B, C=C))
boot.mod = lm(values~ind, boot.dat)
F.vect[i] = anova(boot.mod)[1,4]
}
1-mean(F.stat>F.vect)
# [1] 0.0485
어떤면에서 부트 스트래핑은 모수 (예 : 평균)의 분석을 수행하는 궁극적 인 가정 감소 접근법이지만, 데이터가 모집단을 잘 나타내고 있다고 가정합니다. 즉, 표본 크기가 합리적입니다. 당신 때문에 의이 작고, 덜 신뢰할 수 있습니다. 비정규 성과 이질성에 대한 궁극적 인 보호는 비모수 적 테스트를 사용하는 것입니다. 분산 분석의 기본 비모수 버전은 Kruskal-Wallis 테스트입니다 . n
kruskal.test(values~ind, stacked.data, na.action=na.omit)
# Kruskal-Wallis rank sum test
#
# data: values by ind
# Kruskal-Wallis chi-squared = 5.7705, df = 2, p-value = 0.05584
Kruskal-Wallis 검정은 유형 I 오류에 대한 최선의 보호 방법이지만, 단일 범주 형 변수 (예 : 연속 예측 변수 또는 요인 설계 없음)와 함께 만 사용할 수 있으며 논의 된 모든 전략 중 최소의 힘을 갖습니다. 다른 비모수 적 접근법은 순서 형 로지스틱 회귀 를 사용하는 것 입니다. 이것은 많은 사람들에게 이상하게 보이지만 응답 데이터에 합법적 인 서수 정보가 포함되어 있다고 가정하면됩니다. 위의 모든 다른 전략도 유효합니다.
library(rms)
olr.mod = orm(values~ind, stacked.data)
olr.mod
# Model Likelihood Discrimination Rank Discrim.
# Ratio Test Indexes Indexes
# Obs 41 LR chi2 6.63 R2 0.149 rho 0.365
# Unique Y 41 d.f. 2 g 0.829
# Median Y 0.432 Pr(> chi2) 0.0363 gr 2.292
# max |deriv| 2e-04 Score chi2 6.48 |Pr(Y>=median)-0.5| 0.179
# Pr(> chi2) 0.0391
출력에서 명확하지 않을 수도 있지만이 경우 그룹의 테스트 인 전체 모델 테스트는 chi2
미달 Discrimination Indexes
입니다. 가능성 비율 테스트와 점수 테스트의 두 가지 버전이 나열됩니다. 우도 비 검정은 일반적으로 최고로 간주됩니다. 그것은 산출 의 - 값을 . p0.0363