尧图精选

Stata多元回归分析全流程:数据整理、诊断、解释与导出

🕒 发布时间:2026/10/1 6:17:23 📁 来源:尧图网络
1. 把多元两个字先想透Stata 的 reg 到底在解一个什么问题很多人第一次在 Stata 里敲下reg y x看到 P|t| 小于 0.05 就松了一口气截图留档收工。等到加上第二个控制变量斜率一下子少了一半甚至符号翻过来人就开始慌了——到底哪个结果能用这种慌张的根源不在 Stata而在于没有想明白多元回归分析这件事本身在干什么。它不是多塞几个变量这么简单它要回答的是一个更苛刻的问题在把其他已知因素按住不动的前提下某个变量和因变量之间还剩下多少关系。Stata 在这件事上给的是最朴素也最可靠的工具。它不会替你做模型设定不会提醒你遗漏了什么变量也不会告诉你某个系数为什么长得这么奇怪。它只负责把最小二乘法的解算出来把方差分解表、系数表、拟合优度整整齐齐摆在屏幕上。剩下的事全在敲命令的人手里。所以这篇东西的重点不是罗列命令而是把从数据整理到结果解释、从诊断到导出这一整条链路上那些教程里往往一笔带过、实战中却天天要面对的细节讲清楚。下面的内容适合三类人刚学完计量课、第一次真正拿数据上手的学生需要用 Stata 出分析报告、但被审稿人或老板追问过这个系数怎么解释的研究人员以及已经会用reg但总觉得结果不太踏实的从业者。全文以多元回归分析为主线穿插数据清洗、异常值处理、亚组分析、结果导出这些绕不开的配套动作。网状 Meta 分析也好面板回归也好底层的那套设定—估计—诊断—解释—复现的流程是完全相通的把这一套吃透换模型只是换命令。1.1 从一元到多元多出来的那部分到底管什么一元回归里斜率是x 变动一单位y 平均变动多少这个解释成立的前提是——所有影响 y 的其他因素都和 x 无关或者干脆不存在。现实里这个前提基本不成立。举个具体的例子分析某类商品的销量和价格一元回归跑出来价格系数是正数看着很反直觉。原因很简单天气、促销档期、节假日这些变量既影响价格旺季加价又影响销量旺季卖得多它们的作用全被塞进了价格系数里把它污染了。这就是遗漏变量偏误。多元回归的做法是把这些捣乱的变量显式地放进模型。此时每个系数的含义变成在其他自变量保持不变的条件下该变量每变动一个单位因变量的平均变动量。这句话里的保持不变是多元回归的灵魂也是它和一元回归唯一的本质区别。技术上最小二乘法在做的事情是让残差平方和最小几何上相当于把因变量向量投影到所有自变量张成的那个平面上。自变量之间哪怕高度相关只要不完全共线投影依然唯一只是这个投影对数据的微小扰动会越来越敏感——这就是后面要讲的共线性和稳健性的来源。理解了这一点再看诊断部分就不会觉得那些检验是多余的仪式它们都是在回答同一个问题这个投影到底稳不稳。1.2 Stata 命令语法的那套通用骨架Stata 命令的语法结构高度统一记住一次后面所有命令都能套[by varlist:] command [varlist] [exp] [if] [in] [weight] [, options]拿回归来说reg是regress的合法缩写惯例是把因变量写在最前面自变量跟在后面中间用空格分开。这跟很多软件的公式写法y ~ x1 x2不一样刚开始容易写反写反了 Stata 不会报错它会老老实实给你算出一个完全不同的模型——因为它在拟合第一个变量被后面那些变量解释。这也是新手交报告时结果对不上的高频原因之一写完命令回头看一眼变量顺序比事后排查省事得多。if和in这两个限定词值得单独提一句。if是逻辑条件in是行号范围。做亚组分析、剔除极端值、限定时间窗口全靠if。它不改变模型结构只改变参与估计的样本所以每一次加if都要意识到样本量在变系数的可比性也在变。1.3 有些时候不该用多元回归模型形式要和数据结构匹配这句话我说过很多遍。因变量是 0/1 二值用reg得到的预测值可能超出 0 到 1 的范围标准误也不对应该换成logit或probit。因变量是计数比如某段时间内的事件次数poisson或nbreg更合适。同一批个体被反复观测那就是面板结构得先用xtset声明再上xtreg。还有一种情况是内生性——某个自变量和误差项相关可能是因为遗漏了变量也可能是因为反向因果。这时的正解是找工具变量用ivregress或者外部的ivreg2而不是硬扛。我不建议把用了更复杂的模型当成水平高低的标志选模型的唯一标准是它和不匹配数据结构的代价相比哪个更划算。一个设定干净的 OLS说服力往往强过一个塞满花哨选项但逻辑混乱的模型。2. 建模之前的那半小时数据整理决定你后面三天的返工量我见过太多人拿到数据直接reg跑完发现结果不对再回头查数据来回折腾。真正的顺序应该反过来先花二十分钟把数据的家底摸清楚后面能省下大把时间。Stata 里摸家底的三个命令是describe、codebook、summarize配合起来基本能把一个陌生数据集看透。describe告诉你有哪些变量、什么类型、什么标签codebook会具体展示每个变量的分布、唯一值个数和缺失情况summarize, detail则给出分位数、偏度、峰度这些分布形状信息。2.1 变量类型分不清后面全是坑建模前必须把每个变量归到下面几类之一因为它们的处理方式和解释方式完全不同变量类型典型例子Stata 里的处理回归中的角色连续变量收入、年龄、面积直接用必要时取对数系数解释为边际效应二值变量是否女性、是否处理组i.或事先gen成 0/1相对参照组的差异多分类变量行业、地区、学历档i.var因子变量每个类别对参照组有序分类变量满意度 1-5 级i.var或当连续用视假设而定字符串变量姓名、编号encode或destring一般不入模型多分类变量最容易出问题。有人图省事把行业代码 1 到 20当连续变量塞进模型得到的结果是行业代码每增加 1因变量平均变动多少——这句话本身没有任何业务含义因为行业代码的大小顺序是人为编的。正确做法是用i.industry生成哑变量让每个行业和参照行业比。字符串转数值也要注意encode和destring的区别destring是把123这种长得像数字的字符串真正转成数值 123encode是把北京上海这种纯文本映射成 1、2、3并附加一层值标签。用错了要么转换失败要么把顺序信息彻底丢失。2.2 缺失值的代价比你想象中大Stata 把缺失值当作一个极大的正数.表示数值缺失所以对它求和、求最大值的操作会全部变成缺失。这是很多人第一次踩的坑。查缺失用misstable summarize或者外部命令mdesc一行就能看到每个变量的缺失数量和比例。处理方法要分情况。缺失比例很低比如低于 5%而且看起来是随机丢的直接删除观测是最省事的选择代价是样本量减少。缺失比例高或者缺失本身和因变量有关比如收入高的人更不愿意填收入直接删就会带来选择偏误这时要考虑多重插补mi系列命令或者其他填补策略。我个人的判断标准是先把有缺失和无缺失两组的关键变量均值对比一下如果差异明显就别删老老实实做插补并在报告里说明。2.3 最大值最小值异常值筛查的第一道网热词里有人搜stata 最大值最小值命令说明很多人卡在这一步。这里有个必须分清的细节egen的max()和min()作用是取整列的极值然后把同一个数字填到每一行而rowmax()和rowmin()才是取每一行内部几个变量的极值。* 整列极值所有观测得到的同一个数 egen max_income max(income) * 每一行的极值逐行比较三个变量 egen row_max rowmax(x1 x2 x3)把这两个搞混会得到看起来很正常但其实完全错误的变量。我在帮别人看代码时最常见的错误之一就是本意想做逐行最大值却写成了egen xxx max(a b c)。筛查异常值的标准动作是先跑分布summarize income, detail输出里的 Min、Max、1%、99% 分位数、偏度和峰度都值得看。如果 1% 分位数是 3000、最大值却是 99999999那基本可以确定存在录入错误或者单位不统一比如有人填了分有人填了元。处理选项按稳妥程度排序先核原始记录确认是错误就修正或删除确认是真实的极端值就考虑缩尾winsor2需要ssc install、截尾或者用对异常值不敏感的稳健回归rreg、分位数回归qreg。直接删掉真实存在的极端值是在用制造偏误的方式掩盖问题报告里也很难自圆其说。2.4 标签与 do 文件给三个月后的自己留条路label variable给变量加说明label define给取值加含义这些看起来是可选项其实是必需品。一个月后你看到b3这个变量名大概率想不起来它代表什么。更关键的是给变量加标签之后esttab导出的表格会自动带上标签省去手动改表的功夫。do 文件要从头到尾能跑通这是底线。我习惯把它分成四段环境设置clear all、set more off、版本声明、数据准备、分析、导出。每次改动都在 do 文件里改而不是在命令行里敲。命令行敲出来的结果第二次想复现的时候就得靠回忆这在需要交付的场景里非常危险。3. 第一遍 reg 跑通之后那张输出表每一行都该看得懂模型跑出来之后屏幕上那张表信息量其实很大但很多人只看 P|t| 那一列。我们把它拆开看。3.1 命令与几个真正有用的选项reg ln_wage edu exper exper2, vce(robust)vce(robust)是最常用的选项它不改变系数只改变标准误的计算方式让结果在存在异方差时依然可信。beta选项会额外输出标准化系数用于比较不同量纲变量的相对重要性。level(90)可以把置信区间从默认的 95% 改成 90%。noconstant是强制过原点除非你非常确定回归线必须经过原点否则不要加——强行去掉截距会让所有系数的含义发生改变。3.2 方差分解表先判断模型整体站不站得住表的上半部分是指标含义什么时候要警惕Number of obs实际参与估计的样本量和你预期差很多说明缺失或条件筛掉了样本F(k, n-k-1)模型整体显著性检验不显著说明所有自变量加起来也解释不了 yProb FF 检验的 p 值大于 0.05 时单个系数再显著也要谨慎R-squared解释的方差比例跨数据集比较没有意义Adj R-squared自由度调整后的 R²比较嵌套模型时看这个不看 R²Root MSE残差的标准误量纲和因变量一致越小拟合越好F 检验的原假设是所有自变量的系数同时为零它检验的是整组变量而不是某一个。这一点常被误解F 检验不显著但你关心的那个变量 t 检验显著这种情况说明模型整体很弱那个显著结果很可能是不稳定样本下的偶发不要急着当结论用。Adj R-squared 和 R-squared 的差别在于前者惩罚了参数个数。你每往模型里加一个变量R² 一定不会下降哪怕加的是随机数这就让 R² 在模型比较里失去了意义。Adj R² 会下降所以加变量后 R² 上升不构成保留该变量的理由。Root MSE 常被忽略但它在比较同一因变量、不同设定的模型时非常直观。3.3 系数表五列信息各管什么下半部分每一行对应一个自变量列分别是 Coef.、Std. Err.、t、P|t|、[95% Conf. Interval]。Coef.是点估计值量纲和因变量、自变量的量纲绑定不能直接横向比较大小——除非做了标准化。Std. Err.是估计的不确定程度。样本量越大、自变量变异越大、共线性越低标准误越小。看到标准误比系数还大说明这个估计非常不稳。t 值就是 Coef. 除以 Std. Err.Stata 帮你算好了。它不是独立信息而是前两列的比值。P|t|是原假设该系数为零成立时观测到当前或更极端 t 值的概率。它受样本量影响极大样本几万的时候一个业务上毫无意义的微小系数也可能显著样本只有几十的时候真实的大效应也可能不显著。所以我不建议把 0.05 当成生死线把它当作一个连续的证据强度更合理。置信区间和 p 值是一体两面。区间跨过 0 等价于 p 大于 0.05。我更愿意先看区间它直接告诉你效应可能的范围。样本小的时候经常出现 p 小于 0.05 但区间宽得离谱比如系数 0.5区间 [0.02, 0.98]的情况这时候说显著的正向影响是自欺欺人实际含义是方向可能是正的也可能接近零。3.4 输出表里没有的东西才是真正的风险点Stata 默认不会打印 VIF不会做异方差检验不会标记强影响点。它给的是一个在理想假设全成立时的结果。这些假设是否成立得你自己去查。下一节就按排查顺序把它们一个个过一遍。顺序上我的习惯是先看分布和异常值最基础问题最容易发现再看函数形式设定错了后面全白做然后查共线性影响系数稳定性最后处理异方差影响标准误和推断。4. 系数怎么讲成人话连续、哑变量、交互项三条不同的解释路径拿到系数不会解释等于模型白跑。不同类型的变量解释路径完全不同而且这里的错误往往比技术错误更致命因为它直接影响结论的可信度。4.1 连续变量注意量纲和对数变换最基础的情形y 3.2 0.8 * xx 每增加 1 个单位y 平均增加 0.8 个单位前提是其他变量不变。要注意 x 的单位——如果 x 是万元而你以为它是元这个 0.8 的含义就差了一万倍。对数变换的三种组合必须分清楚这是报告里出错最多的地方因变量 y自变量 x系数 b 的含义术语原始值原始值x 增 1 单位y 增 b 单位水平效应ln(y)原始值x 增 1 单位y 大约变动 100b%半弹性原始值ln(x)x 增 1%y 增 b/100 单位半弹性ln(y)ln(x)x 增 1%y 增 b%弹性严格来说ln(y)对x求导得到的是比例变化b转换成百分比更精确的公式是100*(exp(b)-1)。当 b 比较小比如小于 0.1时100b和精确值差别不大可以近似但 b 比较大比如 0.5 以上的时候用100b会明显高估这时候老老实实用公式算。4.2 哑变量和参照组别忘了陷阱和基准多分类变量用因子变量语法i.处理reg wage edu i.region i.industryStata 会自动把每个分类变量的第一个取值作为参照组其余类别生成哑变量。想要指定参照组用ib3.region表示以 region 等于 3 的那一类为基准。系数解释是相对于参照组该类别的因变量平均高出或低于多少。哑变量陷阱值得单独说如果你手动tabulate region, generate(d)生成了全部 5 个哑变量然后一起放进模型会和截距项完全共线Stata 会自动丢掉一个并给出提示。这时候丢掉的是哪一个取决于变量进入的顺序可能导致你根本不知道当前的基准是谁。所以我更推荐直接用i.region让 Stata 管理这件事。还有个实际问题参照组的选择会改变所有系数的数值但不会改变模型整体的拟合和统计推断。报告时一定要写明基准是哪一类否则读者无法理解系数的含义。4.3 交互项不要只看交互项系数就下结论交互项用来回答x 对 y 的影响在不同群体里是否不同这也是亚组分析最常见的做法。语法上#表示只有交互项##表示主效应加交互项reg wage c.edu##i.femalec.edu##i.female展开后等于edui.femaleedu#i.female三项。如果只写c.edu#i.female模型里就没有性别的主效应解释会变得别扭一般不推荐。关键的坑在这里交互项的系数显著只能说明两组斜率存在差异不能直接说明某一组里 x 有显著影响。正确的做法是用marginsmargins female, dydx(edu) marginsplot第一行命令会给出两组各自的教育回报率及其标准误、置信区间这才是可以直接报告的数字。marginsplot 把结果画成图比一堆数字更直观。我见过不少论文在交互项显著之后只报告了分组回归的系数就下结论逻辑上是不完整的。4.4 标准化系数只在同一个模型内部有意义当自变量量纲相差悬殊比如年龄是几十GDP 是几万亿直接比较系数大小没有意义。加beta选项可以得到标准化系数它表示自变量变动一个标准差因变量变动多少个标准差。用于同一模型内的相对重要性排序是合适的跨模型比较就要小心因为样本和变量集合一变标准差也变了。5. 诊断别只做一种共线性、异方差、异常值、函数形式的排查顺序我把诊断分成四块按我自己的排查顺序展开。顺序不是绝对的但这个顺序的好处是前面的问题被发现并处理掉后面的检验才更有意义。5.1 多重共线性VIF 高不一定就要删变量reg y x1 x2 x3 estat vif输出里每个变量一个 VIF 值还有 1/VIF。经验阈值通常说 VIF 大于 10 提示严重共线保守一点用 5。但这里有个必须讲清楚的逻辑共线性本身不会让系数估计产生偏误它只会让系数的标准误变大、估计变得不稳定。也就是说共线性高的时候你更容易得到不显著的结果但你得到的显著结果依然是可信的方向。所以看到高 VIF 不要条件反射地删变量。先问两个问题这个变量是不是理论上必须控制的删了它会不会引入遗漏变量偏误如果它重要那宁可接受较大的标准误也要保留。只有在两个变量测量的是几乎同一个东西比如总收入和工资收入才有充分理由合并或删除其一。其他可选的处理方式包括主成分回归、增大样本量、或者用岭回归这类带偏但方差更小的估计方法。顺便提醒一句estat vif只能紧跟reg之后使用如果中间插了别的估计命令会提示找不到结果。另外只要模型里包含因子变量或者交互项estat vif会为每个展开后的项都报一个值解读时要留意。5.2 异方差先看图再做检验最后决定要不要改标准误最直观的检查是画残差图reg y x1 x2 rvfplotrvfplot画的是残差对拟合值如果点云呈现喇叭形拟合值越大残差越分散基本可以确认存在异方差。再补一个正式检验estat hettest estat imtest, whiteestat hettest是 Breusch-Pagan 类的检验estat imtest, white是 White 检验。原假设都是同方差。p 值小于 0.05 就拒绝同方差假设。处理方式上我的默认选择是直接把vce(robust)加进模型而不是去做加权最小二乘WLS。原因很简单稳健标准误不需要你正确设定异方差的具体形式代价只是标准误可能略大一点点换来的是推断的可靠性。WLS 需要你知道方差和某个变量的函数关系猜错了反而更糟。聚类标准误是另一个场景。同一家公司多个年度、同一所学校多个学生这类数据里误差项在组内相关必须用vce(cluster id)。判断标准是如果你的观测可以自然分组并且在组内不独立就该用聚类。注意聚类数量太少比如少于 30 到 40 组时标准误本身也不可靠这时要用 bootstrap 或者野生聚类 bootstrap 之类的替代方案。5.3 异常值和强影响点分清离群和有影响力异常值有两个维度因变量方向离群残差大和自变量方向离群杠杆高。Stata 里可以这样看reg y x1 x2 predict resid, residuals predict lev, hat predict cooksd, cooksd lvr2plot dfbeta阈值方面的经验规则杠杆值大于2k/nk 是自变量个数n 是样本量值得关注CooksD 大于4/n就属于强影响点。lvr2plot画的杠杆-残差平方图能一眼看出右上角那几个点——它们同时具备高杠杆和大残差对系数的影响最大。发现强影响点之后的处理流程我建议按这个顺序先核对原始数据是不是录入错误这一步能解决相当一部分问题确认数据无误后判断这个观测是否属于研究总体比如研究普通企业却混进了一家巨型央企如果确实属于总体内就做敏感性分析——删掉它们重跑一遍看结论是否变化。如果结论对几个点这么敏感那本身就是一个需要如实报告的发现而不是藏起来。5.4 函数形式设定错了后面全白做诊断顺序里我把函数形式放在靠前的位置因为它是最容易被忽略、后果又最严重的一类问题。检验手段有estat ovtest // Ramsey RESET 检验 linktest // 检查是否需要增加非线性项estat ovtest检验的是模型是否需要加入拟合值的幂次项显著就意味着可能存在遗漏的非线性关系。linktest会重新跑一个包含拟合值和拟合值平方的模型如果平方项显著说明线性设定不够。可视化上avplots给出每个自变量对因变量的偏回归图rvpplot画残差对各自变量。图上如果呈现明显的弯曲形状比如 U 形说明该变量可能需要平方项或者取对数。另外残差正态性的检验sktest、swilk在小样本里值得做但在大样本里由于中心极限定理正态性对系数推断的影响很有限不要为了这个折腾太久。6. 稳健性与亚组分析让结论经得起追问模型跑通、诊断过关只能说技术上没问题。真正的考验是别人问换个指标会不会变换个样本会不会变换个时间段会不会变。6.1 嵌套模型对比与信息准则比较嵌套模型的标准做法是存结果再对比reg y x1 x2 estimates store m1 reg y x1 x2 x3 x4 estimates store m2 lrtest m1 m2 estat iclrtest做的是似然比检验原假设是受限模型少的那个足够。estat ic给出 AIC 和 BIC适用于比较非嵌套模型。要格外注意AIC/BIC 和 R² 不是一回事前者偏向预测能力后者偏向解释力报告里选哪个要看你的研究目的。6.2 亚组分析分组回归不能直接比较系数这是审稿意见里出现频率极高的一条。很多人做了分样本回归看到一组显著、一组不显著就得出该效应只存在于某一组的结论。这个推理是错的——一组显著一组不显著可能只是因为一组的样本量小、标准误大两组的系数差异在统计上并不显著。正确做法有两条路。推荐的是交互项法前面讲过用margins给出两组各自的边际效应用交互项本身的检验判断差异。另一条路是分样本回归后做组间系数差异检验reg y x controls if group 1 estimates store g1 reg y x controls if group 0 estimates store g2 suest g1 g2 test [g1_mean]x [g2_mean]xsuest把两个独立估计的结果合并起来做联合检验。有几个注意点如果模型里用了vce(robust)suest的兼容性要确认两个子样本里必须存在同名但互不重叠的变量所以一般需要先在两个子样本里各生成一份变量再合并操作上略显繁琐。所以我日常更倾向交互项法代码短、解读清晰、也更容易画图。6.3 换指标、换样本、换模型稳健性三件套稳健性检验不是走过场它的目的是说明结论不是因为某个特定选择才出现的。常用的三类操作换指标核心自变量有多个测量方式比如企业规模可以用员工数、也可以用资产总额两个都试一遍。因变量同理比如盈利能力可以用总资产收益率也可以用净资产收益率。换样本剔除极端年份、剔除特定地区、剔除规模最大或最小的 1%看结论是否稳定。如果某个子样本里结论完全反转那要深入分析而不是回避。换模型OLS 换成稳健回归、分位数回归或者对二值因变量换成 logit。模型换了结论还在说服力就上一个台阶。这三类做下来通常需要三到五张表格。用esttab并排输出比手工整理效率高得多。6.4 逐步回归能不用就不用stepwise看起来很方便自动帮你选变量。但它有个致命问题最终模型是在数据上反复筛选出来的此时计算出来的 p 值、置信区间都不再具有名义上的统计意义因为它没有考虑搜索这个动作带来的多重比较问题。在预测任务里它作为特征筛选工具尚可在需要解释系数、做因果推断的场景里我不建议使用。宁可根据理论和文献先定好变量集合再用数据验证。7. 结果导出与工程化让三个月后的自己能复现分析做完最后一公里是交付。手工把系数敲进 Word 出错率高、改动成本大用命令导出才是正路。7.1 esttab 基础用法先安装ssc install estout, replace然后eststo clear reg ln_wage edu exper exper2 i.female, vce(robust) eststo m1 reg ln_wage edu exper exper2 i.female i.region, vce(robust) eststo m2 esttab m1 m2 using regression_table.rtf, replace /// b(3) se(3) star(* 0.10 ** 0.05 *** 0.01) /// r2 ar2 nogap label几个参数值得说明b(3)控制系数保留三位小数se(3)控制标准误位数star()定义显著性星号阈值nogap去掉模型之间的空行让表格更紧凑label用变量标签而不是变量名。把结果存成.rtf的好处是可以直接用 Word 打开格式基本可编辑。7.2 并排输出的实用技巧多模型并排时几组选项经常一起用keep()只保留关心的变量把控制变量的系数藏起来indicate()则可以把一组变量合并成一行显示已控制mtitles(模型1 模型2)自定义表头order()调整变量出现顺序把核心变量放在最前面stats(N r2 ar2, labels(样本量 R² 调整R²))控制底部报告哪些统计量drop(*.region)剔除某一组展开的哑变量如果团队里习惯用outreg2它的用法类似outreg2 using file.doc, replace ctitle(模型1)第一步用replace后续追加不加该选项它会自动把新模型加到同一张表里。7.3 do 文件的分层结构我给 do 文件定过一个模板用到现在比较顺手00_master.do负责依次调用其他文件01_clean.do做数据清洗和变量构造02_analysis.do跑模型03_export.do导表。每一层都从原始数据开始跑中间文件用save落地这样任何一步出错都能快速定位到源头而不是从头再来。还有两个细节容易被忽略一是版本声明Stata 从 11 版引入因子变量语法不同版本对某些命令的支持也不同在 do 文件开头写version 16这类声明能避免换机器后结果不一致二是可重复性如果分析里用到随机过程bootstrap、模拟、插补一定要写set seed否则第二次跑出来的数字就不一样了。8. 那些让人抓狂的报错r(XXX) 背后的真实原因Stata 的报错信息以r(数字)结尾新手看到一串数字往往直接懵。其实常见的就是那么几种。8.1 高频错误码对照错误码提示含义常见真实原因排查方向r(111)variable not found变量名拼错或还没生成describe看变量清单r(109)type mismatch字符串参与了数值运算用destring或encode转换r(198)invalid syntax逗号位置、括号、选项拼写有问题拆开命令逐段试r(110)already defined重复定义变量或标签先drop或换变量名r(2000)no observationsif条件把所有样本筛掉了去掉if试跑检查条件逻辑r(2001)insufficient observations样本量小于参数个数减少变量或扩大样本r(459)not sorted用了by但数据没排序改用bysort一条命令搞定r(601)file not found路径写错或用错工作目录用pwd和cd确认8.2 字符串与数字的转换坑类型不匹配是最隐蔽的一类问题因为 Stata 只在真正用到的时候才报错。比如某个收入变量在导入时被识别成字符串summarize能用它会给个提示但能跑一到reg就直接r(109)。describe income destring income, replace如果报contains nonnumeric characters说明里面混了文字或者未知缺失这类标记先list income if missing(real(income))找出这些观测处理完再转。encode和destring的取舍前面提过这里再补一句实践建议只有当你确实需要保留文本信息的时候才用encode纯粹做数值运算就直接destring。8.3 因子变量语法的误用i.、c.、#、##这套语法很强大但用错的地方也不少。i.group表示把 group 当作分类变量c.age明确按连续变量处理在有歧义的地方写出来更安全c.age#c.age是交互项也常用来自动生成平方项reg y c.age##c.age i.region这一句同时包含 age、age 的平方、region 哑变量等价于手工生成age2 age^2后再回归但写起来干净得多。另外b0.、ib.、o.这几个前缀分别表示把某类别设为基准、指定基准类别、省略该类别处理共线或者调整基准时用得上出报告前值得花十分钟熟悉。8.4 模型之间样本量对不上对比两个模型的系数时如果参与估计的样本悄然变了比较就不成立。样本变化的原因通常有三个if条件不同、缺失值分布不同、共线性导致变量被自动剔除。第三个最隐蔽——模型里加了一个和已有变量高度共线的变量Stata 会静默丢掉其中一个样本量可能不变但模型已经不是你以为的那个了。排查用这两个命令reg y x1 x2 x3 count if e(sample)e(sample)标记的是实际参与估计的观测用count数一下就知道样本量。用并排表格导出时把N一起报出来也是让审稿人放心的一个细节。我自己跑了这么多年回归最后固定下来的习惯是这样每次分析都先跑一遍最素的模型只有核心自变量和因变量把系数记在旁边做个参照然后逐步加入控制变量每加一次就看一眼核心系数动了多少。如果加了某个变量之后系数剧烈变化那这个变量就值得单独讨论它往往揭示了重要的机制而不是需要被修正的干扰。参数稳定、方向一致才敢往报告里写。至于那些被删掉的异常值、被换掉的时间窗口、被尝试过的各种设定都留在 do 文件里谁知道哪天审稿人就会问起其中某一个。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →