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

背景介绍

技术集群是衡量一个地区技术创新能力和产业竞争力的重要指标。冉征等(2025)在《中国工业经济》发表的《技术集群结构与颠覆式创新——兼论关联性”陷阱”的突破路径》一文中,提出了两个核心指标:

  1. 技术关联性(link_c):衡量一个城市内部不同技术领域之间的关联程度
  2. 技术多样性(diver_c):衡量一个城市拥有比较优势的技术领域数量

这两个指标对于研究区域创新、产业升级和技术政策具有重要意义。

指标计算方法

1. RTCA(显性技术比较优势)

2. 技术多样性(diver_c)

3. 技术关联性(link_c)

数据说明

本讲义使用的数据包括:

  1. 专利数据:包含 1985~2024 年所有专利申请信息
  • 关键变量:专利申请号、公开公告号、申请日、IPC 分类号、申请人地址等。
  • 数据格式:分年 CSV 文件

1985~2024 年专利申请与授权数据(版本 3,含申请人所处的省市区县):https://rstata.duanshu.com/#/brief/course/2397451274c546d3a36e156ffc865988

  1. 专利引用数据:来自 全部专利引用与被引用信息分年(未去重).rds
  • 包含引用与被引用关系
  • 用于构建技术联系矩阵 Φ

这个数据来自平台上分析的这个数据合并得到:

1985~2024 年全部专利引用与被引用详细信息:https://rstata.duanshu.com/#/brief/course/225ad0b59a9945e1831d2e8b96ca1001

不过这个 rds 文件过大(44.65GB),所以没有放到附件中(大多数朋友的电脑估计也难以处理),不过附件中提供了使用该数据计算好的 Φ 数据,也就是 output/phi_matrix.rds 文件,该文件可以用于计算全部年份的数据,因此不再需要使用 全部专利引用与被引用信息分年(未去重).rds 文件。

  1. 技术联系矩阵 Φ:预先计算好的 RDS 文件(output/phi_matrix.rds)
  • 列:ipc_citing(引用领域)、ipc_cited(被引领域)、phi(联系强度)

计算代码详解

本讲义以 2010~2012 年的城市级别数据为例,完整演示计算过程。完整代码参见附件中的 计算技术关联性与多样性.R。

Step 0:加载所需 R 包并设定参数

# ============================================================
# 城市技术关联性(link_c)与技术多样性(diver_c)测算
# 参考:冉征等《技术集群结构与颠覆式创新》(中国工业经济,2025)
# 以 2010-2012 年为例
# ============================================================

library(data.table)
library(stringr)

# ============================================================
# 0. 路径与参数
# ============================================================

DATA_DIR <- "newIP专利数据分年_csv" # 专利数据目录
RDS_PATH <- "全部专利引用与被引用信息分年(未去重).rds" # 引用关系 RDS
OUT_DIR <- "output" # 输出目录
YEARS <- 2010:2012 # 目标年份

dir.create(OUT_DIR, showWarnings = FALSE)

# IPC 小类提取正则:取开头的 字母+2位数字+字母 共4位,如 F42B, G06Q
IPC_SUBCLASS_PATTERN <- "^[A-Z][0-9]{2}[A-Z]"

Step 1:读取并去重专利数据(2010~2012 年)

去重规则分两步:

  1. 按「市代码 + 年份 + 公开公告号(去末尾字母后)」去重
  2. 按「市代码 + 年份 + 申请号」去重
# ============================================================
# Step 1:读取并去重专利数据(目标年份)
# ============================================================
cat("\n========================================\n")
cat(" Step 1: 读取并去重专利申请数据\n")
cat("========================================\n")

# IPC 小类提取函数(取前 4 位)
extract_ipc4 <- function(ipc_str) {
str_extract(str_trim(ipc_str), IPC_SUBCLASS_PATTERN)
}

# 拆分多 IPC 字符串(分号分隔)→ 返回字符向量
split_ipc <- function(ipc_str) {
unlist(str_split(ipc_str, ";"))
}

# 读取并去重函数(处理单年)
# 此处代码需下载讲义材料查看~

