适用课程:《农村金融业务及监管》(农村发展专业硕士) 适用人群:没有系统学过计量经济学、不会写 Stata 代码,但需要完成实证分析的研究生 核心理念:你负责研究问题与结果解读,AI 负责翻译 Stata 命令
前置要求
在开始之前,请确认以下环境已就绪:
| 项目 | 要求 | 检查方法 |
|---|---|---|
| Stata 版本 | 17 或以上 | 打开 Stata → 菜单栏 Help → About Stata |
| stata-mcp 已配置 | Qoder 中可调用 stata-mcp | 在 Qoder 对话框输入"帮我用 Stata 打开一个数据"看是否响应 |
| 测试数据集 | CFPS2018 子集(教学用) | 课程群文件下载 CFPS2018_teaching.dta |
| 英文变量对照表 | 变量名→含义映射 | 课程群文件下载 CFPS2018_codebook.xlsx |
没有 Stata 许可证? 跳到底部「Python 备选方案」章节,每步都提供了 statsmodels/linearmodels 等价命令。
学习路径图
┌─────────────────────────────────────────────────────┐
│ 基础段(约 1 小时) │
│ Step 1 数据导入 → Step 2 描述统计 → Step 3 可视化 │
│ 目标:能打开数据、看懂变量、画出第一张图 │
├─────────────────────────────────────────────────────┤
│ 核心段(约 30 分钟)⭐ │
│ Step 4 基本回归(OLS + 聚类标准误) │
│ 目标:跑出第一张回归表、看懂系数和星号 │
├─────────────────────────────────────────────────────┤
│ 进阶段(约 1 小时)⭐⭐ │
│ Step 5 内生性处理(IV/2SLS)→ Step 6 异质性+稳健性 │
│ 目标:理解因果推断逻辑、完成完整的实证分析闭环 │
└─────────────────────────────────────────────────────┘建议按顺序完成 Step 1-4 后再进入 Step 5-6。每步的 Prompt 可直接复制粘贴到 Qoder 对话框。
Step 1:数据导入 ⏱ 10 分钟 | 难度 ★☆☆
自然语言 Prompt
把这份 Excel 文件 'CFPS2018.xlsx' 转成 Stata 格式,Sheet1,
变量名标准化为英文小写下划线命名。Stata 命令
import excel "CFPS2018.xlsx", sheet("Sheet1") firstrow clear
rename (var1 var2 var3) (id income digital_finance)
destring income, replace force
save "data.dta", replace结果解读
- 导入成功提示:
N=1234,表示 1234 条观测值已进入内存 - 变量列表:
id(家庭编号)、income(年收入)、digital_finance(数字金融使用指数)等 - 缺失率:检查
misstable summarize,低于 5% 可接受,高于 10% 需要审慎处理 destring后检查:codebook income确认数值型,不应有字母混入
常见报错与排错
报错 1:文件路径含中文或空格
file not found: /Users/张三/课件 资料/CFPS2018.xlsx排错:Stata 对中文路径和空格敏感。解决方案——将数据文件移动到纯英文路径(如 D:/data/),或在路径中使用双引号包裹。macOS 用户可把文件放到 ~/Documents/data/ 下。
报错 2:变量名乱码
import 后变量名显示为 v1, v2, v3 或乱码方块排错:Excel 首行不是标准变量名,或包含合并单元格。解决——打开 Excel 确认第一行是干净的英文变量名(无空格、无特殊字符),删除合并单元格后重新导入。
报错 3:destring 失败
income: contains nonnumeric characters; no replace排错:数据列混入了文字(如"缺省""NA")。解决——先 tab income 查看异常值,再用 destring income, replace force(force 会将非数值强制转为缺失值),或 replace income = "" if income == "NA" 先清洗再转换。
Skill 化提示词模板
【背景】我有一份 {数据格式} 格式的数据文件,存放于 {文件路径}。
【输入】文件名:{filename},工作表:{sheet_name},第一行为变量名。
【期望输出】
1. 导入 Stata 并自动识别变量名
2. 将所有变量名转为英文小写下划线命名
3. 数值型变量强制转换(非数值标记为缺失)
4. 保存为 .dta 格式到 {输出路径}
【环境检查】确认 Stata 版本≥17,文件路径无中文/空格
【回退方案】若 destring 报错,先 tab 检查异常值再 force 转换Step 2:描述统计 ⏱ 10 分钟 | 难度 ★☆☆
自然语言 Prompt
对所有变量做描述统计,按城乡分组(变量 urban: 0=农村, 1=城镇),
输出到 Word 表格。Stata 命令
* 全样本描述统计
estpost summarize income digital_finance age education, detail
esttab using "desc.doc", cells("count mean sd min max") replace
* 按城乡分组
estpost summarize income digital_finance, by(urban)
esttab using "desc_by.doc", cells("count mean sd") replace
* 均值差异 t 检验
ttest income, by(urban)
ttest digital_finance, by(urban)结果解读
- 均值(mean):变量的平均水平。如农村组
digital_finance均值 0.34,表示农村农户数字金融使用率约 34% - 标准差(sd):数据的离散程度,标准差越大说明个体差异越大
- t 检验 p 值:p<0.05 表示两组差异在统计上显著。如城乡数字金融使用差异 t=12.4, p<0.01,说明城镇显著高于农村
- 输出到 Word:
esttab生成的.doc文件可直接在 Word 中打开并粘贴到论文中
常见报错与排错
报错 1:变量类型不匹配
type mismatch排错:urban 变量可能是字符串类型而非数值型。解决——destring urban, replace,或检查 codebook urban 确认类型。如果原始编码是"农村""城镇"文本,需要先 encode urban, gen(urban_num) 转为数值。
报错 2:esttab 命令不存在
unrecognized command: esttab排错:esttab 属于 estout 包,需手动安装。执行 ssc install estout, replace,安装后重新运行即可。
报错 3:Word 文件打不开
esttab 输出的 .doc 文件在 Word 中格式错乱排错:esttab 输出的并非标准 .docx 格式。解决——改用 esttab using "desc.rtf", replace(RTF 格式 Word 兼容性更好),或输出 .tex 后在 LaTeX 中编译。
Skill 化提示词模板
【背景】已完成数据导入,当前 Stata 内存中有 {N} 条观测、{K} 个变量。
【输入】核心变量列表:{var_list},分组变量:{group_var}(取值含义:{取值说明})。
【期望输出】
1. 全样本描述统计表(N、均值、标准差、最小值、最大值)
2. 按 {group_var} 分组的描述统计表
3. 组间均值差异 t 检验结果
4. 输出为 Word/RTF 格式文件
【环境检查】确认 estout 包已安装(ssc install estout)
【回退方案】若 esttab 不可用,改用 summarize + logout 输出Step 3:可视化 ⏱ 10 分钟 | 难度 ★☆☆
自然语言 Prompt
画一张数字金融使用的直方图,按城乡分组叠加,
再画一张散点图看收入和数字金融的关系。Stata 命令
* 直方图——按城乡分组
histogram digital_finance, by(urban) normal
graph save "hist.gph", replace
graph export "hist.png", width(1200) replace
* 散点图+线性拟合——按城乡分组
twoway (scatter income digital_finance) (lfit income digital_finance), by(urban)
graph save "scatter.gph", replace
graph export "scatter.png", width(1200) replace
* 相关系数矩阵
pwcorr income digital_finance age education, star(0.05) sig结果解读
- 直方图:观察分布形状。右偏说明多数人数字金融使用率低,少数人使用率很高
- 散点图:每个点代表一个观测。如果点从左下到右上分布,说明正相关
- 拟合线(lfit):蓝色直线的斜率方向反映相关方向。城镇组斜率更陡说明关系更强
- 相关系数:0.42(p<0.01)表示中等程度正相关,具有统计显著性
常见报错与排错
报错 1:图形中文显示乱码/方块
图中的中文标题、坐标轴标签显示为方块 □□□排错:Stata 默认字体不包含中文字符。解决——在画图前设置中文字体:
graph set window fontface "STSong" // macOS 宋体
* 或
set scheme s1mono // 切换到纯英文标注方案报错 2:中文字体缺失(Windows 系统)
font "STSong" not found排错:Windows 系统没有 STSong 字体。解决——改用 graph set window fontface "SimSun"(宋体)或 graph set window fontface "Microsoft YaHei"(微软雅黑)。
报错 3:graph export 输出模糊
导出的图片分辨率太低,论文中看不清排错:默认分辨率不足。解决——加 width(1200) 或 width(2400) 参数,或使用 graph export "fig1.pdf", replace(矢量图,论文投稿首选)。
Skill 化提示词模板
【背景】已完成描述统计,需要对核心变量做可视化展示。
【输入】目标变量:{var_list},分组变量:{group_var}。
【期望输出】
1. {变量A} 的直方图(按 {group_var} 分面)
2. {变量A} 与 {变量B} 的散点图+线性拟合线
3. 相关系数矩阵(含显著性星号)
4. 所有图导出为 PNG(1200px 宽)和 PDF(矢量)
【环境检查】确认中文字体已配置(graph set window fontface)
【回退方案】若中文乱码,改用英文标注或 s1mono schemeStep 4:基本回归 ⏱ 20 分钟 | 难度 ★★☆ ⭐ 核心步骤
自然语言 Prompt
用 OLS 回归 income_log = digital_finance + 控制变量(age, education, land_size),
聚类稳健标准误到县级。Stata 命令
* 生成对数收入变量
gen income_log = ln(income)
* OLS 回归 + 聚类标准误
reg income_log digital_finance age i.education i.land_size, vce(cluster county_id)
* 输出回归表
eststo ols1
esttab ols1 using "reg1.doc", b(%9.3f) se(%9.3f) star(* 0.1 ** 0.05 *** 0.01) replace
* 检查多重共线性
vif结果解读
- 系数(coef/b):
digital_finance系数 0.234*** 表示数字金融使用每提高 1 单位,收入提高约 23.4%(因为因变量取了对数,系数可近似解读为百分比变化) - 星号含义:*** p<0.01(99% 置信度),** p<0.05,* p<0.1。没有星号说明不显著
- 标准误(se):系数下方的括号数字,越小越精确。聚类标准误比普通标准误更大更保守
- R²:模型解释力,0.15-0.30 在微观调查中属正常范围
- vif:方差膨胀因子,大于 10 说明存在严重多重共线性需要处理
- i.education:
i.前缀表示将变量作为分类变量处理(虚拟变量), education 的不同取值会自动生成虚拟变量
常见报错与排错
报错 1:多重共线性警告
note: land_size omitted because of collinearity排错:某个控制变量与其他变量高度相关被 Stata 自动剔除。解决——先跑 vif 查看方差膨胀因子,如果 vif>10,考虑删除该变量或合并相关变量。也可用 corr 查看变量间相关矩阵。
报错 2:聚类标准误报错
insufficient observations for cluster robust estimation
number of clusters (45) insufficient; minimum is 50排错:聚类单元(县)数量太少(经验法则至少 42-50 个聚类)。解决——尝试更高层级聚类(如 vce(cluster province_id)),或使用 wildbootstrap 方法(ssc install wildbootstrap)进行小样本修正。
报错 3:对数变换报错
income_log = ln(income) 出现 missing values排错:income 中有 0 或负值。解决——使用 gen income_log = ln(income + 1)(加 1 取对数),或先 drop if income <= 0 剔除异常值后在论文中说明。
Skill 化提示词模板
【背景】研究问题——{X} 对 {Y} 的影响。理论假设:{X} 正向/负向影响 {Y}。
【输入】
- 因变量:{Y}(处理:{是否取对数/标准化})
- 核心自变量:{X}
- 控制变量:{controls_list}
- 聚类层级:{cluster_var}(共 {N_cluster} 个聚类单元)
【期望输出】
1. OLS 回归表(系数+聚类标准误+显著性星号)
2. VIF 多重共线性检查
3. 样本量、R²、F 统计量
【环境检查】确认聚类数≥50,因变量无 0/负值(若取对数)
【回退方案】若聚类数不足,改用 wildbootstrap 或聚类到更高层级Step 5:内生性处理 ⏱ 20 分钟 | 难度 ★★★ ⭐⭐
自然语言 Prompt
担心反向因果(高收入农户更倾向使用数字金融)和遗漏变量(家庭偏好),
请用工具变量法,工具变量是同村其他农户的平均数字金融使用。Stata 命令
* 构造工具变量:同村其他农户的平均数字金融使用
bysort village_id: egen iv_village = mean(digital_finance)
* 更精确:剔除自身后的同村均值
bysort village_id: egen total_df = sum(digital_finance)
gen iv_village = (total_df - digital_finance) / (_N - 1)
* 2SLS 回归
ivregress 2sls income_log (digital_finance = iv_village) age i.education i.land_size, vce(cluster county_id)
* 第一阶段检验
estat firststage
* 过度识别检验(仅当工具变量数>内生变量数时可用)
estat overid
* 输出回归表
eststo iv1
esttab iv1 using "reg2.doc", replace结果解读
- 第一阶段 F 值:F=18.5 > 10(Stock-Yogo 弱工具变量临界值),说明工具变量与内生变量相关性强,不是弱工具
- 第二阶段系数:0.412 > OLS 的 0.234,说明 OLS 低估了真实效应(存在反向因果导致的向下偏估)
- 经济学含义:修正内生性后,数字金融使用每提高 1 单位,收入提高约 41.2%
- 过度识别 Sargan/Hansen 检验:p>0.1 说明不能拒绝"工具变量外生"的原假设,工具变量有效
常见报错与排错
报错 1:弱工具变量(第一阶段 F<10)
First-stage F statistic = 3.2, suggesting weak instruments排错:工具变量与内生变量相关性太弱。解决——(1)换一个更强的工具变量;(2)增加工具变量数量;(3)使用有限信息最大似然估计 ivregress liml,它对弱工具更稳健;(4)在论文中诚实报告弱工具问题并讨论偏误方向。
报错 2:过度识别检验不通过
Sargan-Hansen test: chi2 = 15.3, p = 0.002排错:p<0.05 拒绝原假设,说明至少有一个工具变量不满足外生性条件。解决——(1)删除可疑的内生工具变量,减少工具变量数;(2)重新审视工具变量的排他性约束(该工具变量是否真的只通过 X 影响 Y?);(3)在论文中讨论并做敏感性分析。
报错 3:ivregress 命令不存在
unrecognized command: ivregress排错:Stata 17 内置 ivregress,但旧版可能需要安装。解决——ssc install ivreg2, replace(ivreg2 是增强版,功能更全),或使用 ssc install ivregress。
Skill 化提示词模板
【背景】在 Step 4 的 OLS 基础上,担心存在 {内生性来源}(如反向因果/遗漏变量)。
【输入】
- 内生变量:{X}
- 工具变量:{IV},选择理由:{排他性约束论证}
- 控制变量与聚类层级同 Step 4
【期望输出】
1. 构造工具变量(如同村均值/剔除自身后的 leave-one-out 均值)
2. 2SLS 回归结果
3. 第一阶段 F 统计量(弱工具检验,临界值 10)
4. 过度识别检验(若工具变量数>1)
5. 与 OLS 系数的对比讨论
【环境检查】确认工具变量与内生变量的理论关系有文献支撑
【回退方案】若 F<10,改用 LIML 或报告弱工具偏误方向;若过度识别不通过,删除可疑 IVStep 6:异质性 + 稳健性 ⏱ 20 分钟 | 难度 ★★★ ⭐⭐⭐
自然语言 Prompt
分东中西三组回归看异质性,并替换被解释变量为 income_rate 检验稳健性。Stata 命令
* 定义控制变量全局宏(简化后续命令)
global controls "age i.education i.land_size"
* 异质性分析:分东中西三组
eststo m1: reg income_log digital_finance $controls if east==1, vce(cluster county_id)
eststo m2: reg income_log digital_finance $controls if east==2, vce(cluster county_id)
eststo m3: reg income_log digital_finance $controls if east==3, vce(cluster county_id)
esttab m1 m2 m3 using "hetero.doc", replace
* 组间系数差异检验(Chow 检验近似)
suest m1 m2 m3
test [m1_mean]digital_finance = [m2_mean]digital_finance
* 稳健性检验:替换被解释变量
gen income_rate = income / household_income
eststo n1: reg income_rate digital_finance $controls, vce(cluster county_id)
esttab n1 using "robust.doc", replace
* 稳健性检验:缩尾处理后重新回归
winsor2 income_log digital_finance, cuts(1 99) replace
eststo n2: reg income_log digital_finance $controls, vce(cluster county_id)
esttab n2 using "robust2.doc", replace结果解读
- 异质性:东部系数 0.45***,中部 0.28**,西部 0.08(不显著)——数字金融增收效应存在区域差异,东部最强,西部不显著,可能原因是数字基础设施差距
- 组间差异检验:suest + test 的 p 值若<0.05,说明东中西系数差异在统计上显著
- 稳健性:替换被解释变量后系数在 0.21-0.27 区间稳定,说明结论不依赖于特定指标定义
- 缩尾处理:1%/99% 缩尾后系数变化不大,说明极端值没有驱动结果
常见报错与排错
报错 1:分组后样本量不足
insufficient observations排错:某一分组(如西部)样本量太少。解决——(1)用 tab east 检查各组样本量,少于 30 的组考虑合并(如"中西部合并");(2)在论文中注明该组样本量不足的局限。
报错 2:suest 命令报错
suest: model m1 was not found排错:eststo 存储的名称在 suest 中无法直接调用。解决——使用 reg ... if east==1 后 estimates store m1(注意不是 eststo),suest 需要 estimates store 的名称。
报错 3:替换变量无法获取
household_income not found排错:数据集中没有这个变量名。解决——检查 describe 输出,确认变量名。有时变量名不同(如 hh_income 或 total_income),需要根据实际 codebook 调整。
Skill 化提示词模板
【背景】Step 4-5 已获得基准结果,需要检验结论的边界条件和稳健性。
【输入】
- 异质性分组变量:{group_var}(取值:{取值含义})
- 替换被解释变量:{alt_Y}(构造方法:{如何计算})
- 缩尾比例:{1%/5%}
【期望输出】
1. 分组回归表(并列展示各子样本系数+显著性)
2. 组间系数差异检验(Chow/suest test)
3. 替换被解释变量的稳健性回归表
4. 缩尾处理后的稳健性回归表
5. 一段文字总结:哪些结论稳健、异质性发现
【环境检查】确认各组样本量≥30,变量名与 codebook 一致
【回退方案】若某组样本量不足,合并相邻组并说明Python 备选方案(无 Stata 许可证的同学)
每步对应的 Python 等价实现(使用 statsmodels + linearmodels):
Step 1 数据导入
import pandas as pd
df = pd.read_excel("CFPS2018.xlsx", sheet_name="Sheet1")
df.columns = df.columns.str.lower().str.replace(" ", "_")
df["income"] = pd.to_numeric(df["income"], errors="coerce")
df.to_stata("data.dta", write_index=False) # 可选:保存为 Stata 格式Step 2 描述统计
print(df[["income", "digital_finance", "age", "education"]].describe())
# 分组统计
print(df.groupby("urban")[["income", "digital_finance"]].agg(["mean", "std", "count"]))
# t 检验
from scipy.stats import ttest_ind
rural = df[df["urban"]==0]["income"].dropna()
urban = df[df["urban"]==1]["income"].dropna()
print(ttest_ind(rural, urban))Step 3 可视化
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams["font.sans-serif"] = ["SimHei"] # 中文字体
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
for u, label in [(0, "农村"), (1, "城镇")]:
df[df["urban"]==u]["digital_finance"].hist(ax=axes[0], alpha=0.5, label=label, bins=30)
axes[0].legend()
sns.regplot(data=df, x="digital_finance", y="income", ax=axes[1])
plt.tight_layout()
plt.savefig("fig1.png", dpi=300)Step 4 基本回归
import numpy as np
import statsmodels.api as sm
from statsmodels.iolib.summary2 import summary_col
df["income_log"] = np.log(df["income"] + 1)
controls = ["digital_finance", "age"] + [f"edu_{i}" for i in [1,2,3]]
X = sm.add_constant(df[controls].dropna())
y = df["income_log"].dropna()
# 对齐索引
X = X.loc[y.index]
model = sm.OLS(y, X).fit(cov_type="cluster", cov_kwds={"groups": df.loc[y.index, "county_id"]})
print(model.summary())Step 5 内生性处理
from linearmodels.iv import IV2SLS
# 构造工具变量
iv = df.groupby("village_id")["digital_finance"].transform("mean")
df["iv_village"] = (df.groupby("village_id")["digital_finance"].transform("sum") - df["digital_finance"]) / \
(df.groupby("village_id")["digital_finance"].transform("count") - 1)
mod = IV2SLS(df["income_log"], sm.add_constant(df[["age", "education", "land_size"]]),
endog=df["digital_finance"], instruments=df[["iv_village"]])
result = mod.fit(cov_type="clustered", clusters=df["county_id"])
print(result.summary)
print("First-stage F:", result.first_stage.f_statistic)Step 6 异质性 + 稳健性
# 分组回归
results = {}
for region, label in [(1, "东部"), (2, "中部"), (3, "西部")]:
sub = df[df["east"] == region]
X = sm.add_constant(sub[controls])
y = sub["income_log"]
X = X.loc[y.index]
results[label] = sm.OLS(y, X).fit(cov_type="cluster",
cov_kwds={"groups": sub.loc[y.index, "county_id"]})
print(f"{label}: coef={results[label].params['digital_finance']:.3f}")
print(summary_col(list(results.values()), stars=True))进一步学习资源
| 资源 | 说明 | 适合阶段 |
|---|---|---|
| UCLA Stata 教程 | 最全面的 Stata 在线参考 | Step 1-6 全程 |
| Stata 官方手册 | 每个命令的详细参数说明 | 遇到报错时查阅 |
| Bhattacherjee《社会科学研究》 | 研究设计与方法论基础 | 研究设计阶段 |
| 伍德里奇《计量经济学导论》 | 经典计量教材(中文第 7 版) | 想深入理解原理时 |
| statsmodels 文档 | Python 计量经济学库 | Python 备选方案 |
| linearmodels 文档 | Python IV/Panel 模型 | Step 5 Python 备选 |
课程群文件 CFPS2018_codebook.xlsx | 变量名-含义对照表 | Step 1 开始就需要 |
AI 工具使用声明提醒
完成六步急救包后,在论文中务必加入 AI 工具使用声明:
本研究使用 stata-mcp 辅助生成 Stata 命令。
研究设计、模型选择、变量构造、结果解读均由作者独立完成。
所有数据分析和统计推断结论由作者负责。核心原则:AI 降低技术门槛,但不替代你的研究判断。你必须能说清楚每一步为什么这样做。
Generated by Qoder with 肖诗顺 | 2026-09-14