名师讲堂|使用 Stata 测算地区产业专业化指标

今天给大家分享使用 Stata 测算地区产业专业化指标的方法。该指标参考自杨本建、唐金汶(2022)《数字经济与区域产业布局》中的公式 (2),其思想源于 Kalemli-Ozcan et al. (2003) 与 Du et al. (2022) 的 Krugman 式专业化指数。

附件中提供了该参考文献的 PDF 文件(数字经济与区域产业布局.pdf),感兴趣的小伙伴可以阅读原文。

本文使用工商企业注册信息(已裁剪为测算所需的 9 个变量,置于 sample_data/ 文件夹),以 2000–2005 年为例,演示完整的 Stata 实现。对应思路亦可参考同一项目的 R 语言版本讲义。


指标来源与计算过程

地区产业专业化指数(公式)

行业范围:制造业 C13–C43,剔除 C39

按国民经济行业分类(GB/T 4754)的制造业门类,取 2 位行业大类代码 C13–C43,并剔除 C39(计算机、通信和其他电子设备制造业)。剔除 C39 的依据是论文第 248 页附录 1 的说明。

产业规模的代理变量

以企业的注册资本作为行业规模的代理变量(主指标);同时以企业数量作为稳健性口径。两者计算逻辑完全一致,仅在汇总时替换聚合字段。

存续企业的界定(进入与退出)

参考李磊等(2023)的做法,按“进入—退出”口径统计每年各城市各行业的存续企业:

  • 进入:以企业的成立年份作为进入年份;
  • 退出:当经营状态含“注销/吊销/异常”时视为退出企业,退出年份取核准日期的年份;
  • 存续:在年份 t 满足“成立年份 ≤ t,且(未退出 或 退出年份 > t)”的企业。

计算步骤概述

  1. 读取与清洗:读取各年工商注册数据,仅保留制造业、有效城市代码、必需变量,并界定进入/退出年份;
  2. 构建存续面板:对每个目标年份 t,筛选存活企业,按“城市 × 行业”汇总规模,得到城市×行业×年份存续企业规模面板;
  3. 计算专业化指数:对每一年,按公式计算各城市的 spec 指数(注册资本口径 + 企业数量口径);
  4. 输出与可视化:导出结果 dta,并绘制趋势、分布与 Top 城市等图表。

详细讲解计算代码(Stata)

0. 路径与参数

首先设定工程目录、输出目录、数据目录,以及制造业行业代码(正则形式)与所需变量。

*- ---- 0. 路径与参数 ----
cd "/Users/ac/Desktop/使用 Stata 测算地区产业专业化指标/"
global proj_dir = c(pwd)
global out_dir "${proj_dir}/输出"
global data_dir "${proj_dir}/sample_data"
cap mkdir "${out_dir}"

*- 目标年份
global file_years 2000 2001 2002 2003 2004 2005
global target_years 2000 2001 2002 2003 2004 2005

*- 制造业大类:C13-C43,剔除 C39(论文 248 页附录 1)
*- 用正则判定行业大类落在 C13-C43 且非 C39(C39 不列入 alternation 即被排除)
local mfg_pat "13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|40|41|42|43"
di "制造业大类正则(剔除 C39):^C(`mfg_pat')$"

上述代码中:

  • 脚本开头通过 cd “…” 切换到工程目录,再用 global proj_dir = c(pwd) 固定工程根目录,直接 do 运行即可,无需手动指定;
  • 制造业大类通过正则表达式 ^C(13|14|…|43)$ 判定(C39 不列入 alternation 即被排除);
  • 因 Stata 变量名须为 ASCII,CSV 按列位置导入(varnames(nonames)),并 drop in 1 删除中文表头行,再用 rename (v1 v2 … v9) 改为英文变量名。

1. 读取并清洗单个年份文件

import delimited 读取每年 CSV,仅保留制造业且大类在 C13–C43(非 C39)、城市代码为 6 位数字,解析进入/退出年份,并剔除关键指标缺失或逻辑异常样本;最后把各年合并为企业级长表并缓存为 dta。

*- ---- 1. 读取并清洗单个年份文件,合并为企业级长表 ----
cap use "${out_dir}/firms_manufacturing_2000_2005.dta", clear
if _rc != 0 {
tempfile all
local first = 1
foreach yr of global file_years {
di "读取 `yr'.csv ..."
import delimited using "${data_dir}/`yr'.csv", ///
varnames(nonames) encoding("utf-8") clear
drop in 1 // 删除中文表头行(varnames(nonames) 时首行被当作数据)
*- 原始 9 列依次为:注册 行业门类 行业大类代码 经营状态 成立年份 核准日期 市 市代码
rename (v1 v2 v3 v4 v5 v6 v7 v8 v9) ///
(cap_reg cap_paid ind_sector ind_code op_status entry_year_raw approve_date city city_code)
*- (1) 仅保留制造业,且大类在 C13-C43 且非 C39
keep if ind_sector == "制造业"
keep if regexm(ind_code, "^C(`mfg_pat')$")
*- (2) 城市代码有效(6 位数字行政区划码)
keep if regexm(city_code, "^[0-9][0-9][0-9][0-9][0-9][0-9]$")
*- 解析年份
destring entry_year_raw, replace
rename entry_year_raw entry_year
gen approve_year = real(substr(approve_date, 1, 4))
destring cap_reg cap_paid, replace ignore(",")
*- (3) 经营状态含"注销/吊销/异常" 视为退出企业
gen exited = (regexm(op_status, "销") | regexm(op_status, "退") | regexm(op_status, "异常"))
gen exit_year = .
replace exit_year = int(approve_year) if exited & !missing(approve_year)
*- (4) 剔除关键指标缺失、注册资本非正、退出早于成立
drop if missing(entry_year) | missing(cap_reg) | cap_reg <= 0
drop if !missing(exit_year) & exit_year < entry_year
*- 仅保留需要的变量
keep city_code city ind_code entry_year exit_year cap_reg cap_paid
if `first' == 1 {
save `all', replace
local first = 0
}
else {
append using `all'
save `all', replace
}
}
di "清洗后制造业企业记录:`=_N' 条"
save "${out_dir}/firms_manufacturing_2000_2005.dta", replace
}
else {
di "复用已存在的 firms_manufacturing_2000_2005.dta,共 `=_N' 条"
}

