资讯详情

小样本t检验全解析:t分布表、自由度与代码复现

📅 2026/10/31 18:31:59 | 华诺云谱 👁 阅读
小样本t检验全解析:t分布表、自由度与代码复现
1. 样本量一小正态分布那套就不灵了t分布、t检验、t分布表这几个词几乎每个做过数据分析的人都绕不开可真到查表那一刻单尾双尾搞反、自由度取错的情况比比皆是。我当年第一次独立做一组对照实验的数据分析样本量只有9兴冲冲地用正态分布的临界值1.96去卡算出来p值0.048结论是显著。导师看了一眼只问一句你自由度多少我当时愣住——那是我第一次意识到样本一小正态分布那套近似就不灵了必须换成t分布这套体系。这篇东西就是把我这些年在这几个东西上踩过的坑、总结的手算路径、以及代码复现方法完整摊开适合刚接触统计推断的学生、需要手算复核结果的研究人员也适合那些天天调scipy.stats.ttest_ind却说不清里面到底在算什么的人。先把最核心的三个概念摊开说清楚。t分布是一族以0为中心、左右对称、形状类似正态但尾部更厚的连续概率分布它的形状由自由度这个参数唯一决定自由度越小尾巴越肥意味着出现极端值的概率越高。t分布表是把t分布在各个自由度和各个显著性水平下的临界值预先算好、排成表格供人查用的工具在没有计算器的年代它是刚需现在虽然软件一键出p值但理解这张表的结构仍然是理解t检验逻辑的关键。t检验则是利用t分布作为零假设参考分布的一类假设检验方法用来判断样本均值与某个理论值是否有差异、两组样本均值是否不同、配对数据的差值是否显著不为零。为什么非得用t分布核心原因在于总体标准差未知。做z检验时我们假设已经知道总体标准差σ此时样本均值标准化后严格服从标准正态分布。但现实里σ几乎永远不知道只能用样本标准差s去估计它。s本身是个随机变量会随样本波动这个估计误差叠加进去之后标准化统计量的分布就不再是正态而是尾部更厚的t分布。样本量越大s对σ的估计越准t分布越接近正态样本量趋于无穷时t分布就收敛到标准正态。这也解释了为什么t分布表最下面一行往往写着∞对应的正是1.96、1.645这些我们熟悉的z值。1.1 从一次均值比较的翻车说起那次翻车之后我回头把整个过程重算了一遍问题出在三个地方叠加。第一样本量n9自由度应该是n-18我按正态分布取1.96而df8时双尾0.05的临界值其实是2.306我的t值只有2.05压根没到线。第二我根本没算t值我是拿均值差除以标准误之后直接跟1.96比的这一步形式上没错错在参照系选错了。第三我在报告里写p0.048实际上按t分布算是p≈0.074结论从显著变成不显著。这个教训让我形成了一个习惯只要涉及样本均值、样本量小于30左右、总体标准差未知第一反应就是t分布不是正态。当然这不是说n≥30就一定能用正态近似30这个门槛是历史遗留的经验法则严格来说近似好坏取决于数据本身的偏态程度和尾部厚度。我手上有一批明显右偏的时长数据n50的时候用正态近似算出来的p值跟t分布算的还能差出百分之十几所以现在我的默认做法是除非明确知道总体方差否则一律用t反正软件算t跟算z成本一样。这里补充一个常被忽略的点t检验对小样本的保护是有代价的。t分布尾部厚同样的均值差在t检验下更难达到显著这实际上是一种保守策略防止你在证据不足时过度自信。反过来说如果你的数据本身就严重偏离正态比如含极端离群值、双峰分布t检验的前提假设也被破坏了这时候尾部厚度再怎么修正也救不回来需要考虑非参数方法或者数据变换。1.2 自由度这只看不见的手到底在调什么自由度这个概念很多人背了定义却没用起来。直观理解你有n个观测值要估计一个均值均值一旦确定n个观测里就只有n-1个可以自由变动——最后一个必须由总和减去除它之外的所有值倒推出来。所以在用样本估计均值后再算离散程度这件事上信息的有效条数是n-1这就是单样本t检验自由度取n-1的由来。自由度对t分布形状的影响非常直观。df1时t分布就是标准柯西分布尾部厚到连均值都不存在极端值出现的概率高得离谱双尾0.05的临界值是12.706是正态的6倍多。df2时临界值降到4.303df5时2.571df10时2.228df30时2.042df120时1.980无限接近1.96。我习惯把这个过程想象成用越来越长的尺子去量同一个东西——尺子越短自由度越小你越不敢下结论需要的证据门槛就越高。不同类型的t检验自由度算法不一样这是实操里最容易出错的地方之一检验类型统计量公式自由度单样本t检验t (x̄ − μ₀) / (s / √n)n − 1独立样本合并方差t (x̄₁ − x̄₂) / [s_p·√(1/n₁ 1/n₂)]n₁ n₂ − 2独立样本Welch修正t (x̄₁ − x̄₂) / √(s₁²/n₁ s₂²/n₂)Welch–Satterthwaite 近似通常非整数配对样本t检验t d̄ / (s_d / √n)配对对数 − 1表里那个非整数自由度经常吓到新手Welch修正算出来的df可能是7.83这种数查表时要么向下取整、要么用插值要么干脆交给软件。我个人的建议是只要两组样本量不等或者方差看起来差得多直接用Welch别硬套合并方差。合并方差的前提是两组总体方差相等这个假设在真实数据里经常不成立硬套会导致第一类错误率悄悄膨胀。1.3 t分布和正态分布、z检验的边界画在哪我常被问一个问题到底什么时候用t、什么时候用z给一个我实际在用的判断流程。首先看总体标准差σ是否已知——已知就用z未知就用t这条是硬规矩。其次看样本量如果σ未知且n很小比如小于15t和z的临界值差距很大必须用tn在30到100之间两者差距已经缩到百分之一二用哪个结果都差不多但报告里最好统一用t逻辑更干净n超过200t和z基本可以互换。还有一类场景是比例检验比如转化率对比这时候用的是z检验或者卡方不是t因为比例的标准误估计方式不一样。我见过有人把两组转化率硬塞进t检验虽然数值上勉强能算但理论上不严谨。t检验服务的是连续型变量的均值这个适用边界要守住。另外提一句t分布不只用于均值检验。回归系数的显著性检验、相关系数的显著性检验底层用的都是t分布因为回归系数除以它的标准误之后在零假设下服从自由度为n-p-1的t分布。所以你把t分布吃透了后面学线性回归会顺很多。2. 把t分布表读明白比背公式重要得多t分布表这个东西看起来就是一张二维数字网格但它背后藏着三重约定行是自由度、列是显著性水平、每个格子里是临界值。问题在于显著性水平这一列到底指单尾还是双尾不同教材、不同软件给出的表可能完全不一样。我见过最坑的一张表表头写着α结果它是单尾α学生按双尾理解去查临界值直接小了一截本该不显著的结果被判定为显著。所以读表的第一步不是找数字而是先确认这张表的列头语义。常见的表头有三种写法第一种直接写单尾α列值是0.05、0.025、0.01、0.005第二种写双尾α列值是0.10、0.05、0.02、0.01第三种最阴险写α但在表注里说明是单尾你不看表注就会栽。我现在的做法是拿到任何一张t表先找df∞那一行看0.05那一列是不是1.645如果是说明这是单尾表如果1.96出现在0.05列那这是双尾表。这个自检技巧一秒钟就能定性强烈建议养成习惯。2.1 单尾双尾的换算关系与查表实操单尾和双尾的关系其实很简单双尾α对应的单尾α是它的一半。双尾0.05等价于单尾0.025双尾0.01等价于单尾0.005。反过来单尾0.05对应双尾0.10。记住这个换算任何一张表都能用。举个具体例子。某次实验做了10个样本的单样本t检验算出t2.15问双尾p值大概多少。第一步自由度df10-19。第二步如果手上是双尾表直接在df9那一行找0.05列是2.2620.10列是1.833。t2.15落在1.833和2.262之间说明双尾p值在0.05和0.10之间。第三步如果手上是单尾表df9行0.025列是2.2620.05列是1.833t2.15同样落在两列之间但这时候要知道单尾p在0.025到0.05之间对应双尾就是0.05到0.10。两条路径结果一致这就是换算的意义。如果需要更精确的p值就得插值。线性插值够用p ≈ p₁ (t − t₁)/(t₂ − t₁) × (p₂ − p₁)。上面例子里t₁1.833对应p₁0.10t₂2.262对应p₂0.05代入得p ≈ 0.10 (2.15−1.833)/(2.262−1.833) × (0.05−0.10) 0.10 − 0.0369 ≈ 0.063。软件精确算是0.0601插值误差在可接受范围内。当然日常分析直接用软件出精确值插值只在没有计算工具或者需要快速判断时用。2.2 常用临界值完整对照直接抄下面这张表是我自己整理后打印贴在显示器边上的版本覆盖了最常用的四个显著性水平和常见自由度。表里的列头是双尾α也就是做双侧检验时直接对号入座df双尾0.10双尾0.05双尾0.02双尾0.0116.31412.70631.82163.65722.9204.3036.9659.92532.3533.1824.5415.84142.1322.7763.7474.60452.0152.5713.3654.03261.9432.4473.1433.70771.8952.3652.9983.49981.8602.3062.8963.35591.8332.2622.8213.250101.8122.2282.7643.169121.7822.1792.6813.055151.7532.1312.6022.947201.7252.0862.5282.845251.7082.0602.4852.787301.6972.0422.4572.750401.6842.0212.4232.704601.6712.0002.3902.6601201.6581.9802.3582.617∞1.6451.9602.3262.576表格中间跳过的自由度用的时候就近取邻近的较小值宁可保守一点。比如df17取df15那行的临界值会比精确值略大判断更严格不会误判显著。这个向下取整的小习惯在手工复核时能省掉不少麻烦。2.3 双侧检验和单侧检验的选择逻辑单双尾的选择不是看心情而是看你的研究问题有没有方向性。如果问题是新工艺的强度是否不同于旧工艺那是双侧因为任何方向的差异都算发现如果问题是新工艺的强度是否高于旧工艺那是单侧因为你只关心一个方向。单侧检验的临界值更小更容易显著但代价是另一方向的极端结果你选择视而不见——如果新工艺其实显著更差单侧检验会告诉你不显著这个风险得自己承担。我的建议很直接除非有非常强的先验理由只关心一个方向否则一律用双侧。绝大部分场景下双侧是更稳妥、更容易被审稿人和同行接受的选择。见过太多人先跑双侧不显著然后改成单侧显著了这种事后切换检验方向的做法在方法学上是站不住的。3. 三类t检验的计算路径手算一遍才算真懂把公式抄下来和真正手算一遍理解深度差得远。我要求每个带我的新人都至少完整手算一次单样本、一次独立双样本、一次配对样本算完再跟软件结果对误差在0.01以内才算过关。这一节就把三条路径的完整计算过程摊开每一步都写清楚在算什么。3.1 单样本t检验从一个具体数据集走完全程假设某批次产品的标称厚度是5.00毫米抽了8件实测数据是5.12、4.89、5.03、4.95、5.08、4.91、5.15、4.87。问题是这批产品的平均厚度是否偏离标称值。第一步算均值。总和 5.124.895.034.955.084.915.154.87 40.00均值 x̄ 40.00/8 5.00。巧了均值正好等于标称值那是不是就不用检验了不是均值相等不代表没有系统偏差我们要看的是这8个观测能否支撑总体均值等于5.00这个论断。第二步算样本标准差。先算每个值与均值的偏差平方0.12²0.0144(−0.11)²0.01210.03²0.0009(−0.05)²0.00250.08²0.0064(−0.09)²0.00810.15²0.0225(−0.13)²0.0169。求和 0.0838。除以n−17得方差 0.011971开方得 s ≈ 0.10941。第三步算标准误。SE s/√n 0.10941/2.82843 ≈ 0.03868。第四步算t统计量。t (5.00 − 5.00)/0.03868 0。t0意味着样本均值与假设值完全一致p值必然是1不拒绝原假设。这个例子太巧了换一个假设值。如果标称值是5.10呢t (5.00 − 5.10)/0.03868 ≈ −2.585。自由度df7。查表df7双尾0.05临界值2.365双尾0.02临界值是2.998。|t|2.585落在两者之间所以双尾p值在0.02到0.05之间。软件精确算 p ≈ 0.0362。结论是在0.05水平下拒绝原假设这批产品的平均厚度显著偏离5.10。这里有个细节值得说t为负只是表示样本均值低于假设值双侧检验只看绝对值。如果是单侧检验是否显著低于那就要看左尾p值等于双尾p的一半约0.018。3.2 独立双样本t检验合并方差和Welch怎么选两组独立样本的比较是最常见的场景。假设A组7个观测23.1、22.4、24.0、23.7、22.9、23.5、23.2B组6个观测21.8、22.5、21.9、22.3、22.0、21.6。问两组均值是否有差异。先算基础量。A组均值 (23.122.424.023.722.923.523.2)/7 162.8/7 ≈ 23.257。B组均值 (21.822.521.922.322.021.6)/6 132.1/6 ≈ 22.017。算方差。A组偏差平方和(−0.157)²(−0.857)²(0.743)²(0.443)²(−0.357)²(0.243)²(−0.057)² ≈ 0.02460.73440.55200.19620.12740.05900.0032 1.6968。方差 s_A² 1.6968/6 ≈ 0.2828s_A ≈ 0.5318。B组偏差平方和(−0.217)²(0.483)²(−0.117)²(0.283)²(−0.017)²(−0.417)² ≈ 0.04710.23330.01370.08010.00030.1739 0.5484。方差 s_B² 0.5484/5 ≈ 0.1097s_B ≈ 0.3312。合并方差路径s_p² [(7−1)×0.2828 (6−1)×0.1097]/(76−2) (1.69680.5484)/11 ≈ 0.2041。s_p ≈ 0.4518。SE s_p×√(1/71/6) 0.4518×√(0.3095) ≈ 0.4518×0.5563 ≈ 0.2513。t (23.257−22.017)/0.2513 ≈ 4.934。df 11。查表df11双尾0.01临界值3.106|t|4.934远超p 0.01。Welch路径SE √(0.2828/7 0.1097/6) √(0.040400.01828) √0.05868 ≈ 0.2422。t 1.24/0.2422 ≈ 5.120。自由度按Welch–Satterthwaite近似算出来约9.6。查表df9到10之间临界值约2.25同样远超p 0.01。两条路径结论一致但t值差了约4%。这在结论层面无所谓但如果t值刚好卡在临界值附近选哪条路径就可能决定显著与否。我的判断标准写在下面这张对照表里判断条件推荐路径理由两组样本量接近比值1.5且方差接近比值2合并方差假设基本成立检验效能更高样本量差异大比值≥1.5Welch合并方差在样本量不等时对方差较大的组赋予过多权重方差明显不等比值≥2Welch直接规避方差齐性假设无法判断Welch现代统计软件的默认选项代价是自由度略小实战里我的默认就是Welch理由是它只牺牲一点点检验效能却换来了对方差不等场景的鲁棒性。除非两组样本量完全相等且方差接近我才会考虑合并方差。3.3 配对样本t检验化成单样本来看就通透了配对数据的本质是把两组比较转化成一组差值的单样本检验。假设同一批受试者在干预前后各测一次8组前后数据前(20.1, 19.8, 21.3, 20.5, 19.9, 20.8, 21.0, 20.2)后(19.4, 19.1, 20.6, 19.8, 19.5, 20.1, 20.3, 19.7)。先算8个差值前减后0.7、0.7、0.7、0.7、0.4、0.7、0.7、0.5。差值均值 d̄ (0.7×50.40.5)/8 4.8/8 0.6。差值标准差偏差为0.1、0.1、0.1、0.1、−0.2、0.1、0.1、−0.1平方和 0.01×50.040.01 0.10。方差 0.10/7 ≈ 0.01429s_d ≈ 0.1195。SE 0.1195/√8 ≈ 0.04225。t 0.6/0.04225 ≈ 14.20。df 7。远超临界值2.365p 0.001。配对检验的关键前提是配对关系必须真实存在不能为了用配对检验硬凑配对。如果两组数据其实是独立采集的硬按配对算会导致样本量信息被浪费或者更糟——如果配对关系错乱结果可能完全失真。我见过有人把两组完全不相关的样本按顺序强行配对算出来显著这是方法学上的错误。配对设计的好处在于它能抵消个体间的天然差异。上面例子里如果忽略配对按独立样本算两组组内方差都不小组间差值0.6可能就被组内波动淹没了。配对之后只看每个人自己的变化量个体基线差异被消掉信号就凸显出来了。这也是为什么同一批对象前后对比的实验设计效能通常远高于两组独立对象的设计。4. 用代码把查表和计算全部复现一遍手算过关之后就轮到代码了。我的习惯是手算和代码必须交叉验证先手算得到粗略结果再跑代码得到精确值两者对得上才敢往报告里写。这一步看起来多余实际上救过我很多次——有一次我手算的t值跟代码差了将近一倍回头查发现是除以n还是除以n-1搞错了这种错误不交叉验证根本发现不了。4.1 Python里手写公式与调库的双轨对照Python生态里做t检验主要靠scipy.stats但为了搞清每个数字怎么来的我建议先手写一遍。import numpy as np from scipy import stats # 单样本t检验手写版 x np.array([5.12, 4.89, 5.03, 4.95, 5.08, 4.91, 5.15, 4.87]) mu0 5.10 n len(x) xbar x.mean() s x.std(ddof1) # 关键ddof1 才是样本标准差 se s / np.sqrt(n) t_manual (xbar - mu0) / se df_manual n - 1 p_manual 2 * stats.t.sf(abs(t_manual), df_manual) # 双尾p值 # 调库版 t_lib, p_lib stats.ttest_1samp(x, popmeanmu0) print(f手写: t{t_manual:.4f}, df{df_manual}, p{p_manual:.4f}) print(f调库: t{t_lib:.4f}, p{p_lib:.4f})这段代码里最需要盯住的是ddof1。numpy的std()默认ddof0算的是总体标准差分母n而t检验要用样本标准差分母n−1。这个默认值坑过无数人尤其是从numpy转到手写t检验的人。我自己的习惯是永远显式写ddof1看到别人代码里没写就会警觉。双尾p值的算法也值得说明。stats.t.sf(t, df)返回的是右尾概率取绝对值之后算右尾再乘2就是双尾p值。这样写比2*(1-cdf(|t|))好在精度上——当t值很大时cdf接近11减去它会损失精度用sf生存函数直接算尾部更稳。独立双样本和配对样本同理a np.array([23.1, 22.4, 24.0, 23.7, 22.9, 23.5, 23.2]) b np.array([21.8, 22.5, 21.9, 22.3, 22.0, 21.6]) # 合并方差等方差 t1, p1 stats.ttest_ind(a, b, equal_varTrue) # Welch修正默认就是False建议显式写出 t2, p2 stats.ttest_ind(a, b, equal_varFalse) # 配对样本 pre np.array([20.1, 19.8, 21.3, 20.5, 19.9, 20.8, 21.0, 20.2]) post np.array([19.4, 19.1, 20.6, 19.8, 19.5, 20.1, 20.3, 19.7]) t3, p3 stats.ttest_rel(pre, post)注意ttest_ind的equal_var参数在新版本里如果不写会有警告我建议永远显式指定让阅读代码的人一眼看出你选的是哪条路径。另外ttest_rel要求两个数组等长并按配对顺序排列这个前提不满足会直接报错但数组等长不代表配对关系正确配对逻辑对不对只能靠人判断。4.2 R语言的等价实现与结果互验R在统计方面的输出更细t.test一个函数就覆盖三种场景# 单样本 x - c(5.12, 4.89, 5.03, 4.95, 5.08, 4.91, 5.15, 4.87) t.test(x, mu 5.10) # 独立双样本默认就是Welch a - c(23.1, 22.4, 24.0, 23.7, 22.9, 23.5, 23.2) b - c(21.8, 22.5, 21.9, 22.3, 22.0, 21.6) t.test(a, b, var.equal FALSE) # 配对 pre - c(20.1, 19.8, 21.3, 20.5, 19.9, 20.8, 21.0, 20.2) post - c(19.4, 19.1, 20.6, 19.8, 19.5, 20.1, 20.3, 19.7) t.test(pre, post, paired TRUE)R的t.test默认输出置信区间这个信息Python的ttest_1samp不直接给需要自己算或用stats.ttest_1samp配合confidence_interval方法。我比较推荐养成看置信区间的习惯p值只告诉你是否显著置信区间告诉你效应大概多大、方向如何信息量更足。比如均值差是0.695%置信区间是[0.42, 0.78]这个区间整体在正半轴、离0有距离比单纯一个p0.001更有说服力。Python和R两边跑一遍结果如果不一致基本就是自由度算错、单双尾搞反、或者ddof设置问题。我做过几次刻意制造错误的对照实验发现最常见的差异来源就是Welch自由度R的实现和scipy的实现都是Welch–Satterthwaite近似理论上应该一致但如果数据有缺失值处理差异df可能在小数点后不同。这种情况以置信区间和p值为准不必纠结df的细微差别。4.3 表格软件里没有现成函数时怎么算有些场景跑不了Python或R比如某些受控环境下的表格软件这时候手算加查表就是唯一路径。我整理了一套表格里的操作流程用内置函数就能拼出来步骤用途公式以某表格软件为例算均值样本均值AVERAGE(数据区域)算标准差样本标准差STDEV.S(数据区域)算样本量nCOUNT(数据区域)算t值单样本检验统计量(均值−假设值)/(标准差/SQRT(n))算p值双尾pT.DIST.2T(ABS(t值), df)算t临界值查表替代T.INV.2T(0.05, df)关键函数是T.DIST.2T和T.INV.2T注意这两个函数在旧版本里叫TDIST和TINV参数顺序和语义都不同旧版的TDIST要求t值为正、参数里要指定尾数混用会出错。我自己的经验是如果版本支持一律用带.2T后缀的新函数语义清晰不用记尾数参数。5. 实战里最容易翻车的几个细节t检验的公式就那么几个但真正让结果出错的往往不是公式本身而是公式之外的假设和判断。下面这几条都是我在实际项目中反复见到的翻车点每一条都有具体表现和应对方式。5.1 单双尾选错p值直接翻倍这是最高频的错误没有之一。双侧p值取单侧的两倍对称分布下意味着同样的数据按单侧算可能显著按双侧算就不显著。翻车的典型路径是先按双侧算出p0.07觉得可惜改成单侧得到p0.035然后写进报告。这种事后切换方向的操作在没有事前预设的情况下会人为抬高第一类错误率。正确做法是在看数据之前就把检验方向定下来写进分析计划。如果确实只关心一个方向比如新配方是否在保持其他指标的前提下提升某项性能那就理直气壮用单侧但要在报告里明确说明这是单侧检验、方向是什么、为什么只关心这个方向。透明度比结果好不好看重要得多。还有一个隐藏的单双侧陷阱置信区间。双侧95%置信区间对应双尾α0.05单侧95%置信区间对应单尾α0.05后者的区间更窄。有些人拿单侧的置信区间去配双侧的p值逻辑上不自洽。我的建议是统一p值和置信区间要么都双侧要么都单侧。5.2 方差齐性没检查就硬套合并方差合并方差t检验的前提是两组总体方差相等。这个假设如果不成立合并方差的估计会有偏导致t值失真第一类错误率可能明显高于名义的0.05。我见过的极端案例里实际第一类错误率到了0.12也就是说标称5%的显著性水平实际误判概率是它的两倍多。检查方法有两个。一个是Levene检验或Bartlett检验前者对方差不等更鲁棒后者对正态性要求高。另一个更实用的办法是直接看两组的标准差比值如果大的除以小的不超过2基本可以认为方差接近合并方差问题不大超过2就建议用Welch。我现在的流程是先看标准差比值超过2直接Welch不超过2再看样本量是否接近都接近就用合并方差否则还是Welch。这套流程简单但管用。需要提醒的是方差齐性检验本身也有局限。样本量小的时候它检验效能低方差其实不等也可能检查不出来样本量大的时候又过于敏感稍微有点差异就报显著不等。所以不要机械依赖检验结果结合标准差比值和业务判断更靠谱。5.3 多重比较下的p值膨胀这个坑隐蔽得多但后果严重。如果你对同一批数据做了多次t检验比如三组两两比较做了3次每次都用0.05的阈值那么至少犯一次第一类错误的概率不是0.05而是1−(1−0.05)³ ≈ 0.143。做的比较越多假阳性越多。我见过一个典型场景某次分析对比了5个处理组和1个对照组做了5次t检验其中2次显著。看起来有发现但按0.05×50.25的错误累积率来算这个2个显著很可能只是噪声。正确的做法是用多重比较校正常见的有Bonferroni阈值除以比较次数简单但保守、Holm逐步校正比Bonferroni稍微不那么保守、以及FDR控制方法。如果比较次数不多Bonferroni够用次数多且探索性强FDR更合适。顺带说一句如果实验设计本身就是多组比较从设计阶段就应该考虑用方差分析加事后检验而不是硬拆成一堆t检验。方差分析先看整体是否有差异再做事后两两比较并控制错误率这条路径在方法学上更规范。5.4 异常值和正态性t检验的两条隐形前提t检验对异常值相当敏感尤其是样本量小的时候。一个极端值能同时拉偏均值和标准差t值可能大幅变化。我的处理流程是先画个箱线图或者算一下四分位距找出明显偏离的点对找出的点不要直接删除而是核查来源——如果是录入错误就修正如果是真实极端值考虑用稳健方法或者同时报告含/不含该点的结果。正态性方面t检验在中大样本下对偏离正态有一定鲁棒性中心极限定理撑着但小样本加严重偏态就不行了。Shapiro-Wilk检验可以筛查但它同样有样本量敏感的问题。实操上我更倾向于看Q-Q图或者直接看偏度峰度结合样本量判断。样本量小于15且分布明显偏斜时我会考虑数据变换对数、平方根或者换用非参数方法。6. 样本量不够的时候还有哪些路可走做完一次t检验发现p0.08处在差一口气的位置这时候最不该做的就是加样本凑显著。样本量应该是设计阶段就定好的事后追加会破坏第一类错误控制。真正该做的是评估这个不显著意味着什么以及有没有更合适的分析路径。6.1 从p值转向效应量与置信区间p值只回答有没有证据,不回答效应有多大。同样p0.08一个均值差0.5、置信区间[−0.05, 1.05]的结果和一个均值差0.02、置信区间[−0.01, 0.05]的结果含义完全不同。前者的区间跨度大说明数据不足以排除一个实用上重要的效应值得扩大样本再验证后者的区间紧贴0说明效应很可能本来就微不足道。所以我现在的报告习惯是三件套效应量、置信区间、p值。效应量用Cohens d均值差除以合并标准差或者直接报原始单位的均值差置信区间给出区间估计。d的粗略解读0.2小、0.5中、0.8大但这个标准要看领域某些领域0.2就算重要了。6.2 非参数方法的替代与取舍当样本量小、分布偏斜、或者存在无法处理的异常值时非参数检验是备选方案。配对数据用Wilcoxon符号秩检验独立双样本用Mann-Whitney U检验单样本用Wilcoxon符号秩的单样本版本。非参数检验不依赖正态假设代价是检验效能通常低于t检验在数据确实正态的情况下而且它检验的是分布位置而非均值。也就是说如果两组分布形状不同Mann-Whitney检验显著的解读要小心它不一定是均值不同可能是分布形状的差异。我的判断原则是数据明显偏离正态且有实际意义时用非参数数据接近正态时优先t检验两者都跑一遍看结论是否一致不一致时在报告里说明并倾向于更保守的那个结论。6.3 功效分析下次该抽多少样本样本量不是拍脑袋定的。功效分析就是回答给定效应量、显著性水平需要多少样本才能有80%的把握检测出差异。工具上Python有statsmodels.stats.powerR有pwr包在线也有现成的计算器。做功效分析需要三个输入预期效应量可以从预实验或者文献里估、显著性水平通常0.05、目标功效通常0.80严格一点用0.90。输出是所需样本量。这个数应该在实验开始前就算好写进方案里。我见过不少项目做完才发现样本量根本不够检测不出预期的效应这时候剩下的只能是事后功效分析——它只能告诉你这次的不显著很可能是因为样本不足不能补救已经发生的事。有一点要特别提醒事后用观测到的效应量做功效分析然后声称样本量本来就不够这个逻辑是循环的因为观测效应量本身受样本波动影响。更稳妥的做法是用文献或预实验的效应量做先验功效分析或者干脆报置信区间让读者自己判断精度够不够。最后分享一个我自己的操作习惯每次做t检验都会在分析记录里留下五个数——n、自由度、t值、p值、效应量加置信区间。这五个数凑齐别人复核起来一目了然自己也方便事后翻查。查表这件事现在交给软件了但表背后的那套逻辑值不值得花时间搞明白我的答案是非常值得因为你在软件输出里看到的每一个数字追根溯源都落到那张表上。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