简介:《Stata学习笔记及代码详解》面向社会科学、生物医学与经济领域的统计初学者,以及需要快速上手Stata完成课程作业与实证分析的学生。内容围绕软件核心操作展开:结果窗口、命令窗口与变量名窗口等界面构成,数据导入导出与编辑管理,e/f/g三种数值显示格式及%9.2f、%15s等格式设定,label variable与label define标签添加,if、in、by及bysort分组筛选,新建数据集与rename、save保存,describe、list等描述统计,再到graph绘图与regress回归的进阶应用,并附ln、abs、round等常用函数速查。压缩包仅含1个docx文档,约366KB,轻量便于随时查阅。目前已有4217人学习,适合作为课堂笔记补充与命令速查手册。
1. 一份 dofile 才是 stata 学习笔记的最后归宿
刚开始学 Stata 的人,笔记大多是这种形态:结果窗口截图存进相册,命令抄在 Word 里,遇到报错再翻一遍 stata安装教程,重新走一遍流程。三个月后回头翻,图还在,数据没了;命令还在,变量名忘光了。真正救得了命的笔记,是能一键重跑的 dofile——数据从哪来、变量怎么改、模型怎么设、结果存哪里,全部写进代码,再用几行注释交代每一步为什么这么做。
这个标题要解决的就是这件事:把「stata 学习笔记」和「代码」合成同一个东西,笔记即代码,代码即笔记。它适合刚装完 stata 的新手,也适合做了几年分析、硬盘里躺着一堆 do 文件却不敢重跑的人。下面按环境固定、数据清洗、建模与亚组分析、日志与代码诊断四条线,把笔记写成一套能复用的骨架。
2. stata 安装之后先做的三件事:工作目录、ftool 命令与 dofile 骨架
2.1 stata下载和stata安装完成后必须固定的几个设置
stata安装包和stata安装教程教的是下一步、下一步、完成,装完就没人管了。可第一份笔记该记的恰恰是环境设置,因为后面每一条命令的相对路径都挂在它上面。我一般把下面这段固定放在每个 do 文件的开头,一次写好,之后新建文件直接复制。
* 环境设置,放在每个 do 文件最前面 clear all // 清空内存中的数据,避免上一份数据残留干扰 set more off // 结果分页不暂停,批量运行时的必需品 set linesize 200 // 结果窗口宽度,防止宽表格折行看不全 set maxvar 32767 // 变量数上限,宽表样本可上调(受版本上限约束) cd "D:/stata_notes" // 工作目录,后续所有相对路径以此为根 pwd // 打印当前目录,路径找错时第一个要看的地方clear all清的是内存里的数据和已加载的程序,不清磁盘文件,所以可以放心放在开头;set more off关掉「--more--」提示,否则循环跑到一半会卡住等人按空格;set linesize影响的是结果窗口显示宽度,不影响数值精度;cd改成你自己的项目根目录,之后写use "data/wage.dta"就不用带长路径,换电脑只要改这一行。
| 设置项 | 常用命令 | 建议值 | 主要作用 |
|---|---|---|---|
| 内存与变量上限 | set maxvar | 32767 起 | 支撑宽表大数据 |
| 分页控制 | set more off | 关闭 | 支持无人值守批量运行 |
| 结果显示宽度 | set linesize | 200 | 表格不折行 |
| 工作目录 | cd | 项目根目录 | 相对路径统一 |
| 日志 | log using | 每份 do 一份 | 结果可回溯 |
提示:
cd里用正斜杠/,Windows 下写成D:/stata_notes最省事,反斜杠容易被当成转义字符。
2.2 ftool命令stata:比鼠标点变量窗口快在哪
数据一多,靠鼠标在变量窗口一列一列点着看非常慢。ftool命令stata 这个第三方命令可以直接在结果窗口列出变量清单,配合键盘翻页比鼠标快得多,这也是我把「变量速查」放进笔记第一条的原因。它的常见做法是先装再调用:
ssc install ftool, replace // 从 SSC 安装或更新 ftool ssc install extremes, replace // 极值查看,后面统计章节会用到 ssc install winsor2, replace // 缩尾处理 ftool // 列出当前数据里所有变量 ftool wage educ exper // 只列出指定变量,支持通配 wage*ssc install从 SSC 官方仓库拉包,replace表示已装过就覆盖更新,避免版本错配。ftool不带参数就是全量清单,带变量名就是定向查看。装包这件事本身也要记进笔记:如果半年后换机器,照着这几行重跑一遍,环境就恢复了大半。同类工具还有findit(搜索命令名与简介)和ssc describe(看某个包的信息),findit适合只记得关键词、不记得命令名的时候用。
2.3 dofile 的最小骨架和示例代码讲解
笔记写到最后,比拼的不是记得多,而是别人拿到你的 do 文件能不能一次跑通。下面这段是我给每个新项目起手的骨架,注释块负责交代上下文,正文负责执行。
*============================================================== * 项目:wage 数据分析笔记 * 输入:data/wage.dta * 输出:log/ 结果日志,out/ 导出的表格 *============================================================== version 17 // 锁定语法版本,避免新版下行为差异 clear all set more off set linesize 200 cd "D:/stata_notes" capture log close // 若已有日志打开则先关,防止报错中断 log using "log/wage_main.log", replace text use "data/wage.dta", clear describe // 变量清单与类型,先看再动手 count // 样本量,异常时第一时间发现 log closeversion 17把当前 do 文件按指定版本语法解释,团队里有人用旧版时能减少「我这里能跑你那里报错」的扯皮,具体写几取决于你实际使用的版本。capture log close是关键一步:如果上一次异常退出导致日志没关,直接log using会报错终止,加capture让它失败也继续往下走。describe和count是低成本的体检,几秒钟就能确认数据读对了没有。
3. 数据清洗与描述统计:stata最大值最小值命令怎么选
3.1 导入数据后 destring 与 encode 的先后顺序
从 Excel 或 CSV 进来的数据,数值列常常带千分位逗号被读成字符串,分类列则是一堆中文文本。这两类问题的处理命令完全不同,顺序也不能乱。
import excel "data/raw.xlsx", sheet("Sheet1") firstrow clear destring gdp, replace ignore(",") // 字符串数字转数值,忽略千分位逗号 encode province, gen(prov_id) // 文本分类转带标签的数值 codebook prov_id // 查看编码结果与标签对应关系 label list prov_id // 单独列出标签,核对有没有漏项destring处理的是「本质是数字、只是被读成文本」的列,ignore(",")让它跳过千分位逗号,replace表示原地替换原变量。encode处理的是「本质是分类」的列,它生成一个新变量并自动建立值标签,原文本变量保留。判断标准很简单:这列能不能做加减乘除?能就用destring,不能就用encode。
| 命令 | 输入类型 | 输出 | 典型场景 |
|---|---|---|---|
destring | 数字型字符串 | 数值变量 | 金额、比率、年份 |
encode | 文本分类 | 数值 + 值标签 | 省份、行业、分组 |
label define | 手工定义 | 值标签 | 编码顺序需要指定时 |
注意:
encode生成的编码是按文本排序或首次出现顺序给的,如果你要固定「对照组=0、处理组=1」,别依赖默认,用label define手工指定再label values挂上去。
3.2 stata最大值最小值命令:summarize、tabstat 与 extremes 的取舍
描述统计里问得最多的就是最大值最小值。sta 里能看极值的命令不止一个,差别在输出粒度和是否分组。
summarize wage, detail // 含最小值、最大值、四分位数、偏度峰度 return list // 把 r(min)、r(max) 等存起来备用 display r(max) - r(min) // 直接算极差 bysort industry: summarize wage, detail // 按行业分组看极值 tabstat wage, by(industry) statistics(n mean sd min p50 max) /// columns(statistics) format(%9.2f) // 分组汇总成一张紧凑表summarize不带detail只给均值、标准差、极值;加detail会给四分位数、偏度、峰度,判断分布形态时用它。return list把结果暂存在r()里,r(min)、r(max)、r(p50)都可以直接参与后续计算,这是把描述统计接进自动化流程的关键。tabstat的statistics()里写你要的统计量,columns(statistics)让统计量变成列、分组变成行,是论文里最常用的排版方式。
如果想生成变量级的最值而不是看结果,用egen:
egen w_max = max(wage) // 生成一列,每行都是 wage 的最大值 egen w_min = min(wage) // 最小值同理 gen w_range = w_max - w_min // 极差egen的max()和summarize的r(max)数值一致,但前者会把结果广播到每一行,适合做组内离差、极值标准化这类派生变量。想直接看「最高的 5 个观测」而不只是一个数,用extremes:
extremes wage, n(5) // 列出最大和最小的各 5 条这四条路对应四种需求:单变量概览用summarize,分组汇总用tabstat,把最值变成变量用egen,定位具体观测用extremes。笔记里最好各留一行带注释的示例,下次不用重新查语法。
3.3 缺失值和异常值的批量排查
数据清洗真正的坑在缺失和极端值,单个变量看没问题,合起来看全是问题。先批量扫一遍缺失:
misstable summarize // 各变量缺失数量与比例 foreach v of varlist _all { // 逐变量统计缺失 quietly count if missing(`v') // quietly 抑制中间输出 if r(N) > 0 noisily display "`v' 缺失 " r(N) // 有缺失才打印 }misstable summarize给的是全局视图,一眼看出哪些变量缺失严重。foreach循环里的quietly是为了不让count的结果刷屏,r(N)取上一次命令的计数结果,noisily则让display强制显示——这是 Stata 里很典型的一组搭配,值得原样抄进笔记。异常值处理常用缩尾:
winsor2 wage, cuts(1 99) replace // 上下 1% 缩尾cuts(1 99)表示把低于 1 分位和高于 99 分位的值分别替换成分位点数值,replace原地覆盖。缩尾前记得先备份原始变量,或者先跑一遍summarize wage, detail把缩尾前后的极值对比记录下来,这部分对比本身就是笔记里最有价值的内容之一。
4. 从回归到stata如何做亚组分析、网状meta分析stata的代码组织
4.1 regress 与 margins 的配套写法
回归本身一行就够,难的是把结果解释清楚并存下来。margins和marginsplot配合estimates store,能把系数表变成可解释的边际效应图。
regress wage i.educ c.exper##c.exper, robust estimates store m1 // 存模型,供后续对比 margins, dydx(exper) at(exper=(0(5)40)) // 在不同经验值上求边际效应 marginsplot, name(g1, replace) // 画图并命名,便于合并导出i.educ表示把教育年限当分类变量处理,会生成虚拟变量组;c.exper##c.exper是两个连续变量的交互,等价于同时纳入exper、exper的平方以及它们与其它项的交互结构;robust给出异方差稳健标准误。margins, dydx()求的是某变量对结果的边际变化,at()指定在哪些取值上求——因为模型里有平方项,边际效应会随exper变化,只看一个系数是没有意义的。estimates store存下来之后可以用estimates table m1 m2并排比较,写笔记时把两张表放一起,比记一堆系数结论有用得多。
4.2 stata如何做亚组分析:交互项与分组回归两条路
stata如何做亚组分析,答案基本落在两条路上:一条是加交互项,一条是分组重跑。两者回答的问题不同,不能互相替代。
路线一,交互项检验效应修饰:
regress wage i.treat##i.sex age, robust margins, dydx(treat) over(sex) // 各性别下的处理效应 margins sex#treat // 各组合的预测均值 test 1.treat#1.sex // 交互项是否显著,即有无效应修饰i.treat##i.sex一次性给出两个主效应和它们的交互项,比手工生成相乘变量更不容易出错。margins, dydx(treat) over(sex)输出的是各亚组里的处理效应,test那行检验交互项整体显著性,这是判断「亚组差异是真实的还是抽样波动」的关键一步,笔记里不能只留前面几行。
路线二,分组回归加循环:
levelsof sex, local(levels) // 把 sex 的所有取值存进局部宏 foreach s of local levels { display "=== sex = `s' ===" regress wage treat age if sex == `s', robust }levelsof自动抓取分组变量的全部取值,用不着手写 0 和 1,分组一多优势明显。if sex ==s'里的s` 是循环变量,两侧加反引号是 Stata 的局部宏引用语法。两条路各有代价:交互项节省样本、能做形式检验,但组间协变量分布差异看不出来;分组回归直观、每组可以单独调协变量,但各组样本量小时功效掉得快,且不能直接给出交互项 P 值。如果组别较多,也可以用第三方命令简化:
ssc install subgroup, replace subgroup wage age, by(treat) // 具体参数按 help subgroup 调整注意:亚组分析跑上十几组,总有几组「显著」。正经做法是在 do 文件里显式写上交互检验,并把所有亚组结果一次性导出,而不是只挑显著的写进笔记。
4.3 网状meta分析stata的最小可运行流程
网状meta分析stata 这类分析,笔记里最该记的不是结果,而是数据准备格式,因为绝大多数报错都死在数据没摆对。常见做法是用 SSC 上的network系列命令,先把数据整理成「研究—处理—效应量—标准误」的长表,再逐步跑通。
ssc install network, replace network setup rr, studyvar(study) trtvar(trt) /// effectvar(_ES) sevar(_seES) vars(l rr) // 声明数据结构 network map // 绘制证据网络,检查是否存在断点 network plot // 查看各研究的两两比较分布 network meta // 拟合网状 meta 模型network setup rr里的rr是效应量类型,按你的数据类型换成or、md、smd等;studyvar是研究标识,trtvar是处理标识,effectvar和sevar分别是效应量与标准误;vars()里放的是原始数据列,以列表形式存进数据集,后续出图出表要用。network map出来的是网络图,如果某个处理是孤立的,后面的模型会直接报错,这一步相当于前置体检。network meta跑完再用network forest、network rank之类出森林图和排序概率,具体子命令用help network看一遍再写进笔记,比背下来靠谱。
| 步骤 | 命令 | 失败时先看什么 |
|---|---|---|
| 数据声明 | network setup | 效应量类型与列名是否对得上 |
| 网络结构 | network map | 是否有孤立节点、是否只有单臂研究 |
| 模型拟合 | network meta | 处理编号是否重复、标准误是否有零值 |
| 结果输出 | network forest等 | 处理标签是否加了label |
5. 让笔记能重跑:日志留痕、代码诊断与模板复用
5.1 log 与 putexcel 把结果落盘
结果窗口里的东西关掉就没了,笔记必须让它落盘。文本日志用log,要进 Excel 的表用putexcel。
log using "log/desc.log", replace text // text 格式便于搜错,不用 smcl summarize wage, detail tabstat wage, by(industry) statistics(n mean min max) log close putexcel set "out/desc.xlsx", replace // 新建或覆盖目标文件 putexcel A1 = "变量" B1 = "均值" C1 = "最小值" D1 = "最大值" putexcel A2 = "wage" B2 = r(mean) C2 = r(min) D2 = r(max)log using的text选项生成纯文本,用编辑器就能搜关键词,比默认格式好排查;replace允许覆盖同名日志。putexcel的坐标写法是「列字母 + 行号」,r(mean)取自上一条summarize的返回值——注意它的时效性,中间插了别的命令,r()就被覆盖了,所以写入 Excel 的动作要紧跟统计命令。
5.2 代码诊断:set trace、capture 与断点的替代做法
do 文件跑到一半报错,最费时间的不是改,是定位。capture配合_rc是最常用的代码诊断手段:
capture noisily regress wage educ if _rc { display "命令失败,返回码 = " _rc display "检查缺失值或共线性" }capture让命令失败也不中断,noisily保证错误信息照样显示出来,_rc保存返回码,非零表示出错。这样整份 do 文件能一次跑完,把问题集中列出来,而不是跑一段改一段。层级更深的问题用set trace on逐行跟踪:
set trace on quietly summarize wage, detail set trace off它会把每条语句的执行过程打印到结果窗口,适合排查循环里到底哪一轮出了偏差,代价是输出量很大,定位完记得立刻关掉。至于断点调试,Stata 没有现代 IDE 那种图形断点,替代办法是在关键位置插assert:
assert !missing(wage) // 断言无缺失,不满足直接报错停住 assert wage > 0 // 断言取值合理写 do 文件时用编辑器自带的语法高亮和代码补全,能挡掉一大部分拼写错误;把 do 文件放进 Git 仓库管理版本,改动历史清楚,回退也方便,比在文件名后面加「最终版」「最终版2」稳得多。
5.3 一套可以直接抄的笔记模板骨架
笔记多了以后,按编号拆分文件是最省心的做法,每个文件只干一件事:
* 00_setup.do 环境与路径,装包清单 * 01_clean.do 导入、destring、encode、缺失与缩尾 * 02_desc.do 描述统计,导出 Table 1 * 03_model.do 回归、亚组分析、敏感性分析 * 04_network.do 网状 meta(如有) * 99_export.do 汇总导出日志与表格调用顺序固定为00 → 01 → 02 → 03 → 04 → 99,每个文件开头都写上log using,结尾都写log close,异常中断也能留下半截日志。文件之间的衔接靠统一的变量命名规则:清洗后的数据统一存成data/clean.dta,下游文件一律use "data/clean.dta", clear,绝不各自去读原始 Excel。命名上,清洗后的变量加后缀_c、缩尾后的加_w、生成的虚拟变量加_d,一眼就能看出这一列的来路,半年后翻笔记时省下的时间,比写这两天多得多。
本文还有配套的精品资源,点击获取