假设检验用于两个以上样本之间的中位数差异


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)

但是,这一次只比较两个组,我想同时比较所有三个组。我想进行统计检验,得出p值为0.05的显着性水平。有人可以帮忙吗?

编辑#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 Snow在回答中很有帮助地指出,只要Kruskal-Wallis检验做出严格的假设,使其成为对均值的检验,则该检验是适当的。


这个站点上已经有许多类似的问题。请寻找median test。我自己的答案/评论在这里
ttnphns 2014年

至于同时比较所有三个的中位数,请参见我对略有修改的R代码的编辑。
冬眠

Answers:


4

还可以使用Kruskal-Wallis检验,因为它是非参数方差分析。此外,它通常被认为比Mood的中位数测试更强大。可以使用R 中的stats包中的kruskal.test函数在R中实现。

为了响应您的编辑,解释KW类似于单向方差分析。有效的p值对应于所有三个均值均相等的拒绝空值。您必须使用跟进测试(同样,类似于方差分析)来回答有关特定组的问题。这通常遵循您可能有的特定研究问题。仅通过查看模拟的参数,如果进行后续测试,所有三个组就应该彼此显着不同(因为它们彼此相距1 SD,N = 100)。


1
要澄清两件事。1)除非各组中观察值的分布符合某些假设,否则Kruskal-Wallis并非中位数的检验。如果您真的想比较中位数,则可能不合适。最好选择一个实际测试您对测试感兴趣的假设的测试。2)Kruskal-Wallis不是“ ANOVA”。也就是说,它不是方差分析。3)在此答案中提及“方法”是不正确的。
Sal Mangiafico

10

首先,Wilcoxon检验(或Mann-Whitney检验)不是中位数检验(除非您做出非常严格的假设,也使它成为均值检验)。对于比较两个以上的组,Wilcoxon检验可能导致一些矛盾的结果(请参阅Efron的骰子)。

由于Wilcoxon检验只是置换检验的一种特殊情况,并且您对中位数特别感兴趣,因此我建议对中位数进行置换检验

首先选择差异的度量,例如3个中位数中的最大值减去3个中位数的最小值(或3个中位数的方差,或MAD等)。

现在计算原始数据的统计信息。

将所有数据集中在一组中,然后将值随机分为三组

与原始大小相同,并计算相同的统计信息。

重复很多次(例如9998)

比较实际数据中的统计信息与测试中所有统计信息的分布比较。


可以说,我愿意对Wilcox检验做出必要的严格假设,这也将使其成为经济能力的检验。是否需要更改我上面编写的R代码?Kruskal-Wallis检验也可以做到吗?
2014年

1
@亚历山大,如果您愿意做这些假设,那么R代码很好,Kruskal Wallis也很好。不过,如果你愿意做这些假设,然后t.testaov将可能被罚款以及。
Greg Snow 2014年

+1。如果您正在谈论,Wilcoxon sum-rank test您是否介意将“ Wilcox”转换为该名称?
ttnphns 2014年

@GregSnow +1了... (不幸的是,R使这种混乱更加复杂了,后者误导了相应的测试wilcox.test)。你可以编辑吗?
Glen_b-恢复莫妮卡2014年

8

Mood的中位数检验是一种非参数检验,用于检验两个或多个总体的中位数是否相等。请参阅此处了解您问题的R部分。另请参阅此处的相关问题。也从这里

Mood的中位数测试是最简单的手工测试:计算(所有数据中的)总体中位数,并计算每组中上位数以下的值。如果各组大致相同,则观察值应在每组总中位数之上和之下约50-50。中位数以下和中位数以上的计数组成一个双向表,然后使用卡方检验分析。Mood的中位数测试非常类似于将符号测试推广到两个或更多组的测试。

编辑: 对于三组,您可以考虑我链接到​​的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用于命名测试。我不知道中位测验也称为Mood测验。
ttnphns 2014年

+1感谢您为我提供帮助,我非常感谢!
亚历山大

我知道mood.medtestRVAideMemoire软件包中的R 中有几个实现 是常规测试,除了默认情况下对于较小的样本量它使用Fisher精确测试。median_test硬币包装中的功能可以提供渐近测试或使用蒙特卡洛。
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的问题,您首先需要运行它以创建一个新的数据框,以保存来自三个具有匹配的“组”变量的组向量的值。

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值,我编写的代码也提供了卡方的stat和df,它适用于任意数量的组。我主要是在这里发布,因为该帖子是第一个在R中搜索Mood中位数测试的方法
。– JRF1111
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.