名师讲堂|使用 Stata 测算各城市技术集群指标

本讲义介绍如何使用 Stata + R 混合方案测算各城市的技术集群指标(技术关联性 link_c 和技术多样性 diver_c),方法参考自冉征等(2025)《技术集群结构与颠覆式创新》一文。

混合方案说明:Stata 处理字符串拆分(特别是变长多值字段)效率远低于 R,因此本方案将 IPC 小类展开步骤交由 R 完成:

步骤 工具 任务
Step 1A Stata 读取 CSV、去重、保存 patent_merged.csv
Step 1B R (Rscript) 展开 IPC 小类、保存 patent_ipc.csv
Step 2+ Stata 读取 patent_ipc.csv,计算 RTCA / diver_c / link_c

核心技术联系矩阵 phi_matrix.dta 由 R 语言版本的课程提供(phi_matrix.rds → phi_matrix.dta),在 Stata 中通过 use 命令直接读取使用,无需重新计算。

重要提示:Stata 不直接读取 .rds 文件,附件中已使用 R 将 phi_matrix.rds 转换为 phi_matrix.dta。转换代码:

library(haven)
phi <- readRDS("phi_matrix.rds")
write_dta(phi, "phi_matrix.dta", version = 14)

一、指标来源与计算原理

1.1 显性技术比较优势(RTCA)

1.2 技术多样性(diver_c)

1.3 技术关联性(link_c)

二、数据读取与预处理

以下代码对应 计算技术关联性与多样性.do 脚本,以 2010–2012 年为例演示完整计算过程。运行前需设置工作目录,并确保系统已安装 R(供 shell 命令调用 Rscript):

*- ── 设置工作目录 ──
cd "/Users/ac/Desktop/使用 Stata 测算各城市技术集群指标"

*- ── 路径参数 ──
local DATA_DIR "newIP专利数据分年_csv"
local PHI_DTA "phi_matrix.dta"
local OUT_DIR "output"
local TMP_DIR "output/中间数据"

capture mkdir "`OUT_DIR'"
capture mkdir "`TMP_DIR'"

2.1 Step 1:读取并去重专利数据

关键命令说明:

  • import delimited:读取 CSV 文件,stringcols(_all) 将所有列读为字符串(避免科学计数法)
  • duplicates drop:按指定键去重
  • ustrregexra():Unicode 正则替换,等价于 R 的 str_replace_all()
*- ── 读取 2010 年数据 ──
import delimited using "`DATA_DIR'/2010.csv", ///
clear bindquotes(strict) maxquotedrows(unlimited) ///
stringcols(_all) varnames(1)

*- 只保留需要的列
keep newipzlid 年份 公开公告号 申请号 IPC 市代码 市 省代码 省

*- ── 清洗公开公告号(去末尾字母)──
*- 等价于 R 的:dt[, 公开公告号_clean := str_replace_all(公开公告号, "[A-Za-z]+$", "")]
gen 公开公告号_clean = ustrregexra(公开公告号, "[A-Za-z]+$", "")

*- ── 去重 Step1:按 市代码 + 年份 + 公开公告号_clean ──
duplicates drop 市代码 年份 公开公告号_clean, force

*- ── 去重 Step2:按 市代码 + 年份 + 申请号 ──
duplicates drop 市代码 年份 申请号, force

*- 保存去重后的逐年数据到中间数据文件夹
save "`TMP_DIR'/patent_2010.dta", replace

去重规则说明:

  1. 先清洗公开公告号末尾的字母(如 CN12345A → CN12345)
  2. 按「市代码 + 年份 + 公开公告号_clean」去重
  3. 再按「市代码 + 年份 + 申请号」去重

2.2 Step 1B(R):展开 IPC 小类

Stata 的 split + reshape long 处理字符串效率较低,对于数十万条含多值 IPC 的专利记录尤为明显。因此本方案在 Stata 内通过 shell 命令调用 Rscript,将 IPC 展开工作交给 R 完成,再将结果写回为 patent_ipc.dta 供 Stata 继续处理。

Stata 调用方式(.do 文件中的核心逻辑):

这个需要根据自己的电脑选择方式运行,这里仅展示我的电脑上运行的方式,或者也可以直接打开 R 语言或者 RStudio 运行这个 R 脚本。

*- 直接调用项目根目录下的独立 R 脚本
shell /usr/local/bin/Rscript expand_ipc.R

*- 检查输出文件是否生成
capture confirm file "`TMP_DIR'/patent_ipc.csv"
if _rc != 0 {
di as error "错误:R 未能生成 patent_ipc.csv"
exit 1
}

独立 R 脚本 expand_ipc.R(位于项目根目录,可直接运行和修改):

此处代码需下载讲义材料查看~

关键命令对照表(IPC 展开):

语言 方法 耗时(参考)
R(本方案) str_split() + data.table 展开 快,~30秒
Stata(原生方案) split + reshape long 慢,数分钟

三、技术联系矩阵与指标计算

3.1 Step 2:读取技术联系矩阵 Φ

use "`PHI_DTA'", clear
describe
summ phi

*- 保存到中间数据文件夹
save "`TMP_DIR'/phi_data.dta", replace

重要说明:phi_matrix.dta 由 R 语言版本课程提供的 phi_matrix.rds 转换而来,使用 1985–2022 全样本专利引用关系构建。

3.2 Step 3:逐年计算 RTCA、diver_c、link_c

Step 1B 结束后,先一次性将 patent_ipc.csv 按年份拆分存为逐年 dta,循环里直接 use(避免每年重复 import 全量 283 万行 CSV):

import delimited using "`TMP_DIR'/patent_ipc.csv", clear stringcols(_all) varnames(1)
foreach yr in 2010 2011 2012 {
preserve
keep if 年份 == "`yr'"
save "`TMP_DIR'/patent_ipc_`yr'.dta", replace
restore
}
*- ── 以 2010 年为例 ──
*- 此处代码需下载讲义材料查看~
*- 城市内所有 (ipc_citing, ipc_cited) 对的交叉产品
*- 此处代码需下载讲义材料查看~

3.3 Step 4:汇总输出

*- 合并历年结果(从中间数据文件夹读取)
clear
foreach yr in 2010 2011 2012 {
if "`yr'" == "2010" {
use "`TMP_DIR'/result_`yr'.dta", clear
}
else {
append using "`TMP_DIR'/result_`yr'.dta"
}
}

*- 整理列顺序并排序
order 年份 省代码 省 市代码 市 diver_c link_c
sort 年份 市代码

*- 保存最终结果
save "`OUT_DIR'/city_tech_cluster_2010_2012.dta", replace

*- 各年描述统计
bysort 年份: summarize diver_c link_c

点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 Stata 测算各城市技术集群指标

评论