두 개 이상의 표본 사이의 중앙값 차이에 대한 가설 검정


12

질문

세 그룹의 사람들의 테스트 점수는 R에서 별도의 벡터로 저장됩니다.

set.seed(1)
group1 <- rnorm(100, mean = 75, sd = 10)
group2 <- rnorm(100, mean = 85, sd = 10)
group3 <- rnorm(100, mean = 95, sd = 10)

이 그룹들 사이 의 중앙값에 유의 한 차이가 있는지 알고 싶습니다 . Wilcoxon 테스트를 사용하여 그룹 1과 그룹 2를 테스트 할 수 있음을 알고 있습니다.

wilcox.test(group1, group2)

그러나 이것은 한 번에 두 그룹 만 비교하고 세 그룹을 동시에 비교하고 싶습니다. 0.05 유의 수준에서 p 값을 산출하는 통계 테스트를 원합니다. 누군가 도와주세요.

편집 # 1-기분의 중앙값 테스트

사용자 Hibernating의 제안 된 답변에 따라 Mood의 중간 테스트를 시도했습니다.

median.test <- function(x, y){
    z <- c(x, y)
    g <- rep(1:2, c(length(x), length(y)))
    m <- median(z)
    fisher.test(z < m, g)$p.value
}

median.test(group1, group2)

그러나이 접근법을 사용하면 한 번에 두 그룹의 중간 값 사이의 중요한 차이를 테스트 할 수 있습니다. 세 가지의 중앙값을 동시에 비교하는 방법을 잘 모르겠습니다.

편집 # 2-Kruskal-Wallis 테스트

사용자 dmartin의 제안 답변은 내가 필요로하는 것으로 보이며 세 그룹을 동시에 테스트 할 수 있습니다.

kruskal.test(list(group1, group2, group3))

편집 # 3

사용자 Greg Greg는 자신의 답변에서 Kruskal-Wallis 검정이 수단을 검정하는 엄격한 가정을하는 한 적절하다고 언급했습니다.


이 사이트에서 이미 비슷한 질문이 많이있었습니다. 를 찾으십시오 median test. 내 답변 / 의견은 여기에 있습니다 .
ttnphns 2012 년

세 가지의 중앙값을 동시에 비교하는 경우 약간 수정 된 R 코드에 대한 편집 내용을 참조하십시오.
동면

답변:


4

Kruskal-Wallis 테스트는 비모수 분산 분석이므로 사용할 수도 있습니다. 또한 종종 Mood의 중앙값 테스트 보다 강력한 것으로 간주됩니다 . R 의 stats 패키지에서 kruskal.test 함수를 사용하여 R로 구현할 수 있습니다 .

편집에 응답하기 위해 KW 해석은 일원 분산 분석과 유사합니다. 중요한 p- 값은 세 가지 평균이 모두 같은 널 (NULL)을 거부 한 것에 해당합니다. 특정 그룹에 대한 질문에 대답하려면 후속 테스트 (ANOVA와 마찬가지로)를 사용해야합니다. 이것은 일반적으로 귀하가 가질 수있는 특정 연구 질문을 따릅니다. 시뮬레이션의 매개 변수를 살펴보면 후속 테스트를 수행하는 경우 세 그룹이 모두 서로 크게 달라야합니다 (N = 100과 모두 1 SD이므로).


1
몇 가지를 명확히하기 위해. 1) Kruskal-Wallis는 그룹의 관측치 분포가 특정 가정을 충족하지 않는 한 중앙값에 대한 검정이 아닙니다. 실제로 중앙값을 비교하려는 경우 적절한 테스트가 아닐 수 있습니다. 테스트에 관심있는 가설을 실제로 테스트하는 테스트를 선택하는 것이 가장 좋습니다. 2) Kruskal-Wallis는 "ANOVA"가 아닙니다. 즉, 분산 분석이 아닙니다. 3)이 답변에서 "의미"에 대한 언급이 잘못되었습니다.
Sal Mangiafico

10

