名师讲堂|使用 Stata 测算各城市数字产业集聚程度

今天给大家分享使用 Stata 测算各城市数字产业集聚程度的方法。该方法参考屠西伟、史丹(2025)《数字产业集聚与企业能源效率改进》,通过区位熵来综合测度城市的数字产业集聚水平。

附件中提供了该参考文献的 PDF 文件,感兴趣的小伙伴可以阅读原文。

指标来源与计算原理

数字产业集聚度(Location Quotient)

区位熵的经济含义

  • DL > 1:该城市数字产业集聚度高于全国平均水平,具有相对专业化优势
  • DL = 1:与全国平均水平相当
  • DL < 1:低于全国平均水平

两种测算方法

本文介绍两种测算方式,主要区别在于分子分母的衡量单位不同:

方法 Xct Sct 优点 局限
注册资本版(论文方法) 数字产业注册资本(万元) 全部企业注册资本(万元) 反映资本密度,与论文一致 大城市分母稀释效应明显
企业数量版(备选方法) 数字产业企业数量(家) 全部企业数量(家) 不受极值影响,城市间对比更直观 无法区分大企业与小企业的贡献

计算步骤概述

整个计算流程分为以下几个步骤:

  1. 读取行业分类:加载《数字经济及其核心产业统计分类(2021)》代码表
  2. 构建注销查找表:从注销企业 CSV 中提取 newgcid → exit_year 映射
  3. 单年聚合:逐年读取注册企业 CSV,先过滤已注销企业,再按城市聚合
  4. 面板累计:跨年累加,得到各城市各年的存量企业指标
  5. 计算区位熵:按公式计算 DL,并进行 Winsorize 极端值处理
  6. 输出结果:保存为 .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。

路径与参数配置

*- 参数设置
local year_min = 2010
local year_max = 2012
local dir_reg = "工商注册信息_精简"
local dir_exit = "注销企业_精简"
local dta_file = "数字经济及其核心产业统计分类.dta"

其中:

  • year_min / year_max:控制计算年份范围,便于缩小到示例数据快速验证
  • dir_reg / dir_exit:注册和注销 CSV 所在目录
  • dta_file:数字经济产业分类标准 DTA 文件

步骤一:读取数字经济产业行业代码

加载分类标准

use "`dta_file'", clear
keep if !mi(国民经济行业代码) & 国民经济行业代码 != ""
keep 国民经济行业代码
rename 国民经济行业代码 code

*- ---- 小类代码查找表(4位精确匹配) ----
gen str4 ind_4 = substr(code, 1, 4)
duplicates drop ind_4, force
keep ind_4
tempfile digi_codes_4d
save `digi_codes_4d'

*- ---- 中类代码查找表(3位前缀匹配) ----
use "`dta_file'", clear
keep if !mi(国民经济行业代码) & 国民经济行业代码 != ""
keep 国民经济行业代码
rename 国民经济行业代码 code
gen str3 ind_3 = substr(code, 1, 3)
duplicates drop ind_3, force
keep ind_3
tempfile digi_prefixes
save `digi_prefixes'

《数字经济及其核心产业统计分类(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 策略:

  1. 企业层面(步骤三已完成):对每个年份内的企业注册资本做 5%/95% 截断,防止单个天价壳公司拉偏城市存量
  2. 城市层面:对最终 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 提取城市名称
forvalues y = `year_max'(-1)`year_min' {
cap import delimited "`dir_reg'/`y'.csv", encoding("UTF-8") clear stringcols(_all)
if _rc != 0 continue

cap confirm variable 市
if _rc != 0 continue
cap confirm variable 市代码
if _rc != 0 continue

keep 市 市代码
rename 市 city_name
rename 市代码 city_code
drop if mi(city_code) | city_code == "" | city_name == ""
duplicates drop city_code, force

append using "city_map_build.dta"
save "city_map_build.dta", replace
}

*- 合并回主数据
merge m:1 city_code using "city_map.dta", keep(master match) nogen

保存为 DTA 文件

label data "数据处理:微信公众号 RStata"
save "数字产业集聚度_企业数量_各城市.dta", replace

点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 Stata 测算各城市数字产业集聚程度

评论