今天给大家分享使用 Stata 测算区域技术专业化的方法。该方法参考自林原(2018)《技术流动对区域技术专业化的影响研究》,通过IPC专利分类和RTA指数来综合测度区域的技术专业化程度。
注意:Stata 拆分 IPC 的效率非常低。因此本课程采用 Stata + R 混合工作流程:Stata 负责数据处理和 CV 计算,R 负责拆分多值 IPC。
附件中提供了该参考文献的 PDF 文件,感兴趣的小伙伴可以阅读原文。
指标来源与计算原理
区域技术专业化(Regional Technological Specialization)
区域技术专业化是衡量地区在特定技术领域集聚程度的重要指标。该方法的核心思想是:
- IPC专利分类:利用世界知识产权组织(WIPO)的 IPC 与技术领域对照表,将专利按 IPC 代码归类到35个技术领域
- RTA 指数(Revealed Technological Advantage):计算区域在特定技术领域的相对优势
- CV(变异系数):用调整后 RTA 的变异系数衡量区域技术专业化的整体程度
RTA指数

调整后RTA

CV计算

Stata-R 混合工作流程
┌─────────────────┐ │ Stata Part 1 │ 加载数据、去重、保存中间文件 └────────┬────────┘ │ ▼ ┌─────────────────┐ R 脚本处理 拆分多值IPC、展开数据 └────────┬────────┘ │ ▼ ┌─────────────────┐ │ Stata Part 2 │ 汇总、计算 RTA 和 CV └─────────────────┘
|
Step 1: Stata 加载数据并去重
cd "/Users/ac/Desktop/使用 Stata 测算区域技术专业化" use "2010.dta", clear display "原始数据行数: " _N
gen 公开公告号_clean = 公开公告号 replace 公开公告号_clean = substr(公开公告号, 1, length(公开公告号) - 1) if regexm(公开公告号, "[A-Z]$")
sort 省 市 县 公开公告号_clean quietly by 省 市 县 公开公告号_clean: keep if _n == 1 display "按地区+公告号去重后: " _N " 行"
sort 省 市 县 申请号 quietly by 省 市 县 申请号: keep if _n == 1 display "按地区+申请号去重后: " _N " 行"
sort 省 市 县 newipzlid quietly by 省 市 县 newipzlid: keep if _n == 1 display "按地区+专利ID去重后: " _N " 行"
|
Step 2: Stata 准备中间文件
*- 只保留有IPC的记录 drop if missing(IPC) | IPC == "" display "有IPC的专利数: " _N
*- 保留需要的字段 keep 省 省代码 市 县 newipzlid IPC
*- 保存中间文件供R处理 save "temp_for_r.dta", replace display "已保存: temp_for_r.dta"
|
Step 3: R 拆分多值 IPC
由于 Stata 拆分 IPC 效率非常低,所以这里还是使用 R 语言处理。
library(tidyverse) library(haven)
cat("=== R: 拆分多值IPC ===\n\n")
df <- read_dta("temp_for_r.dta") cat(sprintf("读取数据行数: %d\n", nrow(df)))
cat("\nIPC字段示例:\n") head(df$IPC, 10) %>% print()
cat("\n=== 构建IPC查找表 ===\n")
wipo <- read_csv("WIPO_IPC_and_Technology_Concordance_Table.csv", locale = locale(encoding = "UTF-8"))
pattern_to_prefix <- function(pattern) { prefix <- str_remove(pattern, "##") prefix <- str_remove(prefix, "#") prefix <- str_remove_all(prefix, "-") return(prefix) }
build_ipc_lookup <- function(wipo_df) { lookup <- character(0) exclude_patterns <- list()
for (i in 1:nrow(wipo_df)) { tech_seq <- as.character(wipo_df$序号[i]) ipc_codes <- wipo_df$IPC代码[i]
patterns <- str_split(ipc_codes, ",\\s*")[[1]]
for (p in patterns) { p <- trimws(p) p <- str_remove_all(p, "[()]")
if (str_detect(p, "not")) { parts <- str_split(p, "\\s+not\\s+")[[1]] include_part <- trimws(parts[1]) exclude_parts <- trimws(parts[-1])
prefix <- pattern_to_prefix(include_part) if (prefix != "") { lookup[prefix] <- tech_seq }
for (ex in exclude_parts) { ex_prefix <- pattern_to_prefix(ex) if (ex_prefix != "") { if (is.null(exclude_patterns[[prefix]])) { exclude_patterns[[prefix]] <- character(0) } exclude_patterns[[prefix]] <- c(exclude_patterns[[prefix]], ex_prefix) } } } else { prefix <- pattern_to_prefix(p) if (prefix != "") { lookup[prefix] <- tech_seq } } } }
return(list(lookup = lookup, exclude = exclude_patterns)) }
mapping <- build_ipc_lookup(wipo) ipc_lookup <- mapping$lookup exclude_map <- mapping$exclude
cat(sprintf("IPC前缀查找表条目数: %d\n", length(ipc_lookup)))
cat("\n=== 展开多值IPC ===\n")
cat("\n=== 保存结果 ===\n")
haven::write_dta(df_expanded, "temp_expanded_ipc.dta", label = "IPC展开数据") cat("已保存: temp_expanded_ipc.dta\n")
|
Step 4: Stata 按省份和技术领域汇总
use "temp_expanded_ipc.dta", clear display "展开后数据行数: " _N
collapse (count) 专利数量 = newipzlid, by(省 省代码 技术领域)
ren 技术领域 技术领域序号 destring 技术领域序号, replace
display "汇总后行数: " _N
save "01_tech_by_region.dta", replace display "已保存: 01_tech_by_region.dta"
|
Step 5: Stata 计算 RTA 指数
*- 此处代码需下载讲义材料查看~
Step 6: Stata 计算 CV
*- 此处代码需下载讲义材料查看~
Step 7: Stata 保存结果
export delimited using "区域技术专业化CV_混合.csv", replace display "已保存: 区域技术专业化CV_混合.csv"
use "04_with_rta.dta", clear
import delimited "WIPO_IPC_and_Technology_Concordance_Table.csv", encoding(UTF-8) clear ren 序号 技术领域序号 destring 技术领域序号, replace
merge 1:m 技术领域序号 using "04_with_rta.dta" drop _merge
export delimited using "技术领域按省份汇总_混合.csv", replace display "已保存: 技术领域按省份汇总_混合.csv"
|
工作流程总结
| 步骤 |
工具 |
说明 |
| 数据加载 |
Stata |
读取2010.dta |
| 按地区去重 |
Stata |
三级去重(公告号、申请号、专利ID) |
| 准备中间文件 |
Stata |
保存temp_for_r.dta |
| 拆分多值IPC |
R |
调用expand_ipc.R |
| 展开数据 |
R |
按分号分隔、去重 |
| 保存dta |
R |
temp_expanded_ipc.dta |
| 按省份汇总 |
Stata |
collapse by 省 技术领域 |
| 计算RTA |
Stata |
公式计算 |
| 计算CV |
Stata |
变异系数 |
| 保存结果 |
Stata |
CSV输出 |
点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 Stata 测算区域技术专业化
评论