3つ以上のサンプル間の中央値の差に関する仮説検定


12

質問

3つのグループの人のテストスコアは、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)

これらのグループの中央値に大きな違いがあるかどうかを知りたいです。ウィルコクソン検定を使用して、グループ1とグループ2をテストできることを知っています。

wilcox.test(group1, group2)

ただし、これは一度に2つのグループのみを比較するため、3つすべてを同時に比較したいと思います。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つのグループのみの中央値の有意差をテストできます。3つすべての中央値を同時に比較するためにどのように使用するのかわかりません。

編集#2-クラスカル・ワリス検定

ユーザーdmartinの提案された答えは、多かれ少なかれ必要なものであり、3つのグループすべてを同時にテストすることができます。

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

編集#3

ユーザーGreg Snowは、Kruskal-Wallisテストが手段のテストでもあるという厳密な仮定を立てる限り、適切であると答えています。


このサイトにはすでに多くの同様の質問があります。を探してくださいmedian test。私自身の答え/コメントはこちらです。
ttnphns 14年

3つすべての中央値を同時に比較する場合は、わずかに変更されたRコードの編集を参照してください。
休止状態14年

回答:


4

Kruskal-Wallis検定は、ノンパラメトリックANOVAであるため、使用することもできます。さらに、ムードの中央値テストよりも強力であると考えられることがよくあります。kruskal.testを使用してRで実装できます。のstatsパッケージの関数。

編集に応答するために、KWの解釈は一元配置分散分析に似ています。有意なp値は、3つの平均がすべて等しいという拒否されたヌルに対応します。特定のグループに関する質問に答えるには、フォローアップテスト(ANOVAと同様)を使用する必要があります。これは通常、特定の研究上の質問に続くものです。シミュレーションのパラメーターを見るだけで、フォローアップテストを行うと、3つのグループすべてが互いに大きく異なるはずです(N = 100ですべて1 SD離れているため)。


1
いくつかのことを明確にします。1)グループ内の観測値の分布が特定の仮定を満たさない限り、クラスカル・ワリスは中央値の検定ではありません。中央値を比較したい場合は、適切なテストではない可能性があります。テストに興味のある仮説を実際にテストするテストを選択するのが最善です。2)クラスカル・ワリスは「ANOVA」ではありません。つまり、分散分析ではありません。3)この回答の「手段」の言及は間違っています。
サルマンジャフィコ

10

まず、ウィルコクソン検定(またはマン・ホイットニー検定)は中央値の検定ではありません(平均の検定となる非常に厳密な仮定を行わない限り)。また、2つ以上のグループを比較すると、ウィルコクソン検定は逆説的な結果につながる可能性があります(エフロンのサイコロを参照)。

Wilcoxon検定は、並べ替え検定の単なる特殊なケースであり、あなたが中央値で特に興味を持っているので、私はことをお勧め並べ替え検定中央値上を。

最初に、3つの中央値の最大値から3つの中央値の最小値(または3つの中央値の分散、またはMADなど)のような差の尺度を選択します。

次に、元のデータの統計を計算します。

すべてのデータを1つのセットにプールしてから、値を3つのグループにランダムに分割します

元のサイズと同じサイズで、同じ統計を計算します。

何回も繰り返す(9998など)

実際のデータの統計と、テストのすべての統計の分布を比較してください。


ウィルコックス検定に必要な厳密な仮定を立てることを望んでいるとしましょう。上記で書いたRコードを変更する必要がありますか?Kruskal-Wallisテストでもこれを行うことができますか?
アレクサンダー14年

1
@アレクサンダー、あなたがそれらの仮定をする気があるなら、Rコードは問題ありませんし、クラスカル・ウォリスも問題ないでしょう。しかし、その後、あなたがそれらの仮定をして喜んでいる場合t.testと、aovおそらく同様に罰金だろう。
グレッグスノー14年

+1。あなたはについて話している場合Wilcoxon sum-rank test、あなたはその名前に「ウィルコックス」を変換するために、気にしないだろうか?
ttnphns 14年

@GregSnow +1が得られたポイントについて...しかし、「Wilcox」とは、Frank Wilcoxonにちなんで名付けられたテストを意味すると思います。(残念ながら、この混乱はRによってさらに悪化します。Rは、誤解を招くことに、対応するテストを呼び出しますwilcox.test)。編集してもらえますか?
Glen_b-モニカの復職14

8

ムードの中央値検定は、2つ以上の母集団の中央値の平等性をテストするために使用されるノンパラメトリック検定です。質問のR部分については、こちらをご覧ください。また、関連の質問を参照してくださいここにここからも:

ムードの中央値テストは、手作業で行うのが最も簡単な方法です。(すべてのデータの)中央値全体を計算し、各グループの中央値の上下にある値の数をカウントします。グループがほぼ同じである場合、観測値は各グループの全体の中央値の上下約50〜50になります。中央値より下と中央値より上のカウントは、双方向の表を形成します。カイ二乗検定を使用して分析されます。ムードの中央値検定は、2つ以上のグループに一般化された符号検定によく似ています。

編集: 3つのグループでは、私がリンクした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 14年

+1これを手伝ってくれてありがとう、本当に感謝しています!
アレクサンダー14年

R. mood.medtestのRVAideMemoireパッケージの実装がいくつかあることは知ってい ますが、RVAideMemoireパッケージは、サンプルサイズが小さい場合にデフォルトでフィッシャーの正確検定を使用することを除いて、通常のテストのようです。median_testコインパッケージの関数は、漸近検定を提供したり、モンテカルロを使用したりできます。
サルマンジャフィコ

0

私はこれがかなり遅いことを知っていますが、ムードの中央値テストのための良いパッケージを見つけることができなかったので、私はそれを自分自身に取り込んで、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の質問では、最初にこれを実行して、一致する「グループ」変数を持つ3つのグループベクトルからの値を保持する新しいデータフレームを作成します。

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コードを提供しているようです。
マイケルR.チェルニック

1
ttnphnsが提供したコードはap値のみを提供し、私が書いたコードはchiの2乗統計量とdfを提供し、任意の数のグループで機能します。この投稿は、RでのMoodの中央値中央値テストの実行方法を検索するときに最初に出てくるので、ほとんどここに投稿しました。
JRF111117年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.