要点:

  • keep if ind_sector == “制造业” 与 keep if regexm(ind_code, “^C(mfg_pat’)$”)` 完成行业筛选;
  • regexm(op_status, “销”) | regexm(op_status, “退”) | regexm(op_status, “异常”) 判定退出企业;
  • drop if missing(entry_year) | missing(cap_reg) | cap_reg <= 0 与 drop if !missing(exit_year) & exit_year < entry_year 剔除无效/异常样本。

2. 构建 城市×行业×年份 存续企业规模面板

对目标年份 t 筛选“存续企业”(成立年份 ≤ t,且未退出或退出年份 > t),按城市 × 行业汇总该年注册资本总额(output_reg)与企业数(n_firm),逐年份 append 后得到城市×行业×年份面板。

*- ---- 2. 构建 城市×行业×年份 存续企业规模面板 ----
*- 此处代码需要下载讲义材料查看~

3. 计算 Krugman 式地区产业专业化指数

对某一年的城市×行业规模数据,计算各城市专业化指数。核心逻辑:

  1. 求各城市该口径总规模 city_total,并计算各行业份额 share;
  2. 通过 cross 补全“城市 × 行业”全网格,该城市该行业无企业时份额记为 0;
  3. 对每个行业求全部城市份额之和 sum_share,则“其他城市平均份额”为 (sum_share - share)/(J-1);
  4. 计算差的平方 (share - other_avg)^2,跨行业求和即得该城市 spec。

注册资本(output_reg)与企业数(n_firm)两个口径分别循环计算后合并。

*- ---- 3. 计算 Krugman 式地区产业专业化指数 ----
*- 此处代码需要下载讲义材料查看~

合并结果并预览

*- 合并两个口径的结果
use "${out_dir}/spec_spec_reg.dta", clear
merge 1:1 year city_code using "${out_dir}/spec_spec_count.dta", keep(3) nogenerate
keep year city_code city n_city spec_reg spec_count
sort year city_code
save "${out_dir}/地区产业专业化指数_2000_2005.dta", replace
di "步骤 4/4:输出结果 ……"

*- 各年城市数 J
di "各年城市数(J):"
tabstat n_city, by(year) stat(mean) format(%9.0f) nototal

*- 结果预览:2005 年专业化程度最高的 10 个城市
di "2005 年产业专业化指数最高的 10 个城市:"
use "${out_dir}/地区产业专业化指数_2000_2005.dta", clear
keep if year == 2005
gsort -spec_reg
list city spec_reg spec_count in 1/10, noobs
di "完成!结果已写入:${out_dir}"

运行结束后,输出/地区产业专业化指数_2000_2005.dta 包含变量:year, city_code, city, n_city, spec_reg, spec_count。


结果预览

下面用 R 的 haven 包读取 Stata 输出的 dta,展示 2005 年专业化指数最高的若干城市,便于核对(R 仅用于读表与制表,核心测算由上面的 Stata 代码完成)。

spec <- read_dta(file.path(out_dir, "地区产业专业化指数_2000_2005.dta"))
spec <- spec |>
mutate(across(c(spec_reg, spec_count, n_city), as.numeric))

spec |>
filter(year == 2005) |>
slice_max(spec_reg, n = 15) |>
select(year, city, n_city, spec_reg, spec_count) |>
knitr::kable(digits = 4,
caption = "2005 年产业专业化指数最高的 15 个城市(Stata 测算结果)")

插图

数据可视化(Stata)

结果可视化由 02_可视化.do 完成,使用 Stata 的 twoway / graph box / graph hbar 绘制三张图表。

cd "/Users/ac/Desktop/使用 Stata 测算地区产业专业化指标/"
global proj_dir = c(pwd)
global out_dir "${proj_dir}/输出"
cap mkdir "${out_dir}"

use "${out_dir}/地区产业专业化指数_2000_2005.dta", clear

*- ---- 图1:各城市平均专业化指数随年份变化趋势 ----
*- 此处代码需要下载讲义材料查看~

*- ---- 图2:各年专业化指数分布(箱线图) ----
graph box spec_reg, over(year) ///
ytitle("产业专业化指数 spec") ///
title("各年份城市产业专业化指数分布 (2000-2005)") ///
subtitle("箱线图展示全部城市的专业化指数分布及其演变") ///
note("数据处理 & 绘图:微信公众号 RStata") ///
ylabel(,format(%6.1f))
graph export "${out_dir}/图2_专业化指数分布.png", replace width(2000) height(1200)

*- ---- 图3:2005 年专业化程度最高的 20 城市 ----
*- 此处代码需要下载讲义材料查看~

di "三张图表已导出至:${out_dir}"

图1:各城市平均专业化指数随年份变化趋势

图2:各年专业化指数分布(箱线图)

图3:2005 年专业化程度最高的 20 城市

点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 Stata 测算地区产业专业化指标

评论