# 读取 2010~2012 年数据并合并
patent_dt <- rbindlist(lapply(YEARS, read_and_dedup),
use.names = TRUE, fill = TRUE)
cat(sprintf("合并后总行数:%d\n", nrow(patent_dt)))

# ---- 展开 IPC 小类 ----
# 每条专利可能有多个 IPC(分号分隔),展开后取前 4 位
cat("\n展开 IPC 小类(每专利可能对应多个)...\n")
patent_ipc <- patent_dt[!is.na(IPC) & nchar(str_trim(IPC)) > 0][
,
.(ipc_raw = split_ipc(IPC)),
by = .(newipzlid, 年份, 市代码, 市, 省代码, 省)
][
, ipc4 := extract_ipc4(ipc_raw)
][
!is.na(ipc4) & nchar(ipc4) == 4
]
# 同一专利同一小类只保留一条
patent_ipc <- unique(patent_ipc, by = c("newipzlid", "ipc4"))

# 过滤掉市代码缺失的记录
patent_ipc <- patent_ipc[!is.na(市代码) & 市代码 != "" & 市代码 != 0]

cat(sprintf("展开后记录数:%d,IPC小类数:%d,城市数:%d\n",
nrow(patent_ipc),
uniqueN(patent_ipc$ipc4),
uniqueN(patent_ipc$市代码)))

Step 2:构建技术联系矩阵 Φ

技术联系矩阵 Φ 需要基于全部专利引用数据构建(1985~2024 年),以保证外生性。由于 RDS 文件约 44GB,需要足够内存(建议 64GB+)。如果已有 phi_matrix.rds,可跳过此步骤直接读取。

以下代码展示 Φ 矩阵的完整构建过程:

# ============================================================
# Step 2:构建技术联系矩阵 Φ
# ============================================================
# 论文:使用 1985-2022 年所有专利间相互引用构建,以保证外生性
#
# Φ_{i←i'} = cite_{i←i'} / sum_{i''} cite_{i←i''}
# 其中:i = 引用方技术领域
# i' = 被引方技术领域
# ============================================================

cat("\n========================================\n")
cat(" Step 2: 构建技术联系矩阵 Φ\n")
cat("========================================\n")

# ---- 2a. 先构建全样本的 newipzlid -> ipc4 映射 ----
# 此处代码需下载讲义材料查看~

# 去重(与 Step1 相同逻辑)
ipc_all_raw[, 公开公告号_clean := str_replace_all(公开公告号, "[A-Za-z]+$", "")]
ipc_all_raw <- unique(ipc_all_raw, by = c("市代码", "年份", "公开公告号_clean"))
ipc_all_raw <- unique(ipc_all_raw, by = c("市代码", "年份", "申请号"))
cat(sprintf(" 去重后:%d 行\n", nrow(ipc_all_raw)))

# 展开 IPC 小类
ipc_map <- ipc_all_raw[!is.na(IPC) & nchar(str_trim(IPC)) > 0,
.(ipc_raw = split_ipc(IPC)),
by = .(newipzlid)
][
, ipc4 := extract_ipc4(ipc_raw)
][
!is.na(ipc4)
][
, .(newipzlid, ipc4)
]
ipc_map <- unique(ipc_map)
rm(ipc_all_raw); gc()
cat(sprintf(" IPC 映射:%d 条,覆盖 %d 个专利,%d 个小类\n",
nrow(ipc_map), uniqueN(ipc_map$newipzlid), uniqueN(ipc_map$ipc4)))
# ---- 2b. 读取引用关系并整理为 (citing, cited) 对 ----
# 此处代码需下载讲义材料查看~

# ---- 2c. 匹配 IPC 技术领域 → 统计引用频次 ----
# 此处代码需下载讲义材料查看~

# 统计 (引用技术领域, 被引技术领域) 频次
cite_freq <- cite_ipc[, .N, by = .(ipc_citing, ipc_cited)]
setnames(cite_freq, "N", "cite_count")
rm(cite_ipc); gc()
cat(sprintf(" 技术领域引用关系:%d 条\n", nrow(cite_freq)))

