方差、大小和形状不等的样本中位数的比较

机器算法验证 t检验 非参数 意思是 中位数 wilcoxon-mann-whitney 检验
2022-03-27 06:33:54

我想做什么以及我的数据看起来如何?

我正在尝试对通常不是正态分布的数据组的中位数进行一些比较。在某些情况下,我会比较一些具有 100-200 个数据点的组,但在其他情况下,我想比较只有 4 和 10 个数据点的组。实际上,所有比较组的样本量都不相同。

我该怎么做?

对此,我正在做以下事情:

  1. 使用 Kolmogorov-Smirnov 检验比较两个样本的形状(即检验是否data1呈现出遵循data2; In Mathematica的分布KolmogorovSmirnovTest[data1,data2]);
  2. 如果形状在统计上相似,我使用 Mann-Whitney U 检验来比较中位数;
  3. 在大多数情况下,组的形状在统计上并不相似。因此,我想使用 Welch 校正进行 t 检验(如本答案本维基百科页面中所建议的那样)。但是,这还没有在 Mathematica 中实现,我目前没有时间自己做。

我知道,通过转向 Welch t 检验,我不再比较中位数,而是比较平均值,但如果没有其他选项可用,我会这样做。

问题:

  • 是否有其他测试可以比较方差、形状和大小不等的样本之间的中位数?
  • 我可以采取的最小样本量是多少?我知道 t 检验不存在最小样本量,因为它取决于分析的能力。但也许比较 4 点和 10 点的分布形状不是很好......在这种情况下,中心极限定理不应该有很强的影响
  • 有人知道数学中的这种实现吗?或者也许如何在那里进行韦尔奇 t 检验?

PS - 我已经搜索了很多,包括在这个论坛中,但在这方面没有出现。如果之前已经回答过这个问题,我真的很抱歉。

附加信息:

在评论中,有人询问了一些额外的信息。我希望这一切都有意义,如果我不能为我们的真实问题提供更高的背景,我很抱歉。

  • 每个样本的信息都是从许多生物的基因组组成中收集的。所以我有两个独立样本列表,(0.01,0.7,0.15,...)其分布我不希望遵循任何特定趋势(即正态、对数正态等)。
  • 对于每个有机体,我们都有完整的频率,不仅是一个样本,还有要比较的组:我们只有一个小样本。理想情况下,我们将能够收集数千种生物的信息,但这不可行或目前不可用。所以,在我们最大的群体中,我们有几百个有机体,在最小的群体中,我们有几十个。
  • 我们想要测试的是,一个生物群体在一个群体中的频率是否高于另一群体。这是因为我们想要进行位置比较,其中比较的度量代表该人群记住我们特定的生物学问题)。所以我们想要对两个群体进行比较的一般衡量标准,允许简单地说“这两个群体在[这个]总体衡量标准上差异不大”或“这个群体往往表现出更高的中位数” /平均频率比另一个“。
  • 我知道均值/中位数本身对两个人口的分布信息不够丰富。例如,如果一个重尾,它们可能都表现出相似的中位数,但其中一个可能表现出更高的平均值。但是,出于我们的目的,我们认为中位数(或必要时的平均值)提供了足够的洞察力。
3个回答

我建议您考虑 Akritas、Arnold、Brunner 等的相对总结效应/相对治疗效应方法。关于该主题的最佳书籍通常是Brunner、Domhof 和 Langer的因子实验中纵向数据的非参数分析,这是写得很好,很清楚。

这些方法基于修改后的 Mann-Whitney 概念,并且可以适应您使用标准统计软件提到的许多功能。

一种(非常保守/低功率)的选择是使用 Mood 的中值测试。它不假设方差的正态性或同质性(或至少对不等方差非常稳健)。

该检验是通过对小于或等于总体中位数与大于每组总体中位数的观察数进行交叉制表来完成的。从那里,您在桌子上运行卡方检验。对于两组比较并且当组较小时,我会使用 Fisher 精确检验而不是卡方检验。

编辑:因为我不知道 Mathematica 是否有用于 Mood 中位数测试的功能,如果你愿意尝试使用 R,我有你可以使用的代码。

编辑 2:根据 Sosi 的要求,代码如下:

moods.median = function(v, f, exact = FALSE) {
#v is the set of Values you want to test
#f is a Factor or grouping variable
#if you want to use Fisher's exact test, specify "exact = TRUE"

if (length(v) != length(f)) {
    stop(c("v and f must have the same length"))
}



#make a new matrix data frame
m = cbind(as.character(f),v)
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))

if (factorN < 2) {
    stop("there must be at least two groups in variable 'f'")
}

#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(v)


#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)

}

print(MoodsMedianTable)

if(exact == FALSE){return(chisq.test(MoodsMedianTable))}

if(exact == TRUE){return(list(
    chisq.test(MoodsMedianTable),
    fisher.test(MoodsMedianTable)))
}
}

我个人的看法是,您的测试顺序倒退了。如果 Kolmogorov-Smirnov 检验表明样本来自相似分布,则使用 t 检验,否则使用 Mann-Whitney U 检验。

对于不等方差,Fligner 和 Policello (1981) 提出了一个程序,他们描述了一种方法,如果违反了 Mann-Whitney U 检验的方差同质性假设,则该方法可用于计算调整后的 U 统计量。我对 Fligner-Policello 测试的参考是 Fligner, MA & Policello, II, GE (1981)。Behrens-Fisher 问题的稳健秩程序。美国统计协会杂志,76,162-174。

Welch 的 T 检验似乎在 MeanDifferenceCl 的 EqualVariances->False 选项中实现。

EqualVariances False 是否假定未知总体方差相等 - MeanDifferenceCI 的选项。