简介:Stata是一款在学术与商业领域广泛应用的统计分析软件,这份doc文档面向零基础入门者,系统讲解从软件概况、界面布局到数据录入与储存的完整操作流程,帮助读者快速建立使用Stata进行数据处理与分析的基本能力。资源为doc格式文档,共1个文件,压缩包仅318KB,内容精炼,适合教学自学或作为培训补充材料。文档重点介绍了Stata短小精悍、命令简洁、可扩展性强等特点,并详细拆解结果窗口、命令窗口、命令回顾窗口与变量名窗口的功能,同时结合具体示例演示键盘输入、数据编辑器、粘贴交互及打开已有数据文件等多种数据录入方法。目前已有297人学习下载,对于希望掌握Stata入门操作、为后续回归分析、时间序列等统计方法打下基础的用户,是一份实用且高效的参考教程。
1. 为什么数据分析要从数据管理开始学 Stata
Stata 在数据分析工具里属于那种“被低估的入门选择”。做医学统计、经济计量、社会调查的人几乎人手一份,因为它把数据管理和统计分析放在同一个操作环境里,中间不需要切换语言或格式;一篇论文里从样本筛选、指标计算、分组对比到回归建模的全过程,都可以用一份 do 文件完整复现。市面上很多教程一上来就讲回归、讲 meta 分析,反而把“拿到一张乱表之后怎么整理成 Stata 能跑的样子”这一环跳过去了。这篇内容按我最常用的路径走一遍:认识 Stata 的数据结构、学会用 do 文件管流程、掌握日常数据清洗命令、跑通描述统计和回归,最后把结果整理成可交付的表格。适合刚装好 Stata 的人,也适合从 Python 或 R 转过来、想快速上手这套语法的从业者。
2. Stata 工作台:数据视图、do 文件和日志文件的配合方式
2.1 Stata 的数据组织和三个核心窗口
Stata 的基本数据结构是“观察值 × 变量”的矩形表格,每一行是一个观察单位,每一列是一个变量。这和 Excel 表格很像,但 Stata 强制要求一列只能有一种存储类型(数值型或字符型),不能像 Excel 那样一个单元格放文字、一个放数字。这个约束在导入数据时经常让人困惑,比如“001”这种编号导入后被当成数值 1,就是因为 Stata 把整列识别成了数值型。理解了这个机制,后续很多报错都能定位到原因。
打开 Stata 后,界面上有三个需要关注的窗口:命令窗口、结果窗口、变量窗口。命令窗口在左下角,每次输入命令后回车执行;结果窗口显示命令输出;变量窗口列出当前数据的全部变量名。还有一个数据集窗口,默认被变量窗口覆盖,点一下“Data Edit”才能看到具体单元格。新手最容易犯的错是直接在变量窗口里改数据,这样改完很难追溯操作过程,一旦改错就只能重新导入。
我一般建议把工作习惯固定成“命令窗口写代码 + 变量窗口核对结果”,而不是手动编辑单元格。
2.2 do 文件是 Stata 操作的核心,不是可选项
do 文件相当于 Stata 的脚本文件,把所有命令按顺序写在里面,一次性执行。它的价值在数据量大的时候体现得最明显:处理几百兆的数据,手动点菜单执行几十步操作,中间任何一步出错都要从头来过;而 do 文件可以随时修改一处后重新运行,全程可追溯。更重要的是,论文审稿或业务交付时,一份 do 文件就是你的分析审计日志,每一步做了什么都有据可查。
新建 do 文件的命令是:
doedit这会打开一个文本编辑器,把下面的内容粘贴进去保存,再选中全部或逐段执行。一个常见的 do 文件开头是这样的:
clear all set more off use "D:/data/rawdata.dta", clear log using "D:/data/analysis_log.smcl", replace逻辑说明:clear all清空内存中的数据,避免上一次分析残留影响当前结果;set more off关闭结果分页,否则输出内容较多时 Stata 会停在“--more--”等待按键;use导入已有的 Stata 格式数据文件;log using开启日志记录,分析过程中所有输出会写入指定文件。参数说明里最需要注意的是log的replace选项,它允许覆盖已有日志文件;如果去掉replace,且该文件已存在,Stata 会报错终止运行。
运行 do 文件后,在结果窗口按Ctrl + L可以查看日志内容。日志文件保存为.smcl格式,可以用log close关闭。这里有个常见问题:日志文件路径如果写错,Stata 不会立刻报错,而是所有输出都“消失”了——其实它们是正常输出,只是没有显示在结果窗口,而是直接写入了日志文件。所以每次跑完长任务,先确认日志文件大小是否合理,比看结果窗口更可靠。
2.3 内存、路径和编码:三个最容易踩的配置坑
Stata 处理数据前会把数据全部读入内存,所以电脑内存大小直接决定能处理的数据量上限。执行set maxvar 10000可以调高变量个数上限,默认是 2048 个变量;如果数据有几千列,这条命令要放在use之前执行。路径分隔符在 Windows 上用正斜杠/更稳妥,Stata 也接受反斜杠,但正斜杠可以避免在字符串中把\d、\t解析成转义字符的问题。
中文数据导入后出现乱码,通常是编码问题。Stata 14 之前默认支持 GBK 编码,Stata 15 之后默认 UTF-8。如果导入 UTF-8 的 CSV 文件后中文乱码,可以用:
import delimited "D:/data/chinese_data.csv", encoding("utf-8")如果是旧版 Stata 文件(.dta)打开后乱码,执行unicode encoding set gb18030后重新use。这里要特别提醒:import delimited会自动识别分隔符和变量类型,但它默认把由数字组成的字符串(如身份证号)识别为数值,导致超长数字变成科学计数法。处理办法是导入时明确指定列类型:
import delimited "D:/data/id_list.csv", stringcols(1)stringcols参数后面跟列号,1 表示第一列按字符串导入,这样身份证号、编号类的数据不会被截断。
3. 从导入到清洗:Stata 数据操作要过的四个路口
3.1 导入数据:Excel 和 CSV 的无损进入
拿到原始数据最常见的形式是 Excel 或 CSV。导入 Excel 用import excel,可以把指定工作表或区域读入 Stata:
import excel "D:/data/survey.xlsx", sheet("Sheet1") firstrow clear逻辑说明:firstrow表示将 Excel 第一行作为变量名;如果没有该选项,Stata 会自动生成为 var1、var2 这样的变量名,后续用起来非常痛苦。clear的作用和use中的一样,如果内存里已有数据,必须加clear才能覆盖载入。参数说明:sheet指定工作表名称,若 Excel 文件里只有一张表可以省略;如果要导入特定区域,用cellrange(A1:F100)限定范围,这在处理带标题或备注的 Excel 表时很实用。
CSV 文件的导入用import delimited,前面已经提到过编码参数。导入后第一步建议执行:
describe它会列出所有变量的名称、存储类型和标签,让你在动手清洗前先确认导入结果是否符合预期。如果变量数量或类型和原表对不上,趁数据还没进入清洗阶段马上回头查导入参数。
3.2 变量重命名和类型转换:向 Stata 的“一列一类型”妥协
变量名是 Stata 命令的引用基础,命名不规范会让后面所有命令变得难写且易错。Stata 变量名只能由字母、数字和下划线组成,且必须以字母或下划线开头,不能包含中文。大量的 Excel 原始数据表里都是中文列名,导入后需要批量改名:
rename 姓名 name rename 年龄 age rename 收入 income如果列名有规律,可以用循环批量处理。比如列名是“x1, x2, x3…”,要改成“var1, var2, var3…”:
forvalues i = 1/10 { rename x`i' var`i' }这里的`i'是宏替换语法,循环执行 10 次改名操作。类型转换是另一个高频操作。destring命令可以把“看起来是数字”的字符型变量转成数值型:
destring income, replace forcereplace表示原位替换,生成新变量的写法是destring income, gen(income_num)。force选项让 Stata 忽略无法转换的值并赋为缺失值,但代价是那些没能转换的内容会被静默丢弃。我的习惯是:先用tab income看一下是否有字母或符号混入,确认后再决定是否加force。另一种方向是数值转字符串,用tostring:
tostring id, replace format(%06.0f)format参数把 id 从数值 1 格式化为“000001”,适合作业编号、病例编号等需要定长编号的场景。
3.3 缺失值和重复值:清洗的隐藏工作量
缺失值在 Stata 里用.表示,参与计算时会被自动排除。但实际数据里的缺失值常常不是空单元格,而是“NA”“NULL”“9999”这类占位符,它们会被当成真实数值参与计算,导致统计结果偏移。处理方式分两步:先把占位符替换为标准缺失值,再确认缺失比例。
replace income = . if income == 9999 misstable summarizemisstable summarize会输出每个变量的缺失值数量和缺失比例,是判断数据质量的最快命令。缺失比例超过三成的变量,在后续回归中要么剔除,要么做插补,不能直接丢进模型。重复值的处理用duplicates系列命令:
duplicates report id duplicates drop id, forcereport先报告哪些 id 有重复、重复了几次,确认无误后再执行drop;force是必需的,它的作用是告知 Stata 你确认要删除这些重复行。如果重复的判断依据是多个变量组合,把 id 换成多个变量名即可,例如duplicates drop id date, force。
3.4 生成新变量和标签:给数据创建可读性
数据分析的中间变量通常由已有变量计算而来,generate和replace是两类最常用的命令:
generate age_group = 1 if age < 30 replace age_group = 2 if age >= 30 & age < 50 replace age_group = 3 if age >= 50 label define agegroup 1 "30岁以下" 2 "30-49岁" 3 "50岁及以上" label values age_group agegroup逻辑说明:generate创建新变量,replace修改已有变量的部分值。&是“且”操作符,条件必须用括号包起来再拼接&。label define定义一组“值标签”,label values把它附着到对应变量上。加上值标签以后,tab age_group的输出直接显示年龄段的中文说明,而不是 1、2、3 这组数字,这在做数据报告时非常关键。变量本身的标签用:
label variable income "月收入(元)"这行指令在回归输出中会显示为表格的变量说明,比用英文字母变量名给业务方解释要省力得多。
3.5 数据合并与追加:关联的方式决定了结果的形状
多表合并是实际分析中绕不开的环节。Stata 的merge命令按关键变量把两个数据集关联起来,用1:1、1:m、m:1三种方式声明关联关系。比如给一个病例表关联患者的随访数据:
use "D:/data/patient.dta", clear merge 1:1 id using "D:/data/followup.dta"执行完merge后,Stata 会生成一个_merge变量,取值为 1(仅主表有)、2(仅次表有)、3(两边都有)。查看合并质量的命令是:
tab _merge如果选项 2 占比较高,说明次表里有大量主表匹配不上的记录,这时要检查 id 的编码格式是否一致——比如一张表是数值型 1001,另一张是字符型“1001”,merge 会全部匹配失败。追加数据的场景用append,把多张结构相同的表纵向堆叠:
append using "D:/data/survey_q2.dta"追加前最好用describe分别查看两张表的变量名和存储类型,Stata 合并时按变量名匹配,同名变量类型不一致会报错。一个跨表的合并问题常出现在“多对一”场景中:一张表是每个患者多条就诊记录,另一张表是每个患者一条基本信息。此时merge m:1 id会更合理,它能把基本信息表里的变量复制到每条就诊记录上,而不是惊悚地让就诊记录翻倍。
4. 从描述统计到回归建模:Stata 数据分析的完整命令链
4.1 描述统计:先看清楚自己的数据再谈建模
任何分析的第一步都是看清楚数据的分布形状和离散程度。summarize是最基础的描述统计命令:
summarize income age education_years输出四个统计量:观察值个数、均值、标准差、最小值和最大值。如果数据里有极端大或极端小的值,均值会被明显拉偏,这时用detail选项查看分位数分布:
summarize income, detail它会额外列出 1%、5%、10%、25%、50%、75%、90%、95%、99% 分位数,以及偏度和峰度。一个快速判断离群值的方法是:p99 和 p75 之间的距离如果是 p75 和 p50 之间距离的几倍以上,说明分布右尾较长,后面回归时可以考虑取对数或做缩尾处理。分组描述用tabstat:
tabstat income, by(age_group) stat(mean sd median p25 p75 n)by按分组变量输出统计量,stat指定需要哪些指标。这里输出的是不同年龄段收入的中位数和四分位数,比只看均值更能体现组间差异的真实情况。分组差异的显著性检验可以后续用ttest或ranksum补上。
4.2 t 检验和方差分析:比较差异是否显著的基本武器
两组均值比较用ttest,这是医学统计里最常见的场景之一:
ttest income, by(gender)by的变量必须是二分类变量,Stata 会自动按照 gender 的两个值分别计算均值和标准差,然后给出两组的均值差及 t 检验的 p 值。输出的核心看两点:一是Ha: diff != 0对应的 p 值,小于 0.05 认为两组均值有显著差异;二是置信区间是否包含 0,如果不包含 0 结论和 p 值一致。要注意ttest默认假设两组方差相等,如果方差不齐需要用 Welch 校正:
ttest income, by(gender) welch判断方差是否相等,先跑sdtest检验两组方差差异。多组比较用方差分析:
anova income age_groupanova后跟因变量和分组变量,结果中Prob > F小于 0.05 说明至少有一组的均值显著不同。但组间具体是谁和谁不同,anova本身不回答,需要追加事后检验:
pwmean age_group, mcompare(bonferroni)mcompare指定多重比较校正方法,Bonferroni 是医学论文里最常见的选项。如果在结果里看到总体 F 检验显著但事后检验组间差异都不显著,通常是样本量不够导致检验功效不足,这时不要强行解读组间差异,如实描述总体差异即可。
4.3 线性回归:把公式变成可解释的结果
线性回归是 Stata 进入建模阶段的起点。基础回归长这样:
regress income age education_years genderregress命令的写法是“因变量 + 一系列自变量”。结果窗口分三块:上方是方差分析表,中间是拟合优度 R²,下方是重点——每个自变量的回归系数、标准误、t 值和 p 值。系数解释的基准是:在其他变量固定的情况下,该变量每增加一个单位,因变量的平均变化量。模型比较的常见操作是把不同模型嵌套保存:
regress income age education_years est store m1 regress income age education_years gender est store m2 est table m1 m2, b(%9.3f) se(%9.3f) stats(N r2)逻辑说明:est store把当前回归结果暂存在内存中,之后可以用est table把多个模型并排输出成一张表。b(%9.3f)和se(%9.3f)分别设定系数和标准误显示为小数点后三位,stats(N r2)在表格底部输出样本量和 R²。这是论文和业务报告里“模型对比表”的标准制作流程,完成后可以直接用esttab m1 m2 using "D:/result/table2.rtf", replace输出为 Word 格式的表格。
回归里有一类经典错误是忘记处理分类变量。Stata 不会主动把 gender 这种取值 1/2 的变量识别为分类变量,而是当成连续数值处理,系数的解释就会变成“每增加一个单位性别,收入变化多少”,这没意义。正确做法是:
regress income age i.education_years i.genderi.前缀告诉 Stata 把后面的变量作为分类变量处理,会自动生成虚拟变量。回归后需要检查多重共线性:
estat vifvif 值大于 10 说明某个自变量可以被其他变量线性组合解释,此时需要删变量或者做中心化处理。还有一个常在结果里被忽略的指标是回归的标准误,数据量不大时建议加robust选项:
regress income age i.education_years, robust它对异方差不敏感,至少不会让标准误被低估。
4.4 结果输出:把 Stata 的结果搬进论文和报告的正确姿势
Stata 的结果窗口适合人看,不适合交付。把结果整理成干净表格的常见做法是借助esttab命令,它是外部命令,需要先安装:
ssc install estout安装完成后,上面构建好的多个模型可以一行输出到 Word:
esttab m1 m2 using "D:/result/reg_table.doc", replace /// b(3) se(3) star(* 0.05 ** 0.01) /// title("收入影响因素回归结果") /// mtitles("模型1" "模型2")参数说明:b(3)和se(3)控制系数和标准误的小数位数;star为不同显著水平指定星号标记;mtitles为每列加模型标题。输出的 Word 表格默认是纯文本格式,用rtf后缀可以保留字体和边框。描述统计的批量导出用tabstat加save选项不常用,更直接的是把统计结果输出到 Excel:
tabstat income age education_years, stats(mean sd median n) format(%9.2f) save matrix list r(Stat1) putexcel set "D:/result/desc.xlsx", replace putexcel A1 = matrix(r(Stat1)), names逻辑说明:tabstat执行后统计量存储在返回值里,matrix list可以查看;putexcel把矩阵写入 Excel 文件。这段操作的价值在于把描述统计表从“结果窗口截图”变成了可编辑的 Excel 数据,后续排版和二次加工都方便。整个过程里最容易被忽略的是在输出前确认变量标签和值标签已经设置好,因为esttab输出的表头直接使用变量标签,如果标签没设定,表格里就是一串 var1、var2 这种没有阅读性的变量名。
5. 用宏与循环把 Stata 从“操作”变成“工作流”,以及验证闭环
5.1 全局宏和局部宏:给重复代码一个持久的口径
宏是 Stata 里的变量系统,用来存储路径、变量名、参数等任意文本。局部宏用local定义,只在当前 do 文件中有效;全局宏用global定义,整个 Stata 会话都有效。实际写分析时,我更推荐局部宏,因为全局宏容易在多个 do 文件间互相污染。一个典型的用法是把变量列表提取出来,避免反复手打:
local controls "age education_years gender" regress income `controls' regress expense `controls'`controls'在命令执行时会被替换为age education_years gender的文本。这样当控制变量需要增删时,只改一行宏定义即可,所有相关回归自动同步。宏还能配合return list提取统计结果:跑完回归后,return list会显示所有存储在返回值里的数值,例如:
display "回归样本量: " e(N) display "R平方: " e(r2)e(N)和e(r2)是回归结果里保存的样本量和拟合优度,display命令可以实时查看。这在写自动化报告时很关键,可以把这些值嵌入自定义输出中,而不是手抄数字。
5.2 foreach 循环与分组分析的批量处理
做亚组分析时,最常见的需求是对不同分组分别跑同一套回归。手动复制粘贴代码改分组变量很容易漏改或者粘错,正确的做法是用foreach循环:
foreach g in 0 1 { regress income age education_years if gender == `g' est store subgroup_`g' } esttab subgroup_0 subgroup_1 using "D:/result/subgroup.doc", replace逻辑说明:循环体内的if gender == ``g'对每个分组子样本执行回归,est store将结果命名保存。循环结束后一次性输出两个分组的对比表。这里有一个细节:foreach遍历的是宏变量列表,元素之间用空格分隔;如果要分组的变量值较多(如 10 个省份),可以先提取取值再循环:
levelsof province, local(plist) foreach p of local plist { regress income age education_years if province == `p' }levelsof从数据中提取 province 的所有取值并存储到局部宏plist中,之后foreach逐个遍历。这种写法避免了手写 10 次相同回归,也减少了因一个取值拼写错误导致整个分析不一致的风险。网状 meta 分析这类需要在 Stata 中调用network系列外部命令的场景,也可以用同样的循环思路批量处理多个干预组的间接比较,核心都是把重复劳动交给循环,而不是逐条手敲。
5.3 最后的验证方法:结果回到原始数据去校对
自动化程度越高,越需要验证假设条件是否真的被代码落实了。一个可靠的验证闭环是这样的:循环回归跑完后,随机取一个亚组,手动执行一次不循环的回归,对比系数和标准误是否一致;再用count if gender == 1比较子样本量和回归输出中的 N 是否吻合。如果结果窗口显示 N=500,但count输出 550,说明if条件里可能有缺失值没被排除——Stata 回归会自动剔除因变量或自变量缺失的样本,而count不剔除,两者的差异正是缺失数据的位置。另一个快速验证是用predict生成拟合值再和观测值画散点图:
predict fitted scatter income fitted如果散点图有明显的曲线趋势,说明模型可能遗漏了非线性项。这两个检查做完,模型和分析结果才具备对外交付的基础。
本文还有配套的精品资源,点击获取