为什么当平均值看起来真的不同时,t.test() 的 p 值在统计上不显着

机器算法验证 t检验 意思是 p 值 wilcoxon-mann-whitney 检验 群体差异
2022-02-06 06:33:22

我试图找出两组之间生物标志物的平均值是否存在显着差异。t.test在 R 中使用。这些mean(SD)在组中1142(1079)864(922)但是检验的 p 值显示差异在统计上不显着。有人可以帮帮我吗?我正在分享dput下面的数据框。

structure(list(ANGPTL7 = c(2.5, 205, 885, 1915, 835, 1685, 625, 
1615, 84.9999999999999, 1175, 2695, 235, 1025, 2.5, 2915, 825, 
255, 1085, 1815, 2.5, 205, 985, 2.5, 705, 435, 555, 2045, 135, 
15, 975, 2285, 1905, 515, 74.9999999999999, 25, 815, 1075, 2.5, 
1115, 3115, 64.9999999999999, 64.9999999999999, 325, 595, 285, 
2.5, 2.5, 345, 5.00000000000001, 215, 3465, 555, 855, 3745, 25, 
305, 2.5, 2.5, 15, 115, 565, 94.9999999999999, 1005, 575, 405, 
2.5, 1855, 1795, 145, 2555, 1705, 74.9999999999999, 735, 375, 
2.5, 475, 1675, 1105, 345, 385, 3195, 115, 1475, 205, 545, 1265, 
485, 1135, 2595, 3305, 305, 575, 1415, 2925, 3125, 2795, 3125, 
1775, 1125, 15, 1695, 1225, 1625, 3175, 3185, 1445, 3065, 785, 
855, 1115, 145, 595, 435, 185, 345, 2455, 1885), OSA_status = c("Non-OSA", 
"OSA", "Non-OSA", "OSA", "Non-OSA", "OSA", "Non-OSA", "OSA", 
"Non-OSA", "Non-OSA", "Non-OSA", "OSA", "OSA", "OSA", "OSA", 
"OSA", "Non-OSA", "Non-OSA", "OSA", "OSA", "Non-OSA", "Non-OSA", 
"OSA", "Non-OSA", "OSA", "OSA", "OSA", "OSA", "Non-OSA", "Non-OSA", 
"Non-OSA", "OSA", "OSA", "OSA", "OSA", "Non-OSA", "OSA", "OSA", 
"OSA", "Non-OSA", "Non-OSA", "Non-OSA", "Non-OSA", "Non-OSA", 
"OSA", "Non-OSA", "Non-OSA", "Non-OSA", "OSA", "Non-OSA", "OSA", 
"OSA", "OSA", "OSA", "Non-OSA", "Non-OSA", "OSA", "OSA", "Non-OSA", 
"OSA", "OSA", "Non-OSA", "Non-OSA", "Non-OSA", "Non-OSA", "Non-OSA", 
"OSA", "OSA", "OSA", "OSA", "OSA", "OSA", "OSA", "OSA", "OSA", 
"OSA", "OSA", "Non-OSA", "OSA", "Non-OSA", "OSA", "Non-OSA", 
"Non-OSA", "OSA", "Non-OSA", "OSA", "Non-OSA", "OSA", "OSA", 
"OSA", "OSA", "Non-OSA", "Non-OSA", "Non-OSA", "Non-OSA", "Non-OSA", 
"OSA", "Non-OSA", "Non-OSA", "Non-OSA", "OSA", "Non-OSA", "OSA", 
"OSA", "OSA", "OSA", "Non-OSA", "Non-OSA", "OSA", "OSA", "OSA", 
"OSA", "OSA", "OSA", "Non-OSA", "OSA", "OSA")), row.names = c(NA, 
-117L), class = c("tbl_df", "tbl", "data.frame"))


编辑这个数据示例对 R 用户来说非常好,但对其他人来说却是一个或大或小的痛苦。这种格式可能会也可能不会更容易,具体取决于。

