
1. 先搞清楚多元回归在解决什么问题做实证的人多半有过这种经历手里攥着一份几十列的数据表导师或者业务方问一句到底哪个因素影响最大你在表格软件里画了一上午散点图也说不清楚。我最早碰到这个问题时是把因变量跟每一个自变量分别做一次简单回归然后对着十几张输出表来回比对系数大小结果被一句话打回来——你没有控制其他变量。那次之后我才老老实实回到 Stata把regress这条命令从头到尾啃了一遍。**多元回归分析Stata**这件事说到底就是用一条命令把多个解释变量同时塞进模型让每个系数的含义变成在其他条件不变的前提下而这也正是它唯一真正不可替代的价值。这篇文章不打算写成教科书我想按实际干活的顺序讲从环境准备、数据导入、模型设定到假定检验、结果输出、报错排查把我这些年踩过的坑和觉得顺手的小技巧一次性摊开。适合谁看如果你正在写毕业论文、做问卷分析、跑一份业务数据的归因报告或者刚把 Stata 装上不知道下一步点哪里那这篇东西应该能让你少走至少一星期的弯路。有基础的朋友可以直接跳到第四章假定检验那部分是我个人认为最容易被忽略、又最容易让审稿人挑刺的地方。1.1 一元回归撑不住的三种典型场景简单回归就是y对一个x做回归斜率就是两个变量的相关性除以自变量的方差读起来很直观。但它有三个明显的软肋。第一是遗漏变量偏误比如你想看教育年限对收入的影响如果没有把工作年限、行业、地区放进模型那么教育年限前面那个系数其实混进了大量其他因素的贡献它既不是教育单独的效应也不是任何有明确含义的量。第二是混淆变量无法剥离当两个自变量本身高度相关时简单回归给出的系数会互相污染你甚至会发现同样的变量在不同模型里符号都能反过来。第三是解释力评估失败一元回归的 R² 通常很低你无法判断到底是变量选错了还是模型形式错了。多元回归针对的就是这三件事。它把若干个x同时纳入用最小二乘法求解一组系数使得残差平方和最小。数学上没什么神秘的本质就是在高维空间里找一个超平面去逼近数据点。真正需要动脑子的是放哪些 x 进去而不是怎么算——Stata 一毫秒就帮你算完了可模型设定错了你跑一百遍也是错的。我见过太多人把所有能拿到的变量一股脑扔进去跑出来 R² 很高就开心实际上系数根本没法解释因为里面塞了一堆互为因果的变量。还有一种情况是变量之间明明不平级。比如你有是否吸烟每天吸几支吸烟年限三个变量它们显然不是并列关系硬塞进同一个模型必然共线。规范做法是先跑一个只含是否吸烟的基础模型再逐步加入强度变量看系数怎么变化。这种逐步加入看系数漂移的操作在 Stata 里配合eststo存模型、esttab并排输出效率极高。1.2 控制变量到底在控制什么很多人对控制变量的理解停留在多放几个变量让模型显得饱满这就把它的作用完全搞反了。控制变量的意义在于把那些会影响因变量、同时又跟核心自变量相关的因素钉住让核心系数的解释接近因果含义。判断一个变量该不该作为控制变量我一般问自己三个问题它是否影响y它是否与核心x相关它是否在时间上或逻辑上排在x之后如果第三个问题的答案是是那它很可能是中介变量不能当控制变量放进去否则会把真实效应给吸走。举个具体例子。研究培训是否提升员工绩效核心变量是是否参加培训因变量是绩效评分。直觉上会想控制培训时长但培训时长显然是参与培训之后才有的东西它是中介放进去会让核心系数变小甚至不显著。真正该控制的是年龄、工龄、岗级、部门、上年绩效这些前定变量。这类判断没有任何软件能替你完成它来自你对业务逻辑的理解。Stata 只能保证计算正确不能保证模型正确。另外提一句控制变量不是越多越好。样本量固定时每多放一个自变量就多消耗一个自由度标准误会变大本来显著的核心变量可能被稀释成不显著。经验法则是每个自变量至少要有 10 到 15 个观测Green 早年给过一个参考公式样本量不低于 50 8kk 为自变量个数但那个公式偏保守现在做问卷数据的人更常用的是 EPV 原则。我自己的习惯是如果一个模型的自变量超过样本量的十分之一就先停下来想想是不是该做降维或者合并类别。1.3 三个容易被搞混的概念第一个是多元回归和多元方差分析。前者指多个自变量对一个连续因变量后者指多个因变量完全不是一回事。第二个是多元回归和多因变量回归MANOVA / mvreg中文里多元两个字经常被混用看英文原文最保险一个是 multiple regression一个是 multivariate regression。第三个是多元回归和面板回归如果你的数据是同一批个体连续多年那应该用xtreg而不是regress因为残差里面有明显的个体效应直接跑普通回归标准误会严重低估。这里顺带回应一个高频问题经常有人问 Stata 适不适合做网络 meta 分析答案是适合network、mvmeta这类命令已经很成熟。而做 meta 分析的人其实也绕不开回归思路比如用metareg做元回归本质上就是加权多元回归解释系数的方式跟本文讲的路子完全一致。所以你把这一套吃透后面扩展到其他命令时会有明显的一通百通感。2. Stata 环境准备从装好到把数据读进来环境这一步看起来没技术含量实际上出问题最多的就是这里。我见过有人因为工作路径里有中文和空格use命令一直报错也见过从 Excel 直接复制粘贴进数据编辑器结果数字全变成字符串回归时报 no observations。这一章把顺序理清楚先装、再配、后导、最后检查。2.1 版本选择与安装的几个实际考量Stata 目前主流的是 17、18 两个大版本再往前 15、16 也还有不少人在用。选版本的核心不是新不新而是看你要用的命令依赖哪个版本。比如python集成、frames框架、etable自动出表这些比较新的特性需要 17 以上如果你只做基础回归14 甚至 12 都够用。另一个决定性因素是版本规模Stata 分 BEBasic、SEStandard、MPMulti-Processor三档BE 对变量数有硬上限99 个变量后来放宽到 2048SE 和 MP 支持几万个变量MP 还能多核并行。如果你的数据宽表动辄几百列BE 会直接拒绝加载。安装途径只有一个原则走官方渠道拿正版授权机构用户走学校或单位的批量授权个人用户直接买订阅。我不建议在来路不明的渠道拿安装包一是版本被改过之后update会出问题二是这类包里偶尔夹带东西后续所有分析结果的可复现性都没法保证。安装完成后第一件事是联网执行update all这条命令会把 ado 文件更新到最新很多报错都是因为旧版 ado 和新版主程序不匹配。装完顺手确认一下工作目录Stata 默认的启动目录往往在 C 盘某个临时位置建议在 profile.do 里写死* 放在 Stata 安装目录或 ado\personal 目录下名为 profile.do cd D:/work/project set more off set linesize 120set more off关掉分页停顿set linesize 120让输出表格不换行这两条能显著提升使用体验。profile.do 会在每次启动时自动执行属于一次性投入长期受益的配置。2.2 数据导入的四种入口与编码陷阱Stata 导入数据大致有四个入口usedta 文件、import excel、import delimitedcsv / txt、odbc数据库。日常用得最多的是前三个。* 读入本机 dta use D:/work/reg_data.dta, clear * 读入 csv显式指定编码 import delimited D:/work/reg_data.csv, clear encoding(UTF-8) * 读入 Excel 指定 sheet 与首行范围 import excel D:/work/survey.xlsx, sheet(Sheet2) cellrange(A3:Z500) firstrow clear这里有两个坑必须说清楚。第一个是中文变量名。Stata 从 14 版开始支持 Unicode中文变量名技术上能用但强烈不建议因为很多外部命令对中文变量名的处理不稳定esttab输出时会乱码写循环时也容易出问题。正确的做法是导入后立刻改名rename 年龄 age rename 年收入 income第二个坑是数字以字符串形式存在。csv 里如果某列混进了 缺失无— 这类文字Stata 会把整列当成字符串destring时会失败。正确姿势是用destring的force选项把非数字强制转成缺失destring income, replace force但对金额类字段要小心如果原数据里带千分位逗号需要先去掉再转否则 1,234 会被整条变成缺失你就丢数据了还没察觉。可以在转换前后各跑一次count if missing(income)对比一下确认没丢东西。2.3 上手第一步三条诊断命令数据进来别急着跑回归先做三件事。describe // 看变量名、类型、标签、存储格式 codebook y x1 x2 // 看取值范围、缺失数、唯一值、分布概览 misstable summarize misstable patternsdescribe让你确认变量类型对不对尤其是str和float混用的字段。codebook是单变量体检报告它会告诉你比如年龄最大值是 999 这种明显异常的编码也会告诉你某个分类变量有几个水平。misstable则是缺失值地图它能直接告诉你缺失是否成片出现——如果某个变量缺失比例超过 30%你就要认真考虑是删、是插补、还是干脆换变量。这里插一个经常被问到的小问题Stata 里求最大值最小值怎么弄三套方法各有用途。看整体分布用summarize x, detail输出里有 min、max 和四个百分位想生成一个新变量存整体极值用egenegen max_income max(income) egen min_income min(income)如果是要按行同一观测的多个变量取极值用行函数egen rowmax rowmax(x1 x2 x3) egen rowmin rowmin(x1 x2 x3)第三种在构建合成指标时特别好用比如构造三项测试中的最高分或者把异常值截尾* 1% 和 99% 缩尾 winsor2 income, cuts(1 99) replacewinsor2需要先安装写成ssc install winsor2, replace即可。缩尾这一步在金融、会计类数据里几乎是标配因为极端值对最小二乘的影响是压倒性的——一个超大的观测点能把整条回归线拽偏。3. 模型设定regress每一个细节都值得推敲数据检查干净之后就可以正式进模型环节了。这一章我会把regress的输出表逐行拆开讲然后讲虚拟变量、交互项、稳健标准误这三个最容易出错的地方。3.1 基本语法与输出表逐行解读最基础的写法regress y x1 x2 x3Stata 的输出分上下两块。上面一块是方差分析表行含义需要关注什么Source / SS平方和分解模型平方和 残差平方和 总平方和df自由度模型 df 自变量个数 k残差 df n - k - 1MS均方SS 除以 df残差的 MS 开方就是 Root MSENumber of obs有效样本量一定要确认它等于你预期的数量少了说明有缺失被自动剔除F(k, n-k-1)整体显著性检验检验的是所有系数是否同时为零Prob FF 检验 p 值小于 0.05 只能说明模型整体有解释力不代表每个变量都显著R-squared决定系数解释的变异比例同领域内横向比较才有意义Adj R-squared调整 R²加了变量惩罚项变量越多样本越少惩罚越重Root MSE残差标准误单位与 y 相同可以理解为平均预测误差下面一块是系数表每一行是一个自变量列依次是Coef.系数、Std. Err.标准误、tt 值 系数/标准误、P|t|p 值、[95% Conf. Interval]置信区间。读系数永远要带单位x1每增加 1 个单位y平均变化b个单位其他变量保持不变。如果你用的是对数变换后的变量解释就变成百分比变化这个转换必须在论文里说清楚否则读者没法判断效应大小。_cons是截距项它表示所有自变量取 0 时y的期望值。这个值在很多模型里没有实际意义比如年龄为 0 的收入但它必须留在模型里除非你有非常强的理论理由去掉。去掉截距的写法是regress y x1 x2, noconstant我基本不用因为一旦去掉R² 的定义就变了和其他模型没法比。3.2 虚拟变量、交互项与因子变量语法分类变量不能直接扔进回归必须转成虚拟变量。Stata 有自动机制——i.前缀* 教育水平自动生成虚拟变量以第一个水平为参照组 regress income i.edu age tenure * 手动指定参照组 regress income ib3.edu age tenure * 连续变量用 c. 前缀显式声明 regress income c.age##c.age这里有几个关键细节。i.edu会自动生成 k-1 个虚拟变量把参照组排除在外避免完全共线这叫虚拟变量陷阱。默认参照组是取值最小的那一类或字母顺序第一个如果按业务逻辑应该以最高学历为参照就必须用ib#.显式指定ib3.edu表示以第 3 个水平为基准。选错参照组不会改变模型拟合优度但会彻底改变每个虚拟变量系数的解释——所有系数都是相对参照组的差异。交互项用#表示只生成交互项##表示主效应加交互项。比如检验教育回报是否因性别而异regress income c.edu##i.female age tenure##会同时给出教育的主效应、性别的主效应、以及两者的交互项。交互项系数显著说明教育对收入的边际效应在男女之间有差异。要想看具体的边际效应margins female, dydx(edu) marginsplotmargins会分别给出男性和女性样本中教育每增加一年带来的收入变化配合marginsplot直接出图放进论文里很直观。有一个坑要提前说连续变量交互前是否要中心化。当交互项里包含连续变量时主效应的系数含义会变成另一个变量取 0 时的效应如果年龄是自变量那年龄为 0根本没有意义系数就没法解释。解决办法是把连续变量做均值中心化summarize age generate age_c age - r(mean) regress y c.age_c##i.female这样主效应就变成了在平均年龄水平上的效应可解释性大大提升。这个技巧在做经济学实证时几乎是默认操作。3.3 标准误怎么选robust、cluster 与 bootstrap这一步是新手和老手的分水岭。默认的regress假设残差同方差且相互独立一旦这个假设不成立系数估计仍然无偏但标准误是错的进而所有 p 值和置信区间都是错的。最常用的补救是稳健标准误regress y x1 x2 x3, robustrobust用的是 White 异方差一致估计量不改变系数只修正标准误。它的代价是样本量较小时比如小于 50会偏保守甚至不稳这时可以改用hc1、hc2、hc3等有限样本修正形式hc3在小样本下表现最好。如果你的数据有分组结构比如学生嵌套在班级里、员工嵌套在公司里那么组内的观测很可能不独立这时候要用聚类稳健标准误regress y x1 x2 x3, cluster(classid)聚类标准误允许组内任意形式的相关是处理这类数据的标准做法。但要注意聚类数太少时经验上少于 30 到 40 个簇标准误会严重低估论文里通常需要做 wild cluster bootstrap 或者用boottest命令做修正。我在审稿时见过不少论文只写了 clustered at firm level但样本里只有 15 家公司这种情况结论基本不可信。到底该用哪种我自己的判断顺序是先看数据结构有没有嵌套有就用cluster没有嵌套但残差图看出发散趋势就用robust两者都拿不准就把三种结果都跑出来做敏感性分析如果结论一致就在正文里报cluster或robust脚注说明另外两种的结果。这个做法成本很低但能显著提高结论的可信度。4. 回归假定检验不成立的时候怎么办模型跑出来好看不代表能用。最小二乘有五个核心假定线性、误差零均值、同方差、误差不相关、自变量与误差不相关外生性。前两个靠理论判断后三个可以在 Stata 里检验。4.1 多重共线性识别、判断与处理共线性不会让系数有偏但会让标准误膨胀导致本来显著的变量变得不显著系数在加入新变量后剧烈跳变。检验方法是用方差膨胀因子regress y x1 x2 x3 estat vif输出里VIF是方差膨胀因子1/VIF是容忍度。经验阈值VIF 大于 10对应容忍度小于 0.1算严重共线大于 5 就要警惕。但这个阈值不能机械套用如果模型里只有两个变量VIF 天然就低变量多的时候某些虚拟变量之间 VIF 高是正常的。发现共线之后有三条路。第一是删变量最直接但要牺牲控制力度得在论文里说明理由。第二是合并变量比如把月收入和年收入合并或者把多个高度相关的量表题项做因子分析提取一个公因子。第三是用主成分回归或岭回归Stata 里pca加predict就能实现前者后者可以用ridgereg需安装。但这两种方法的系数解释会变得抽象主成分回归的系数不再对应原始变量写论文时要额外解释不是万不得已我不用。还有一个小技巧中心化能降低交互项与主效应的共线。前面提到的c.age_c##i.female就是典型例子不做中心化时交互项和主效应的相关系数可能高达 0.98做完了立刻降下来。4.2 异方差检验与补救异方差意味着残差的方差不恒定。最直观的检查是画残差对拟合值的散点图regress y x1 x2 x3 rvfplot, yline(0)如果点云呈现喇叭形或明显的弧形基本可以确认存在异方差。正式检验用estat hettest // Breusch-Pagan / Cook-Weisberg 检验 estat imtest, white // White 检验两个检验的原假设都是同方差p 值小于 0.05 就拒绝同方差。这里有个现实问题大样本下几乎必然拒绝。样本量上万时一点点异方差都会被检测出来p 值接近 0。所以我不太看 p 值更多看残差图的形状和效应量大小。实用做法是只要残差图显示出明显的模式就直接上robust不纠结检验结果。补救方案按稳健性排序直接使用robust标准误是最省事的如果想让模型本身也变稳可以对因变量做对数变换gen ln_y ln(y)对数变换会压缩右尾对右偏的收入、销售额数据效果很好再进一步是加权最小二乘regress y x1 x2 [aww]权重的选择需要你确信残差方差与某个变量成比例这个前提不太好验证用得相对少。4.3 正态性、异常值与影响点严格来说最小二乘估计不需要残差正态但只要你要做 t 检验和 F 检验就需要正态性近似成立小样本下尤其重要。检验方式regress y x1 x2 x3 predict resid, residuals swilk resid qnorm residswilk是 Shapiro-Wilk 检验样本量小于 2000 时用qnorm画正态分位图点大致落在一条直线上就说明接近正态。大样本下中心极限定理会帮你兜底不必强求。真正需要重点关注的是异常值和影响点它们对系数的破坏力远超非正态。三个诊断指标值得记住predict lev, hat // 杠杆值 predict cooksd, cooksd // Cooks D predict stdres, rstandard // 标准化残差判断标准标准化残差绝对值大于 3 的点要逐个看Cooks D 大于 4/n 的点是潜在影响点杠杆值大于 2k/nk 为自变量数的观测在自变量空间里比较极端。查出这些点之后不要直接删先回去核对原始数据很多时候是录入错误——年龄写成 199 而不是 19这种错误改掉就行。如果是真实存在的极端值规范做法是在正文里做敏感性分析报告删除这些观测后结论是否变化而不是悄悄删掉。4.4 内生性初探与工具变量思路这一节稍微进阶但值得放进来因为它决定了你的结果能不能往因果方向说。内生性的典型来源有三种遗漏变量、双向因果、测量误差。检验内生性本身不容易但可以先看核心变量对模型的敏感性把可能的遗漏变量一个个加进去看核心系数是否稳定如果从 0.5 掉到 0.1那基本说明原来的估计是虚高的。工具变量法是常见路径两阶段最小二乘在 Stata 里ivregress 2sls y x2 x3 (x1 z1 z2) estat firststage estat overidestat firststage给出第一阶段 F 值经验上要求大于 10否则是弱工具变量。estat overid是过度识别检验只有在工具变量个数多于内生变量个数时才有结果原假设是工具变量外生p 值大于 0.1 才好。工具变量的选择是最难的部分需要理论支撑不能靠数据试出来的相关性硬凑。这块内容展开可以写一整篇文章这里只做个引子知道有这条路就够了。5. 结果整理与进阶玩法模型跑通之后怎么把结果组织成能看的表格是另一个消耗大量时间的环节。手工复制粘贴系数和星号出错率高且没法复现。5.1 用esttab一次性输出规范表格推荐流程是先装两个包再用eststo把模型逐个存下来ssc install estout, replace ssc install outreg2, replace eststo clear eststo m1: regress y x1 eststo m2: regress y x1 x2 age eststo m3: regress y x1 x2 age i.edu, robust esttab m1 m2 m3 using table1.rtf, replace /// b(%9.3f) se(%9.3f) star(* 0.10 ** 0.05 *** 0.01) /// r2 ar2 nogap compress /// mtitles(基础模型 加控制 加固定效应) /// title(表1 多元回归结果)这套语法有几个好处。star()可以自定义显著性星号不同期刊要求不一样改起来很快r2 ar2一次输出两个拟合指标nogap去掉多余空行让表格更紧凑。输出格式支持.rtfWord 直接打开、.csv、.texLaTeX 用写论文的时候直接把 rtf 拖进 Word 微调格式就行。如果习惯用outreg2写法是outreg2 using result.doc, replace ctitle(Model 1) /// bdec(3) tdec(2) addstat(Adj R2, e(r2_a), N, e(N)) /// keep(x1 x2) norow noobs它的特点是默认输出 t 值而不是标准误addstat可以往表底加自定义统计量。两个工具挑一个用熟就行我个人偏esttab因为多模型并排输出更整洁。顺带说一句这套存模型—并排输出—导出表格的流程在别的场景里也一样能用。比如做网状 meta 分析的时候network系列命令的估计结果同样可以配合esttab整理成规范表格省去大量手工核对的时间。5.2 亚组分析与交互项检验亚组分析是很多人关心的问题它的核心逻辑是按某个变量把样本拆开分别建模看系数是否一致。最简单的做法bysort sex: regress y x1 x2 x3这会分别输出男性和女性的回归结果。但直接做亚组分析有个隐患你只能看系数大小的差异没法判断这个差异是不是统计上显著。正确做法是跑全样本加交互项然后用testparm做系数相等的检验regress y c.x1##i.sex x2 x3 testparm i.sex#c.x1如果testparm的 p 值小于 0.05说明亚组间差异显著如果 p 值很大那你报告的男女差异很可能只是抽样波动这种情况下写亚组分析发现女性效应更强就属于过度解读。审稿人对这种只报亚组结果不做交互检验的做法非常敏感我建议直接把两步都做出来正文里以交互检验为准亚组结果放附录。如果亚组多、样本分散可以用statsby批量收集系数statsby _b _se, by(region) clear: regress y x1 x2它会生成一个新数据集每个地区一行系数作为变量保存方便后续用twoway画森林图。这套做法在做多中心研究时特别顺手。5.3 从回归到预测与边际效应模型最终是要用的predict是连接估计和应用的桥梁predict yhat, xb // 线性预测值 predict yhat2, yhat // 因变量尺度的预测值 predict resid, residuals做预测时有个重要提醒不要外推到自变量的取值范围之外。如果建模时学历范围是 9 到 22 年那么预测一个 30 年的学历就是无意义的数学外推。另外如果有对数变换predict出来的xb在对数尺度上要还原成原尺度不能简单取指数因为E[exp(ln y)] ≠ exp(E[ln y])中间需要一个修正项具体数值等于残差方差的一半。这个坑我在早期报告里踩过一次预测值系统性偏低后来才发现是漏了这一步。如果想看某个变量取不同值时的预测结果margins比手工计算方便得多margins, at(x1(1 2 3 4 5)) marginsplot输出的是每个取值水平下的预测均值及其置信区间画出来的图比一堆数字更直观汇报时也非常好用。6. 报错与踩坑速查实际跑数据的时候报错信息往往一句话但原因可能很隐蔽。下面这张表是我这些年攒下来的高频问题。报错 / 现象常见原因处理方式no observations变量全是缺失或筛选条件写错用count if !missing(x1)逐变量确认factor variables not allowed用了i.但当前命令不支持因子变量语法改用旧命令或先手动生成虚拟变量x1 omitted because of collinearity变量间完全共线或虚拟变量陷阱检查是否漏了参照组或变量是否重复variable x1 not found变量名拼错或大小写不一致describe里核对Stata 区分大小写too many variables specified用的是 BE 版本变量数超上限换 SE 或 MP 版本或先精简变量r(198) invalid syntax括号、逗号、斜杠位置错误拆成多行逐步测试用///续行输出中文乱码导入时编码未指定import delimited ..., encoding(UTF-8)结果数字与预期差很多变量单位不一致或许多观测被自动剔除核对N检查是否有缺失被 listwise 删除除了报错还有几个不会报错但会误导你的坑我单独拎出来说。第一个是样本量悄悄变化。同一个回归里加了新变量之后如果那个变量有缺失Stata 会自动把整行删掉listwise deletion于是 N 变小了。这时候你比较两个模型的系数其实没有可比性因为样本都不一样。规范做法是先确定一个分析样本用keep if !missing(y, x1, x2, x3)固定下来之后所有模型都在同一批观测上跑。第二个是**if条件写在命令末尾还是中间**。regress y x1 if age 30和regress y if age 30 x1后一种语法是错的条件必须跟在变量列表之后。这个语法细节看起来小但写复杂模型时很容易搞混。第三个是**ftool的用法**。经常在多个数据文件之间切换的人可以试试这个命令ssc install ftool, replace ftool它会弹出一个文件浏览器窗口双击 dta 文件就能直接载入比每次敲use路径快很多。同类工具还有fileopen、confirm等属于提升日常效率的小配件。另外如果你的工作流里经常要列出文件夹里所有文件fs、filelist这两个命令比自带的方式好用fs *.dta就能把当前目录下所有 dta 文件列出来配合循环可以做批量处理。第四个是结果不可复现。如果你用了随机过程比如多重插补mi impute、bootstrap 或者交叉验证一定要在开头设种子set seed 20240101不设种子的话别人跑你的代码结果会跟你不一样这在投稿时是硬伤现在很多期刊要求提交可复现代码种子是必查项。第五个是变量标签和值标签的区分。label variable给变量加说明label define/label values给取值加说明两者作用对象不同。表格输出里显示的是标签而不是原始值如果标签没设好审稿人会看不懂 edu 3 是什么。花十分钟把标签补齐后续所有输出表格都会自动带上说明收益很高。最后再补一句关于工作流的建议把整个分析过程写成一个 do 文件从导入数据到输出表格一条龙不要用交互式一行一行敲。原因很简单——当审稿人让你换一种标准误重跑时do 文件里改一行、按一次CtrlD就全部更新了如果靠手工操作改八个模型能改一下午还容易漏。do 文件里按数据准备—描述统计—主回归—稳健性检验—输出表格分节每节用*分隔几个月后自己回看也一目了然。我在实际项目里的体会是多元回归真正花时间的从来不是那条regress命令而是它前面和后面的部分数据清理占了六成精力模型诊断和稳健性检验占三成剩下那一成才是跑模型本身。刚上手的人往往反过来恨不得立刻看到系数表结果后面被各种问题反复打回。慢一点把变量类型、缺失模式、参照组设置、标准误选择这几件事在跑模型之前就想清楚后面会省下成倍的时间。另外分享一个我自己的小习惯每跑完一个模型先把eststo存下来并写一行注释说明这个模型在检验什么等到输出表格时你会感谢当时那个多写一行注释的自己。