FEATURED · 精选文章

MATLAB数理统计高级篇:参数估计、假设检验与重抽样实战

发布时间 / 2026/9/15 16:31:00
来源 / 创域科博编辑部
栏目 / 资讯中心
MATLAB数理统计高级篇:参数估计、假设检验与重抽样实战 简介这套《11 matlab数理统计高级篇》压缩包聚焦MATLAB高级数理统计应用面向需要处理复杂数据分析与统计建模的工程、科研人员及高年级学生。包内共两个文件分别是可运行的MATLAB示例脚本和一段配套讲解视频整体约15.23兆字节便于边看边练。视频与脚本系统覆盖多变量分析主成分分析、因子分析、假设检验与非参数检验t检验、方差分析、卡方检验、秩和检验、回归拟合多项式回归、逻辑回归、岭回归、Lasso回归、时间序列分析ARIMA模型、季节分解、随机过程与蒙特卡洛模拟、生存分析、统计图形以及聚类与判别分析等主题还涉及贝叶斯统计与马尔可夫链蒙特卡洛实现思路帮助使用者理解统计原理并快速掌握MATLAB实现方法。目前已有115人学习下载内容轻量但覆盖全面适合希望在较短时间内系统提升MATLAB数理统计实战能力的读者。1. 从 zip 到方法论MATLAB 数理统计高级篇解决什么问题带编号的“11”多半是某套课程或实训系列的第 11 讲zip 后缀说明它按压缩包分发里面通常放着 .m 脚本、示例数据和讲义。比解压更重要的是“数理统计高级篇”这六个字它默认你已经掌握描述统计和常见分布接下来要把参数估计、假设检验、回归诊断、重抽样这几块串成一套能落地的判断流程。这类压缩包最容易卡住人的地方不是函数不会写而是不知道同一份数据该套哪个模型、检验结果该信几分。比如同样是两组数据比均值为什么有人用 t 检验有人用秩和检验回归做完之后为什么还要再看残差图解析解给不出区间的时候靠什么凑出一个可靠的置信区间。这些正是“高级篇”相对入门的差别手段变多判断更重要。下面把理论和 MATLAB 命令按执行顺序铺开先立分布与估计的地基再走检验和回归两条主链路然后补上重抽样与蒙特卡洛两招最后一节讲交付前怎么验证和打包。这个路线对会 MATLAB 基础操作、被实验对比和数据分析困住的工程师、研究生都适用对想补概率论与数理统计功底的开发者同样有用。2. 参数估计与分布拟合MATLAB 数理统计的建模地基2.1 先建概率分布对象再谈统计量makedist 与 fitdist 的选型边界数理统计里的每一个方法背后都有一个总体假设t 检验要求正态指数分布假设无记忆性。高级篇的常见考法是给你一份未知来源的样本让你先判断“它像哪个分布”再决定后续的估计和检验。MATLAB 里这个过程分成两步先用makedist、normrnd这类函数从已知分布生成样本再用fitdist反推参数。这两步能闭环后面的验证才有参照物。% 用三种形状差异明显的分布各生成 500 个样本 rng(202311); n 500; x_norm normrnd(0, 1, n, 1); % 正态对称、轻尾 x_gam gamrnd(2, 1, n, 1); % 伽马右偏、非负 x_mix 0.7*randn(n,1) 0.3*3*randn(n,1); % 混合正态尾部更厚 % 用 Lilliefors 检验观察正态性结论的差异 [~, p_norm] lillietest(x_norm); [~, p_gam] lillietest(x_gam); fprintf(正态样本 p%.3f伽马样本 p%.3f\n, p_norm, p_gam);rng(202311)把随机数生成器固定到指定状态保证每次运行得到完全相同的样本这是任何可复现统计工作的第一步。normrnd(mu, sigma, n, 1)生成 n 行 1 列的正态样本gamrnd(a, b, n, 1)里 a 是形状参数、b 是尺度参数。第三行的x_mix是两个方差不同的正态叠加均值相同但尾部更重实践中这类数据比教科书里的干净样本更常见。lillietest跟kstest的区别值得单独记kstest要求你传入已知的分布参数而lillietest自动从样本估计均值和方差所以“这组数据是不是正态”这类开放问题应该优先用lillietest代价是它的检验功效比理论分布已知时略低样本量很小时容易放行非正态数据。用分布族做筛选时直接记住这张对应表分布族样本生成参数估计典型场景正态normrndnormfit / fitdist(…,Normal)测量误差、多数连续指标伽马gamrndgamfit工时、降雨、右偏正数威布尔wblrndwblfit寿命数据、可靠性分析二项binorndbinofit成功/失败计数泊松poissrndpoissfit单位时间到达数fitdist返回的是一个ProbabilityDistribution对象里面有mu、sigma等字段normfit这类老接口直接返回参数向量和置信区间。两者估计结果一致区别在后续接口对象可以继续喂给cdf、random、negloglik适合写流程化脚本向量形式适合快速看数。2.2 极大似然与删失数据mle 的两种口径和参数边界fitdist处理的是完整样本但工程数据经常有删失设备到观测结束还没坏人没到随访结束就已退出。这时候mle的Censoring参数是高级篇里绕不开的接口它把删失记录当作“生存时间大于观测值”处理而不是扔掉或当作精确值避免系统性低估。% 生成一批指数寿命数据并做右删失观测终点为 t_cut rng(8); t_true exprnd(10, 200, 1); % 真实均值为 10 的指数样本 t_cut 12; censor t_true t_cut; % 逻辑向量1 表示该记录删失 t_obs min(t_true, t_cut); % 实际能观测到的值 % 对删失数据做极大似然估计 [phat, pci] mle(t_obs, distribution, Exponential, ... Censoring, censor, Alpha, 0.05); fprintf(指数参数估计mean%.2f95%% CI [%.2f, %.2f]\n, ... phat(1), pci(1,1), pci(1,2));phat(1)是指数分布的均值参数pci是两列的置信区间矩阵。Alpha控制置信水平默认 0.05改成 0.1 就得到 90% 置信区间。对比一下直接对t_obs求平均的做法删失值全部被截断到 12均值一定偏小mle用生存概率补上了这块信息。mle真正“高级”的地方是它对多参数分布会自动做数值优化涉及迭代。遇到不收敛或者边界参数时用statset控制优化器% 调大迭代上限和精度避免参数估计中途退出 opts statset(MaxIter, 400, TolFun, 1e-8); phat_st mle(x_gam, distribution, Gamma, Options, opts);如果一个分布族拟合不出来另一个分布族却收敛得很快一个合理做法是用负对数似然比较它们% AIC 2*k 2*negloglikk 为参数个数值越小越优 pd_n fitdist(x_gam, Normal); pd_g fitdist(x_gam, Gamma); aic [2*numel(pd_n.ParameterNames) 2*negloglik(pd_n); ... 2*numel(pd_g.ParameterNames) 2*negloglik(pd_g)]; disp(aic);这里ParameterNames返回参数字段个数伽马分布对右偏数据的负对数似然通常明显更小AIC 也相应更优。需要注意 AIC 只能做相对比较不能证明某个分布是“对的”它回答的是“两者选谁更划算”。3. 假设检验与回归诊断MATLAB 数理统计的决策主链路3.1 一张选型表解决 80% 的检验纠结ttest 到 ranksum假设检验的“高级”不在会调用函数而在动手之前先回答三个问题数据是否正态、样本是否独立、方差是否齐。三个答案组合起来函数自然就定了。先看这张表要回答的问题MATLAB 函数关键前提返回要点单样本均值是否等于 mttest(x, m)正态或大样本h1 表示拒绝原假设两独立样本均值ttest2(x1, x2)正态默认方差不齐Vartype,equal 切回合并方差两样本方差是否相等vartest2(x1, x2)正态总体F 检验对非正态敏感配对样本均值ttest(x1 - x2, 0)差值的正态性等价于配对 t 检验非参数两独立样本ranksum(x1, x2)独立、连续Wilcoxon 秩和检验非参数配对样本signrank(x1, x2)差值对称符号秩检验正态性lillietest(x)样本量不宜太小自动估计均值和方差ranksum、signrank不假设正态只假设连续性和对称性稳健但功效低一些。真正容易忽略的是vartest2它是 F 检验对非正态非常敏感数据一偏就可能误报方差不齐所以流程上应该先做正态性检查再做方差齐性检查。% 完整决策流程两组工艺参数的对比 rng(99); g1 normrnd(10, 1.2, 40, 1); g2 normrnd(10.8, 1.2, 40, 1); h_norm lillietest(g1) || lillietest(g2); h_var vartest2(g1, g2); if ~h_norm ~h_var [h, p, ci, st] ttest2(g1, g2, Vartype, equal); fprintf(t 检验h%d, p%.4f\n, h, p); elseif ~h_norm [h, p] ttest2(g1, g2, Vartype, unequal); fprintf(Welch t 检验h%d, p%.4f\n, h, p); else [h, p] ranksum(g1, g2); fprintf(Wilcoxon 秩和检验h%d, p%.4f\n, h, p); end||是短路或任一组的正态性被拒绝就走非参数分支。ttest2默认就是 Welch 校正即方差不齐版本Vartype,equal才用合并方差。模拟数据里 g1 与 g2 的方差相同所以两个分支的 p 值应该接近。真正跑业务数据时这套分支脚本比“不管三七二十一直接 ttest2”靠谱得多。还有一个多组比较的坑一次实验测几十个指标每个都做一次检验假阳性会膨胀。常见做法是对 p 值做 Bonferroni 校正即比较p 0.05/N代价是功效下降。如果指标间有相关性更细的做法是控制错误发现率用mafdr一类的函数但那是生物统计工具箱的范畴普通分析用 Bonferroni 足够交代清楚。3.2 回归拟合之后看什么fitlm 输出、杠杆点与稳健回归线性回归是数理统计的高级篇里最容易做“浅”的部分。很多人把fitlm跑完看一眼 R² 就结束实际上回归诊断才是区分入门和高级的分水岭。先构造一份带离群点的数据% 模拟三变量线性模型人为注入一个离群点 rng(4); X randn(100, 3); y 1 0.8*X(:,1) - 0.5*X(:,2) 0.2*X(:,3) 0.3*randn(100,1); y(50) y(50) 6; % 注入离群点 tbl array2table([X y], VariableNames, {x1,x2,x3,y}); mdl fitlm(tbl, y ~ x1 x2 x3);fitlm接受 table 作为输入公式里的变量名必须和VariableNames一致。跑完之后按顺序看四样东西disp(mdl.Coefficients); % 系数、标准误、t 值、p 值 disp(mdl.Rsquared); % Ordinary 和 Adjusted R² anova(mdl, summary); % 方差分析摘要 plotDiagnostics(mdl, leverage); % 高杠杆点检测图mdl.Coefficients里的pValue只回答“该系数是否显著”回答不了“模型是否被个别点绑架”所以杠杆点图必须看。plotDiagnostics画的是杠杆值与残差的组合右上角的点同时具备高杠杆和高残差往往就是该删或者该用稳健方法的地方。离群点不多且不想手动删除时直接换稳健回归% 稳健回归用加权迭代降低离群点影响 mdl_rob fitlm(tbl, y ~ x1 x2 x3, RobustOpts, on); disp([mdl.Coefficients.Estimate, mdl_rob.Coefficients.Estimate]);左边是普通最小二乘右边是稳健估计。对比x1的系数就能看到离群点把普通回归拉偏了多少。RobustOpts默认用 bisquare 权重函数它对中等比例离群点有不错的抵抗能力但离群点超过三成时任何稳健方法都不可靠。如果变量很多想自动筛变量用逐步回归mdl_step stepwiselm(tbl, y ~ x1 x2 x3, Criterion, BIC);Criterion可以选BIC、AIC或pValue。BIC 惩罚更重选出的模型更精简适合预测pValue 标准更容易保留变量适合解释性分析。实践中我不建议把逐步回归当唯一依据它只是帮你把候选集缩小最终模型仍要回到残差诊断上。4. 重抽样与蒙特卡洛MATLAB 数理统计的进阶仿真手段4.1 bootstrp 与 bootci给相关系数补一个不对称置信区间教科书里的置信区间大多依赖正态近似样本一旦有离群点或者分布偏斜对称区间的近似就失真。Bootstrap 的思路是把观测样本当成一个小总体反复有放回抽取同样大小的样本每次重新计算统计量用这些重抽样值的分位数直接给出区间完全绕开分布假设。% 两变量含约 5% 离群点计算相关系数的 bootstrap 置信区间 rng(11); x randn(80, 1); y x 0.5*randn(80, 1); idx_out rand(80,1) 0.95; y(idx_out) y(idx_out) 4; % 人为制造离群点 rho (u) corr(u(:,1), u(:,2)); % 统计量函数 boot_b bootstrp(2000, rho, [x y]); % 2000 次重抽样 ci_boot quantile(boot_b, [0.025 0.975]); % 对照corrcoef 给出的 Fisher z 近似区间 [R, ~, RL, RU] corrcoef(x, y, Alpha, 0.05); fprintf(Bootstrap CI: [%.3f, %.3f]近似 CI: [%.3f, %.3f]\n, ... ci_boot(1), ci_boot(2), RL(1,2), RU(1,2));bootstrp的第一个参数是重抽样次数第二个是被重复执行的函数句柄第三个是原始数据。它每次从[x y]的行里有放回抽 80 行把抽到的行交给rho计算相关系数2000 次后得到一个经验分布。quantile取 2.5% 和 97.5% 分位数就是 95% 置信区间。离群点会把相关系数分布拉偏此时 bootstrap 区间两端不对称比corrcoef的正态近似更可信。如果不想自己写quantile直接用bootcici_bca bootci(2000, {rho, [x y]}, Type, bca);Type,bca是偏差校正加速区间精度高于百分位法但重抽样次数建议提高到 5000 以上。任何统计量都能塞进bootstrp中位数、分位数、回归系数都行只要函数句柄输入的是数据矩阵、输出的是标量。重抽样和蒙特卡洛容易混淆它们的分工不同目的方法MATLAB 入口输出给已有统计量算区间Bootstrapbootstrp / bootci分位数或 BCa 区间观察统计量的经验分布Bootstrapbootstrp重抽样值数组检验功效、第一类错误率蒙特卡洛手写循环 检验函数拒绝率置信区间覆盖率验证蒙特卡洛手写循环 ttest 等覆盖率4.2 用蒙特卡洛算功效和覆盖率先仿真后下结论实验设计阶段最常被问“样本量要多少”解析公式能算但换成非参数检验或者复杂设计时公式就不够用了。蒙特卡洛的做法是固定一个备择假设反复生成数据、跑检验、记录是否拒绝拒绝比例就是功效。% 检验功效正样本量下均值差 0.8 的检出率 rng(2024); nsim 500; ns [20 30 50 80]; pwr zeros(size(ns)); for k 1:numel(ns) n ns(k); pv zeros(nsim, 1); for s 1:nsim a normrnd(0, 1, n, 1); b normrnd(0.8, 1, n, 1); [~, pv(s)] ttest2(a, b); end pwr(k) mean(pv 0.05); end T table(ns, pwr, VariableNames, {样本量n, 检验功效}); disp(T);nsim是仿真轮数500 轮出来的功效曲线已经比较平滑追求精度可以加到 2000。内层循环每次生成两组正态样本ttest2返回 p 值mean(pv 0.05)就是拒绝比例。注意这里所有数据都在备择假设为真均值差 0.8的条件下生成所以拒绝比例就是功效如果改成两组均值相同同一段代码算出来的就是第一类错误率理论上应该在 0.05 附近这本身就是一个自检办法。样本量 n 增大功效上升这条曲线可以直接拿去做实验方案说明。仿真程序还有个实际约束nsim*n的规模大了之后内层循环会慢。有 Parallel Computing Toolbox 时把内层for改成parfor即可不想开并行池就预先一次生成所有样本用reshape分块处理能省掉循环调度的开销。用同样的套路验证置信区间覆盖率% 95% 置信区间的实际覆盖率验证 mu 2; sigma 1.5; n 25; nsim 1000; cover false(nsim, 1); for s 1:nsim x normrnd(mu, sigma, n, 1); [~, ~, ci] ttest(x, mu); cover(s) ci(1) mu mu ci(2); end fprintf(95%% CI 实际覆盖率%.3f\n, mean(cover));ttest的第三个输出是区间逻辑判断ci(1) mu mu ci(2)记录真值是否落进区间。覆盖率理论上是 0.95如果仿真出来只有 0.88说明某种假设被违反比如样本不独立或者分布被污染。这个自检思路值得用在任何你打算写进报告里的统计量上。5. 交付与验证把 MATLAB 数理统计结果打包成可复现 zip5.1 seed 与 save让两次运行结果完全一致统计脚本最怕随机性别人跑出来和你不一样结论都变得可疑。规矩很简单每个脚本第一行固定rng最后把关键结果落盘rng(202611); % 固定种子保证结果可复现 % 中间是估计、检验、仿真流程 save(results/sim_power.mat, T, pwr, boot_b, -v7.3);-v7.3把变量存成 HDF5 格式适合超过 2 GB 的大数组小数据不加这个选项存成旧格式能让更多 MATLAB 版本打开。保存时只写关键变量别把整个工作区存进去后续load的时候不容易污染现场。5.2 解压、挂路径、记录版本拿到类似“11 matlab数理统计高级篇.zip”这种压缩包先解压再递归加路径outdir fullfile(tempdir, stat_advanced); unzip(11 matlab数理统计高级篇.zip, outdir); addpath(genpath(outdir)); % 递归添加所有子目录genpath会把outdir下所有子目录都加进搜索路径脚本间互相myfun调用才找得到。如果unzip报error read zip archive多半是文件传输出错或者解压工具截断了文件重新下载比对文件大小即可不用怀疑 MATLAB 本身。收尾时用ver(stats)把 Statistics and Machine Learning Toolbox 的版本号记进 README避免对方环境里函数行为不一致。5.3 打包前用 md5 做一次全链路回归准备分发 zip 之前先跑一遍全流程并记录结果文件的哈希值md5sum results/sim_power.mat% 清空环境后重跑主脚本 clear; clc; run(main_analysis.m);Windows 下用certutil -hashfile results\sim_power.mat MD5替代md5sum。两次运行得到的哈希必须一致不一致就说明脚本里有未受控的随机源比如某个地方漏写了rng或者并行池用了不同调度。比对通过之后再打包zip -r 11_matlab_stat_advanced_resubmit.zip code/ data/ results/ README.md打包只收四个目录code放脚本、data放原始数据、results放输出、README.md写清运行顺序和 MATLAB 版本。README 里至少要有三行从哪个脚本开始跑、每个脚本的输入输出文件、依赖哪些工具箱。这套结构看起来简单却是复现实验最省心的一版约定比把几十个 .m 文件平铺在根目录里好维护得多。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