id  ANGPTL7 OSA_status
1       2.5    Non-OSA
2     205.0        OSA
3     885.0    Non-OSA
4    1915.0        OSA
5     835.0    Non-OSA
6    1685.0        OSA
7     625.0    Non-OSA
8    1615.0        OSA
9      85.0    Non-OSA
10   1175.0    Non-OSA
11   2695.0    Non-OSA
12    235.0        OSA
13   1025.0        OSA
14      2.5        OSA
15   2915.0        OSA
16    825.0        OSA
17    255.0    Non-OSA
18   1085.0    Non-OSA
19   1815.0        OSA
20      2.5        OSA
21    205.0    Non-OSA
22    985.0    Non-OSA
23      2.5        OSA
24    705.0    Non-OSA
25    435.0        OSA
26    555.0        OSA
27   2045.0        OSA
28    135.0        OSA
29     15.0    Non-OSA
30    975.0    Non-OSA
31   2285.0    Non-OSA
32   1905.0        OSA
33    515.0        OSA
34     75.0        OSA
35     25.0        OSA
36    815.0    Non-OSA
37   1075.0        OSA
38      2.5        OSA
39   1115.0        OSA
40   3115.0    Non-OSA
41     65.0    Non-OSA
42     65.0    Non-OSA
43    325.0    Non-OSA
44    595.0    Non-OSA
45    285.0        OSA
46      2.5    Non-OSA
47      2.5    Non-OSA
48    345.0    Non-OSA
49      5.0        OSA
50    215.0    Non-OSA
51   3465.0        OSA
52    555.0        OSA
53    855.0        OSA
54   3745.0        OSA
55     25.0    Non-OSA
56    305.0    Non-OSA
57      2.5        OSA
58      2.5        OSA
59     15.0    Non-OSA
60    115.0        OSA
61    565.0        OSA
62     95.0    Non-OSA
63   1005.0    Non-OSA
64    575.0    Non-OSA
65    405.0    Non-OSA
66      2.5    Non-OSA
67   1855.0        OSA
68   1795.0        OSA
69    145.0        OSA
70   2555.0        OSA
71   1705.0        OSA
72     75.0        OSA
73    735.0        OSA
74    375.0        OSA
75      2.5        OSA
76    475.0        OSA
77   1675.0        OSA
78   1105.0    Non-OSA
79    345.0        OSA
80    385.0    Non-OSA
81   3195.0        OSA
82    115.0    Non-OSA
83   1475.0    Non-OSA
84    205.0        OSA
85    545.0    Non-OSA
86   1265.0        OSA
87    485.0    Non-OSA
88   1135.0        OSA
89   2595.0        OSA
90   3305.0        OSA
91    305.0        OSA
92    575.0    Non-OSA
93   1415.0    Non-OSA
94   2925.0    Non-OSA
95   3125.0    Non-OSA
96   2795.0    Non-OSA
97   3125.0        OSA
98   1775.0    Non-OSA
99   1125.0    Non-OSA
100    15.0    Non-OSA
101  1695.0        OSA
102  1225.0    Non-OSA
103  1625.0        OSA
104  3175.0        OSA
105  3185.0        OSA
106  1445.0        OSA
107  3065.0    Non-OSA
108   785.0    Non-OSA
109   855.0        OSA
110  1115.0        OSA
111   145.0        OSA
112   595.0        OSA
113   435.0        OSA
114   185.0        OSA
115   345.0    Non-OSA
116  2455.0        OSA
117  1885.0        OSA
4个回答

我同意@pikachu 的观点,即标准偏差与测试均值之间的差异相比太大,无法找到显着差异。

感谢您发布您的数据。在进行正式测试之前,查看一些数据的图形显示总是一个好主意。

两组观察结果的条形图没有显示相对于样本变异性的位置差异。

stripchart(ANGPTL7 ~OSA_status, pch="|", ylim=c(.5,2.5))

在此处输入图像描述

这是两组的箱线图。方框侧面的“缺口”是非参数置信区间,经过校准,重叠的缺口往往表明位置没有显着差异。

boxplot(ANGPTL7 ~ OSA_status, notch=T, 
        col="skyblue2", horizontal=T)

在此处输入图像描述

即使样本量如此之大,由于数据的显着偏斜,我也不愿意进行双样本 t 检验。我会做一个非参数的两样本 Wilcoxon 秩和检验(也没有显着差异)。

wilcox.test(ANGPTL7 ~ OSA_status)

        Wilcoxon rank sum test with continuity correction

data:  ANGPTL7 by OSA_status
W = 1456.5, p-value = 0.2139
alternative hypothesis: true location shift is not equal to 0

当您考虑均值之间的差异时,您必须使用与简单绝对差异不同的单位。考虑到您正在测量两个随机源产生的均值差异。这些随机来源(其结果是您的两个样本)包含可变性。应该使用这种可变性来比较均值的差异。标准差以与差值相同的单位测量,因此您应该看到标准差方面的差值。

现在你看到了手段的不同|1142864|远低于任何样本标准差。如果您使用正态分布进行近似,您会看到平均值的差异大约是标准偏差的三分之一(无论可以使用什么),并且您可以看到产生平均值差异的可能性很大只是随机错误。用作一个近似值,即在均值左侧和右侧具有一个标准差的正态分布中,您将获得大约 60% 的数据,而在 2 个标准差的情况下,您将覆盖大约 95% 的数据。平均差远小于任何标准差,因此您应该认为它们相等。

为了说明使用均值差异和变异进行比较的想法,您可以查看此图像 在此处输入图像描述 。当您比较考虑方差的均值时,您会发现两个分布差别不大,它们的重叠很大。

当您对差异进行 t 检验时,均值差异的分布如下所示: 测试统计 垂直条是您的均值差在标准差方面的位置,分布显示它的变化方式。应该明确的是,标准差比例平均值差异的值不是异常值,因此它不能产生小的 p 值。

关于绘制数据,我想指出 R 包ggbeeswarm在这种情况下,我认为它比箱线图或小提琴图更好。水平线段是 5%、50%、95% 处的分位数;dat是来自 OP 的数据

在此处输入图像描述

library(ggplot2)
library(ggbeeswarm)
library(data.table)

dat <- as.data.table(dat)
dat[, OSA_status := as.factor(OSA_status)]
qq <- dat[, list(quantile= quantile(ANGPTL7, p= c(0.05, 0.5, 0.95))), by= OSA_status]

gg <- ggplot(data= dat, aes(x= OSA_status, y= ANGPTL7)) +
    geom_quasirandom(width= 0.25) +
    geom_segment(data= qq, aes(y= quantile, yend= quantile, x= as.numeric(OSA_status)-0.1, xend= as.numeric(OSA_status)+0.1), colour= 'blue') +
    theme_light()

您的标准偏差(不确定性)太高并且具有选定的概率(我假设α=0.05默认情况下)置信区间是重叠的,因此均值之间没有统计学上的显着差异。

编辑:一个平均值的 CI 涵盖了第二个平均值的估计值,因此它们没有显着差异。感谢评论的更正。