名师讲堂|使用 Stata 测算区域技术专业化

今天给大家分享使用 Stata 测算区域技术专业化的方法。该方法参考自林原(2018)《技术流动对区域技术专业化的影响研究》,通过IPC专利分类和RTA指数来综合测度区域的技术专业化程度。

注意:Stata 拆分 IPC 的效率非常低。因此本课程采用 Stata + R 混合工作流程:Stata 负责数据处理和 CV 计算,R 负责拆分多值 IPC。

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

指标来源与计算原理

区域技术专业化(Regional Technological Specialization)

区域技术专业化是衡量地区在特定技术领域集聚程度的重要指标。该方法的核心思想是:

  1. IPC专利分类:利用世界知识产权组织(WIPO)的 IPC 与技术领域对照表,将专利按 IPC 代码归类到35个技术领域
  2. RTA 指数(Revealed Technological Advantage):计算区域在特定技术领域的相对优势
  3. 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")

# 读取Stata中间文件
df <- read_dta("temp_for_r.dta")
cat(sprintf("读取数据行数: %d\n", nrow(df)))

# 查看IPC示例
cat("\nIPC字段示例:\n")
head(df$IPC, 10) %>% print()

# ==============================================================================
# 构建IPC查找表
# ==============================================================================

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)))

# ==============================================================================
# IPC匹配函数
# 此处代码需下载讲义材料查看~

# ==============================================================================
# 批量匹配IPC
# 此处代码需下载讲义材料查看~

# ==============================================================================
# 展开数据
# ==============================================================================

cat("\n=== 展开多值IPC ===\n")

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

# ==============================================================================
# 保存为dta
# ==============================================================================

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 测算区域技术专业化

评论