今天给大家分享使用 Stata 测算各城市数字产业集聚程度的方法。该方法参考屠西伟、史丹(2025)《数字产业集聚与企业能源效率改进》,通过区位熵来综合测度城市的数字产业集聚水平。
附件中提供了该参考文献的 PDF 文件,感兴趣的小伙伴可以阅读原文。
指标来源与计算原理
数字产业集聚度(Location Quotient)
![]()
区位熵的经济含义
- DL > 1:该城市数字产业集聚度高于全国平均水平,具有相对专业化优势
- DL = 1:与全国平均水平相当
- DL < 1:低于全国平均水平
两种测算方法
本文介绍两种测算方式,主要区别在于分子分母的衡量单位不同:
| 方法 | Xct | Sct | 优点 | 局限 |
|---|---|---|---|---|
| 注册资本版(论文方法) | 数字产业注册资本(万元) | 全部企业注册资本(万元) | 反映资本密度,与论文一致 | 大城市分母稀释效应明显 |
| 企业数量版(备选方法) | 数字产业企业数量(家) | 全部企业数量(家) | 不受极值影响,城市间对比更直观 | 无法区分大企业与小企业的贡献 |
计算步骤概述
整个计算流程分为以下几个步骤:
- 读取行业分类:加载《数字经济及其核心产业统计分类(2021)》代码表
- 构建注销查找表:从注销企业 CSV 中提取 newgcid → exit_year 映射
- 单年聚合:逐年读取注册企业 CSV,先过滤已注销企业,再按城市聚合
- 面板累计:跨年累加,得到各城市各年的存量企业指标
- 计算区位熵:按公式计算 DL,并进行 Winsorize 极端值处理
- 输出结果:保存为 .dta 文件
数据说明
数据来源
- 工商注册信息:
1949~2023 年工商企业注册信息数据(含经纬度及其所属的省市区县)(版本2):https://rstata.duanshu.com/#/brief/course/6d38a3f10cdb467492f3204d1ebdd313
- 注销企业信息:
1970~2023 年各年各省市区县、各行业注销公司工商信息及数量统计面板数据:https://rstata.duanshu.com/#/brief/course/bcdf21ad0e614645b8449e69342e0851
- 数字经济核心产业分类:数字经济及其核心产业统计分类.dta,提取自《数字经济及其核心产业统计分类(2021)》。
注销企业处理逻辑
本文采用个体层面过滤的方法处理注销企业:
第 t 年存量企业 = t 年及之前注册的 且 t 年及之前未注销的企业
具体实现:预先从注销企业 CSV 提取 newgcid → exit_year 查找表,在每年聚合前关联该表,直接过滤掉 exit_year <= t 的企业,再对存活企业进行聚合。
Stata 环境准备
Stata 代码通过 .do 文件执行。完整脚本见 计算数字产业集聚度_企业数量版.do 和 计算数字产业集聚度_注册资本版.do。
路径与参数配置
*- 参数设置 |
其中:
- year_min / year_max:控制计算年份范围,便于缩小到示例数据快速验证
- dir_reg / dir_exit:注册和注销 CSV 所在目录
- dta_file:数字经济产业分类标准 DTA 文件
步骤一:读取数字经济产业行业代码
加载分类标准
use "`dta_file'", clear |
《数字经济及其核心产业统计分类(2021)》使用 4 位行业代码,而工商注册信息 CSV 中的行业代码字段格式为 I641(中类)或 I6411(小类),均带有字母前缀。
代码的匹配策略如下:
| 行业字段 | 提取规则 | 与分类标准对比 |
|---|---|---|
行业小类代码(4位数字) |
substr(code, 2, 4) |
与 digi_codes_4d 精确匹配 |
行业中类代码(3位数字) |
substr(code, 2, 3) |
与 digi_prefixes 前缀匹配 |
步骤二:构建注销查找表
注销企业处理是整个计算中最关键的一步。
预构建查找表
local exit_files: dir "`dir_exit'" files "*.csv" |
代码要点:
- import delimited …, encoding(“UTF-8”) clear stringcols(_all):以纯字符读取 CSV,避免编码问题
- cap confirm variable:容错检查,跳过缺少必要列的文件
- bysort newgcid (exit_year): keep if _n == 1:每个企业只保留最早的注销年份(一次注销即永久退出)
- 与 R 版的区别:Stata 没有多线程,但使用 duplicates drop 在逐文件加入时就做去重
步骤三:单年聚合函数
这是计算流程的核心步骤,逻辑为:读取 CSV → 过滤注销 → 企业缩尾(注册资本版)→ 行业识别 → 按城市聚合。
注册资本版与企业数量版的唯一区别在于:注册资本版在聚合前需做企业层面 Winsorize,企业数量版(计数)无需缩尾。以下以企业数量版为例说明。
*- 此处代码需下载讲义材料查看~
六个步骤解析:
| 步骤 | 核心 Stata 代码 | 说明 |
|---|---|---|
| ① 读取 | import delimited ..., keep |
只保留必要列,节省内存 |
| ② 过滤注销 | keep if mi(exit_year) | exit_year > \yr’` |
mi(exit_year) 表示未注销;> yr 表示当年尚未注销 |
| ③ 小类匹配 | merge m:1 ind_4 using \digi_codes_4d’` |
优先精确匹配4位小类代码 |
| ④ 中类匹配 | merge m:1 ind_3 using \digi_prefixes’` |
兜底匹配3位中类代码 |
| ⑤ 综合判定 | is_digi = is_digi_4 | is_digi_3 |
两次匹配取并集 |
| ⑥ 聚合 | collapse (sum) ..., by(city_code) |
按城市加总 |
步骤四:构建面板与计算累计存量
注册数据是流量(某年新注册的企业),而区位熵需要存量(截至该年仍存活的企业总量)。由于已在聚合前过滤了注销企业,这里只需按城市做累计加总即可。
*- 此处代码需下载讲义材料查看~
关键命令对照:
| Stata 代码 | 含义 |
|---|---|
fillin city_code year |
补齐城市×年份的完整面板,等价于 R 的 CJ(city_code, year) |
bysort city_code: gen ... = sum(...) |
按城市分组逐年累加,等价于 R 的 cumsum(...), by = city_code |
步骤五:计算区位熵与极端值处理
计算 DL
*- 此处代码需下载讲义材料查看~
egen ... = total(...), by(year) 按年份做全国汇总,Stata 语法简洁直观。
Winsorize 处理极端值
本项目采用两层 Winsorize 策略:
- 企业层面(步骤三已完成):对每个年份内的企业注册资本做 5%/95% 截断,防止单个天价壳公司拉偏城市存量
- 城市层面:对最终 DL 指标做 5%/95% 截断,控制区位熵测量结果的极端异常
*- 此处代码需下载讲义材料查看~
为什么不用 Stata 自带的
_pctile? Stata 的_pctile使用k = (n+1)*p的分位数算法,而 R 的quantile()默认使用 type-7 算法h = (n-1)*p + 1,两者在小样本时会产生微小差异。为保证三种语言(R/Python/Stata)的结果完全一致,我们编写了rquantile7程序实现 R type-7 算法。
步骤六:合并城市名称与输出
从注册文件反查城市名称
*- 从最近年份 CSV 提取城市名称 |
保存为 DTA 文件
label data "数据处理:微信公众号 RStata" |
点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 Stata 测算各城市数字产业集聚程度
评论