背景介绍
技术集群是衡量一个地区技术创新能力和产业竞争力的重要指标。冉征等(2025)在《中国工业经济》发表的《技术集群结构与颠覆式创新——兼论关联性”陷阱”的突破路径》一文中,提出了两个核心指标:
- 技术关联性(link_c):衡量一个城市内部不同技术领域之间的关联程度
- 技术多样性(diver_c):衡量一个城市拥有比较优势的技术领域数量
这两个指标对于研究区域创新、产业升级和技术政策具有重要意义。
指标计算方法
1. RTCA(显性技术比较优势)

2. 技术多样性(diver_c)

3. 技术关联性(link_c)

数据说明
本讲义使用的数据包括:
- 专利数据:包含 1985~2024 年所有专利申请信息
- 关键变量:专利申请号、公开公告号、申请日、IPC 分类号、申请人地址等。
- 数据格式:分年 CSV 文件
1985~2024 年专利申请与授权数据(版本 3,含申请人所处的省市区县):https://rstata.duanshu.com/#/brief/course/2397451274c546d3a36e156ffc865988
- 专利引用数据:来自 全部专利引用与被引用信息分年(未去重).rds
这个数据来自平台上分析的这个数据合并得到:
1985~2024 年全部专利引用与被引用详细信息:https://rstata.duanshu.com/#/brief/course/225ad0b59a9945e1831d2e8b96ca1001
不过这个 rds 文件过大(44.65GB),所以没有放到附件中(大多数朋友的电脑估计也难以处理),不过附件中提供了使用该数据计算好的 Φ 数据,也就是 output/phi_matrix.rds 文件,该文件可以用于计算全部年份的数据,因此不再需要使用 全部专利引用与被引用信息分年(未去重).rds 文件。
- 技术联系矩阵 Φ:预先计算好的 RDS 文件(output/phi_matrix.rds)
- 列:ipc_citing(引用领域)、ipc_cited(被引领域)、phi(联系强度)
计算代码详解
本讲义以 2010~2012 年的城市级别数据为例,完整演示计算过程。完整代码参见附件中的 计算技术关联性与多样性.R。
Step 0:加载所需 R 包并设定参数
library(data.table) library(stringr)
DATA_DIR <- "newIP专利数据分年_csv" RDS_PATH <- "全部专利引用与被引用信息分年(未去重).rds" OUT_DIR <- "output" YEARS <- 2010:2012
dir.create(OUT_DIR, showWarnings = FALSE)
IPC_SUBCLASS_PATTERN <- "^[A-Z][0-9]{2}[A-Z]"
|
Step 1:读取并去重专利数据(2010~2012 年)
去重规则分两步:
- 按「市代码 + 年份 + 公开公告号(去末尾字母后)」去重
- 按「市代码 + 年份 + 申请号」去重
cat("\n========================================\n") cat(" Step 1: 读取并去重专利申请数据\n") cat("========================================\n")
extract_ipc4 <- function(ipc_str) { str_extract(str_trim(ipc_str), IPC_SUBCLASS_PATTERN) }
split_ipc <- function(ipc_str) { unlist(str_split(ipc_str, ";")) }
patent_dt <- rbindlist(lapply(YEARS, read_and_dedup), use.names = TRUE, fill = TRUE) cat(sprintf("合并后总行数:%d\n", nrow(patent_dt)))
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,可跳过此步骤直接读取。
以下代码展示 Φ 矩阵的完整构建过程:
cat("\n========================================\n") cat(" Step 2: 构建技术联系矩阵 Φ\n") cat("========================================\n")
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_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)))
|
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)))
|
如果已有 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 年三个指标的核心计算代码:
cat("\n========================================\n") cat(" Step 3: 逐年计算技术多样性和技术关联性\n") cat("========================================\n")
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:汇总输出
cat("\n========================================\n") cat(" Step 4: 汇总输出\n") cat("========================================\n")
final <- rbindlist(results_list) setcolorder(final, c("年份", "省代码", "省", "市代码", "市", "diver_c", "link_c")) setorder(final, 年份, 市代码)
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")
|
程序会自动:
- 读取并去重 2010~2012 年专利数据
- 构建(或读取)技术联系矩阵 Φ
- 计算 RTCA、diver_c、link_c
- 输出 output/city_tech_cluster_2010_2012.dta
4. 输出文件
程序运行后会在 output/ 目录生成 Stata 格式文件:
| 文件名 |
说明 |
city_tech_cluster_2010_2012.dta |
2010~2012 年城市级别面板数据 |
点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 R 语言测算各城市技术集群指标
评论