첫째, Wilcoxon 검정 (또는 Mann-Whitney 검정)은 중간 검정에 대한 검정 이 아닙니다 (매우 엄격하게 가정하여 평균 검정을 수행하지 않는 한). 그리고 2 개 이상의 그룹을 비교하기 위해 Wilcoxon 테스트는 역설적 결과를 가져올 수 있습니다 ( Efron 's Dice 참조 ).

Wilcoxon 검정은 순열 검정의 특수한 사례이므로 특히 중앙값에 관심이 있으므로 중앙값에 대한 순열 테스트 를 제안합니다 .

먼저 차이의 척도를 선택하십시오. 가장 큰 3 개의 중위값에서 3의 가장 작은 수를 뺀 값 (또는 3 개의 중간 값 또는 MAD의 분산 등)입니다.

이제 원래 데이터에 대한 통계를 계산하십시오.

모든 데이터를 한 세트로 모은 다음 임의로 3 개의 그룹으로 값을 분할합니다.

원본과 동일한 크기로 동일한 통계를 계산합니다.

여러 번 반복 (예 : 9998)

실제 데이터의 통계량과 검정에 대한 모든 통계량의 분포를 비교하십시오.


Wilcox 검정에 필요한 엄격한 가정을 수행하여 수단의 검정으로 만들겠다고 가정합니다. 위에서 작성한 R 코드를 변경해야합니까? Kruskal-Wallis 테스트에서도이 작업을 수행 할 수 있습니까?
Alexander

1
@Alexander, 당신이 그 가정을 기꺼이한다면 R 코드는 좋고 Kruskal Wallis도 좋습니다. 그러나 당신이 다음 해당 가정을하고자하는 경우 t.testaov아마뿐만 아니라 잘 될 것입니다.
Greg Snow

+1. 당신이에 대해 말하기하는 경우 Wilcoxon sum-rank test에는 그 이름에 "윌콕스"를 변환 상관 없어?
ttnphns 2012 년

점수에 대한 @GregSnow +1 ...하지만 'Wilcox'는 Frank Wilcoxon의 이름을 딴 테스트를 의미한다고 가정합니다. (이 혼동은 불행히도 R에 의해 복잡 해져서 해당 테스트를 오도하게합니다 wilcox.test). 편집 할 수 있습니까?
Glen_b-복지 주 모니카

8

무드의 중앙값 테스트는 두 개 이상의 모집단에서 중간 값의 동등성을 테스트하는 데 사용되는 비모수 테스트입니다. 질문 의 R 부분여기를 참조 하십시오 . 여기 에서 관련 질문도 참조 하십시오 . 또한 여기에서 :

Mood의 중앙값 테스트는 직접 수행하는 가장 쉬운 방법입니다. 모든 데이터의 전체 중앙값을 계산하고 각 그룹의 중앙값 위와 아래에 몇 개의 값이 있는지 계산합니다. 그룹이 거의 같으면 관측 값이 각 그룹의 전체 중앙값 위와 아래에서 약 50-50이어야합니다. 중간 값 이하와 중간 값의 수는 양방향 테이블을 형성합니다. 그런 다음 카이 제곱 테스트를 사용하여 분석됩니다. 무드의 중앙값 테스트는 둘 이상의 그룹으로 일반화 된 기호 테스트와 매우 유사합니다.

편집 : 세 그룹의 경우 내가 링크 한 R 코드의 간단한 일반화를 고려할 수 있습니다.

median.test2 <- function(x, y, z) {
  a <- c(x, y, z)
  g <- rep(1:3, c(length(x), length(y), length(z)))
  m <- median(a)
  fisher.test(a < m, g)$p.value
}

1
테스트 명명의 경우 +1 나는 중간 테스트가 기분 테스트라고도 몰랐습니다.
ttnphns 2012 년

+1 도와 주셔서 감사합니다. 정말 감사합니다!
Alexander

mood.medtestRVAideMemoire 패키지의 R 에서 몇 가지 구현이 더 작은 샘플 크기에 대해 기본적으로 Fisher 정확한 테스트를 사용한다는 점을 제외하고는 일반적인 테스트 인 것으로 보입니다. median_test코인 패키지 의 기능은 점근 테스트를 제공하거나 Monte Carlo를 사용할 수 있습니다.
Sal Mangiafico

0

나는 이것이 늦다는 것을 알고 있지만 Mood의 중간 테스트를위한 좋은 패키지를 찾을 수 없었기 때문에 R에서 트릭을 수행하는 함수를 만들기 위해 나 자신에게 그것을 가져 갔다.

#Mood's median test for a data frame with one column containing data (d),
#and another containing a factor/grouping variable (f)

moods.median = function(d,f) {

    #make a new matrix data frame
    m = cbind(f,d)
    colnames(m) = c("group", "value")


    #get the names of the factors/groups
    facs = unique(f)

    #count the number of factors/groups
    factorN = length(unique(f))


    #Make a 2 by K table that will be saved to the global environment by using "<<-":
    #2 rows (number of values > overall median & number of values <= overall median)
    #K-many columns for each level of the factor
    MoodsMedianTable <<- matrix(NA, nrow = 2, ncol = factorN)

    rownames(MoodsMedianTable) <<- c("> overall median", "<= overall median")
    colnames(MoodsMedianTable) <<- c(facs[1:factorN])
    colnames(MoodsMedianTable) <<- paste("Factor: ",colnames(MoodsMedianTable))


    #get the overall median
    overallmedian = median(d)



    #put the following into the 2 by K table:
    for(j in 1:factorN){ #for each factor level

        g = facs[j] #assign a temporary "group name"


        #count the number of observations in the factor that are greater than
        #the overall median and save it to the table
        MoodsMedianTable[1,j] <<- sum(m[,2][ which(m[,1]==g)] > overallmedian)


        #count the number of observations in the factor that are less than
        # or equal to the overall median and save it to the table
        MoodsMedianTable[2,j] <<- sum(m[,2][ which(m[,1]==g)] <= overallmedian)

    }


    #percent of cells with expected values less than 5
    percLT5 = ((sum(chisq.test(MoodsMedianTable)$expected < 5)) /
        (length(chisq.test(MoodsMedianTable)$expected)))


    #if >20% of cells have expected values less than 5
    #then give chi-squared stat, df, and Fisher's exact p.value
    if (percLT5 > 0.2) {
        return(list(
            "Chi-squared" = chisq.test(MoodsMedianTable)$statistic,
            "df" = chisq.test(MoodsMedianTable)$parameter,
            "Fisher's exact p.value" = fisher.test(MoodsMedianTable)$p.value))

    }


    #if <= 20% of cells have expected values less than 5
    #then give chi-squared stat, df, and chi-squared p.value
    if (percLT5 <= 0.2) {
        return(list(
            "Chi-squared" = chisq.test(MoodsMedianTable)$statistic,
            "df" = chisq.test(MoodsMedianTable)$parameter,
            "Chi-squared p.value" = chisq.test(MoodsMedianTable)$p.value))

    }

}

OP의 질문에 대해서는 먼저 이것을 실행하여 일치하는 "group"변수를 사용하여 세 그룹 벡터의 값을 보유 할 새 데이터 프레임을 만듭니다.

require(reshape2)
df = cbind(group1, group2, group3)
df = melt(df)
colnames(df) = c("observation", "group", "value")

다음과 같이 Mood의 중앙값 테스트 기능을 실행하십시오. moods.median(df$value, df$group)


Kruskal-Wallis 테스트가 답인 것 같습니다. OP에는 3 개의 그룹이있는 솔루션이 필요했습니다. ttnphns가 이미 Mood 테스트를위한 R 코드를 제공 한 것으로 보입니다.
Michael R. Chernick

1
ttnphns가 준 코드는 ap 값만 제공하며 필자가 작성한 코드는 카이 제곱 통계 및 df를 제공하며 여러 그룹에서 작동합니다. 이 게시물이 R에서 Mood의 중앙값 중간 테스트를 수행하는 방법을 검색 할 때 가장 먼저
나왔기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.