이 분산 데이터에 대한 일원 분산 분석의 대안 생성 하므로 일원 분산 분석을

샘플 크기가 다른 ( , , ) 3 개의 조류 바이오 매스 그룹 ( , , ) 에서 얻은 데이터를 가지고 그룹이 같은 집단에 속하는지 비교하고 싶습니다.

A

C n A = 15 n B = 13 n C = 12

B

C

nA=15

nB=13

nC=12

일원 분산 분석은 확실히 갈 길이지만 내 데이터에 대한 정규성 테스트를 수행 할 때 이질성 문제가 주요 문제로 보입니다. 변환하지 않은 원시 데이터 는 임계 값 ( F _ {\ rm crit} = 4.16 ) 보다 훨씬 높은 분산 비율 ( )을 생성 하므로 일원 분산 분석을 수행 할 수 없습니다. .

Fmax=19.1

Fcrit=4.16

또한 데이터를 정규화하기 위해 변환을 시도했습니다. 다양한 변환 (log, square root, square)을 시도한 후에도 \ log_ {10} 변환으로 변환 후 생성 된 가장 낮은 F _ {\ max}7.16 으로 F _ {\ rm crit}에 비해 여전히 높았습니다 .

Fmax

log10

7.16

Fcrit

여기 누구든지 여기서 어디로 가야하는지 조언 할 수 있습니까? 데이터로 정규화하기위한 다른 변환 방법을 생각할 수 없습니다. 일원 분산 분석에 대한 대안이 있습니까?

추신 : 내 원시 데이터는 다음과 같습니다.

A: 0.178 0.195 0.225 0.294 0.315 0.341 0.36  0.363 0.371 0.398 0.407 0.409 0.432 
   0.494 0.719
B: 0.11  0.111 0.204 0.416 0.417 0.441 0.492 0.965 1.113 1.19  1.233 1.505 1.897
C: 0.106 0.114 0.143 0.435 0.448 0.51  0.576 0.588 0.608 0.64  0.658 0.788 0.958


답변

이 분산 데이터를 처리 할 때 사용할 수있는 옵션이 많이 있습니다. 불행히도, 그들 중 어느 것도 항상 작동한다고 보장되지는 않습니다. 다음은 내가 익숙한 몇 가지 옵션입니다.

  • 변형
  • 웰치 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                    

물론, 이분산성이 있습니다. 그룹의 분산이 무엇인지 확인합니다. 경험적으로, 최대 분산이 최소 분산 보다 넘지 않는 한 선형 모델은 분산의 이질성에 대해 상당히 견고하므로 , 그 비율도 찾을 수 있습니다.

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

B

.7

C그것이 어떻게 작동하는지 보여주기 위해 :

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가 아닌 분수 값)로 사용하는 것 입니다.

F

df = 19.445df = 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                  

이는 비가 중 분산 분석 ( , ) 과 약간 다른 및 생성 하지만 이질성을 잘 해결했습니다.

F

p

4.50890.01749

그러나 가중 최소 제곱은 만병 통치약이 아닙니다. 불편한 사실 중 하나는 가중치가 올바른 경우에만 옳다는 것입니다. 즉, 무엇보다도 가중치가 알려진 것으로 간주됩니다. 비정규 성 (예 : 기울어 짐) 또는 특이 치를 다루지 않습니다. 데이터에서 추정 된 가중치를 사용하면 특히 합리적 정밀도로 분산을 추정하기에 충분한 데이터가있는 경우에 잘 작동합니다 (이는 또는 을 가질 때 테이블 대신 테이블 을 사용하는 아이디어와 유사합니다).

z

t

50

100

자유도), 데이터가 충분히 정상이며 특이 치가없는 것으로 보입니다. 불행히도, 상대적으로 적은 데이터 (그룹당 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; CWLS : 0.50554강력한를 0.51845수단으로) BC덜 극단적 인 값으로 끌려.

계량 경제학에서 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로 나누고 결과를 적절한 분포 (즉, 분포와 잔류 자유도) 와 비교합니다 .

t

t

t

대한 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 에서 의 샘플링 분포를 실험적으로 추정 합니다. 관찰 된 검정 통계량보다 극도 또는 극도의 샘플링 분포 비율은 값입니다.

F

F

p
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입니다. 가능성 비율 테스트와 점수 테스트의 두 가지 버전이 나열됩니다. 우도 비 검정은 일반적으로 최고로 간주됩니다. 그것은 산출 의 – 값을 .

p

0.0363