# ---- 2d. 计算 Φ ----
# 此处代码需下载讲义材料查看~

如果已有 output/phi_matrix.rds,只需运行以下代码读取:

# 读取预先计算好的技术联系矩阵 Φ
phi_dt <- readRDS("output/phi_matrix.rds")
setDT(phi_dt)
setkey(phi_dt, ipc_citing, ipc_cited)
cat(sprintf(" Φ 矩阵:%d 条记录,%d 个引用领域,%d 个被引领域\n",
nrow(phi_dt),
uniqueN(phi_dt$ipc_citing),
uniqueN(phi_dt$ipc_cited)))

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

以下是 2010~2012 年三个指标的核心计算代码:

# ============================================================
# Step 3:逐年计算 RTCA、diver_c、link_c
# ============================================================
cat("\n========================================\n")
cat(" Step 3: 逐年计算技术多样性和技术关联性\n")
cat("========================================\n")

# 如果跳过 Step 2(已有 phi_matrix.rds),先读取 Φ 矩阵
# 此处代码需下载讲义材料查看~

# ---- 当年结果 ----
yr_result <- copy(diver_dt)
yr_result[is.na(link_c), link_c := 0]
yr_result[, 年份 := yr]

cat(sprintf(" 城市数:%d,diver_c 均值:%.2f,link_c 均值:%.5f\n",
nrow(yr_result),
mean(yr_result$diver_c, na.rm = TRUE),
mean(yr_result$link_c, na.rm = TRUE)))

results_list[[as.character(yr)]] <- yr_result
}

Step 4:汇总输出

# ============================================================
# Step 4:汇总输出
# ============================================================
cat("\n========================================\n")
cat(" Step 4: 汇总输出\n")
cat("========================================\n")

final <- rbindlist(results_list)
setcolorder(final, c("年份", "省代码", "省", "市代码", "市", "diver_c", "link_c"))
setorder(final, 年份, 市代码)

# 保存为 dta
out_path <- file.path(OUT_DIR, "city_tech_cluster_2010_2012.dta")
haven::write_dta(final, out_path,
label = "数据处理:微信公众号 RStata")
cat(sprintf("结果已保存:%s\n", out_path))

# 描述统计
cat("\n各年描述统计:\n")
print(final[, .(
n_city = .N,
diver_mean = round(mean(diver_c, na.rm = TRUE), 2),
diver_sd = round(sd(diver_c, na.rm = TRUE), 2),
link_mean = round(mean(link_c, na.rm = TRUE), 5),
link_sd = round(sd(link_c, na.rm = TRUE), 5)
), by = 年份])

代码运行说明

1. 准备工作

确保以下文件结构:

工作目录/
├── newIP专利数据分年_csv/ # 专利数据(分年 CSV)
│ ├── 2010.csv
│ ├── 2011.csv
│ ├── 2012.csv
│ └── ...
├── 全部专利引用与被引用信息分年(未去重).rds # 引用数据(可选,附件中未提供)
├── output/ # 输出目录
│ └── phi_matrix.rds # 技术联系矩阵(预先计算)
└── 计算技术关联性与多样性.R # 主程序(2010-2012 示例)

2. 计算技术联系矩阵 Φ

注意:技术联系矩阵 Φ 需要基于 1985~2024 年全部专利引用数据构建,计算量较大。如果已有 phi_matrix.rds,可跳过此步骤。

3. 运行主程序

在 R 中运行:

setwd("/Users/ac/Desktop/使用 R 语言测算各城市技术集群指标")
source("计算技术关联性与多样性.R")

程序会自动:

  1. 读取并去重 2010~2012 年专利数据
  2. 构建(或读取)技术联系矩阵 Φ
  3. 计算 RTCA、diver_c、link_c
  4. 输出 output/city_tech_cluster_2010_2012.dta

4. 输出文件

程序运行后会在 output/ 目录生成 Stata 格式文件:

文件名 说明
city_tech_cluster_2010_2012.dta 2010~2012 年城市级别面板数据

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

评论