问题背景:作为我研究的一部分,我编写了两种算法,可以从数据集(癌症患者的基因表达数据)中选择一组特征。然后对这些特征进行测试,以了解它们如何将看不见的样本分类为癌症或非癌症。对于算法的每次运行,都会生成一个解决方案(一组特征)并在 Z 个未见过的样本上进行测试。解决方案的百分比精度计算如下:(correct classifications / Z) * 100.
我有两种算法:算法 X 和算法 Y
我有三个独立的(不同的癌症)数据集:数据集 A、数据集 B 和数据集 C。这些数据集彼此非常不同。它们没有相同数量的样本或每个样本的相同数量的测量(特征)。
我在每个数据集上运行了每个算法 10 次。因此,算法 X 有来自数据集 A 的 10 个结果,来自数据集 B 的 10 个结果和来自数据集 C 的 10 个结果。总的来说,算法 X 有 30 个结果。
我的问题:我想看看算法 X 在所有三个数据集上的综合性能在统计上是否与算法 Y 的综合性能有显着差异。
我是否可以将每个数据集的算法 X 的结果组合成一组结果?这样,我将有 30 个算法 X 的标准化结果和 30 个算法 Y 的标准化结果。然后我可以使用 t 检验来查看这两种方法之间是否存在显着差异。
编辑 -这些是进化算法,因此每次运行它们都会返回稍微不同的解决方案。但是,如果样本中有一个特征在存在时可以将样本强烈分类为癌症或非癌症,那么几乎每次运行算法时都会选择该特征。
由于以下原因,我在 10 次运行中的每一次得到的结果都略有不同:
- 这些算法是随机播种的。
- 我使用重复的随机子抽样验证(10 次重复)。
- 我使用的数据集(DNA 微阵列和蛋白质组学)很难使用,因为算法可能会陷入许多局部最优值。
- 我想检测很多特征间和子集间的交互。
- 我训练了 50 条染色体,它们不受任何特定长度的限制。它们可以自由生长和收缩(尽管选择压力会引导它们变短)。这也给最终结果带来了一些变化。
话虽如此,该算法几乎总是选择特定的特征子集!
这是我的结果示例(此处显示每种算法的 10 次运行中只有 4 次):
数据集/运行算法 X 算法 Y 1 90.91 90.91 2 90.91 95.45 3 90.91 90.91 4 90.91 90.91 乙 1 100 100 乙 2 100 100 乙 3 95.65 100 乙 4 95.65 86.96 C 1 90.32 87.10 C 2 70.97 80.65 C 3 96.77 83.87 C 4 80.65 83.87
如您所见,我将来自三个数据集的两种算法的结果放在一起。我可以对这些数据进行 Kruskal-Wallis 测试,但它是否有效?我问这个是因为:
- 我不确定不同数据集中的准确性是否可以比较。如果它们不是,那么像我所做的那样将它们放在一起将毫无意义,对它们进行的任何统计测试也将毫无意义。
- 当您像这样将精度放在一起时,整体结果很容易受到异常值的影响。一种算法在一个数据集上的出色性能可能会掩盖它在另一个数据集上的平均性能。
在这种情况下我也不能使用 t-test,这是因为:
- 可公度性 - 只有当数据集的差异相当时,t 检验才有意义。
- t-test 要求比较的两种算法之间的差异是正常分布的,在我的情况下(至少我知道)无法保证这种情况。
- t 检验受异常值的影响,这些异常值会扭曲测试统计数据并通过增加估计的标准误差来降低测试的功效。
你怎么看?在这种情况下,如何在算法 X 和 Y 之间进行比较?