名师讲堂|使用 R 语言测算专利的创新突破度:ACD指数和mACD指数

本次课程在原始 CD 指数(Funk & Owen-Smith, 2017)的基础上,介绍徐照宜等(2023)在《金融研究》上发表的改进算法:ACD 指数和 mACD 指数。改进的核心是解决”从未被引用专利”的歧义问题,以及调整分母以更好地反映专利的突破性。

附件中提供了相关论文 PDF 和计算代码。

一、背景:原始 CD 指数及其问题

1.1 CD 指数公式

CD 指数由 Funk & Owen-Smith (2017) 提出,用于衡量专利的创新突破程度:

1.2 三种引用情况的 CD 值

类型 条件 CD 值 含义
圆形 引用目标专利,不引用后向引用 +1 突破性
正方形 既引用目标专利又引用后向引用 -1 渐进性
三角形 只引用后向引用专利 0 中性

论文中的示意图如下:

1.3 原始 CD 指数的问题

  1. 从未被引用的专利 CD = 0:这与”渐进性专利”的 CD = -1 混淆
  2. 正负值相抵:多个专利的 CD 值正负相抵,汇总时相互抵消

二、改进的 ACD 和 mACD 指数

2.1 ACD 公式(论文原文)

2.2 mACD 公式(论文原文)

2.3 关键变量定义

变量 定义
fit 1 如果专利 i 引用了目标专利,否则 0
bit 1 如果专利 i 既引用了目标专利又引用了目标专利的后向引用专利,否则 0
nt 引用过目标专利的专利数(parta + partb)
mt 引用过目标专利或后向引用专利的专利总数(parta + partb + partc)
wit 权重(设为 1)

2.4 三种引用情况的分子值

类型 f b −2f⋅b+f 含义 计入 nt 求和
parta 1 1 -1 既引用目标专利又引用后向引用专利 ✓
partb 1 0 +1 只引用目标专利 ✓
partc 0 0 0 只引用后向引用专利 ✗

2.5 公式简化

2.6 ACD 值含义

此处内容需下载讲义材料查看~

2.7 mACD 的特殊意义

mACD = m_t × ACD,体现了专利在整体知识网络中的累积效应:

  • m_t 越大,说明目标专利及其后向引用专利被越多专利引用
  • mACD 可以大于 2,反映该专利在知识网络中的影响力越大

2.8 三个指数的关系

指数 分母 公式 特点
CD m_t (partb - parta) / m_t 原始值,可正可负
ACD n_t 2 × partb / n_t 只关注直接引用,范围 [0, 2]
mACD m_t ACD × m_t 考虑整体网络,可大于 2

三、数据来源与处理过程

3.1 原始数据

本课程使用的数据来源于中国专利数据库,包含 1985-2024年 上市公司申请的专利及其引用关系数据。

3.2 数据文件说明

文件名 行数 列名 说明
具有引用与被引用信息的专利unique_newipzlid.rds 23,330,294 newipzlid 所有具有引用与被引用信息的专利ID列表
patent_citations.rds 63,020,845 newipzlid, newipzlid2, date, date2 原始专利引用关系数据
nobackrefs.rds 8,277,416 newipzlid2, cd_index 没有后向引用的专利(cd_index = 1)
patent_citations2.rds 46,102,368 newipzlid, newipzlid2, date, date2 5年窗口筛选后的引用数据

变量说明:

  • newipzlid:引用专利的ID(申请日的专利)
  • newipzlid2:被引用专利的ID(被引用的专利)
  • date:引用专利的申请日期
  • date2:被引用专利的申请日期

3.3 数据处理流程

数据从原始专利库到最终可用格式,需要经过以下处理步骤:

┌─────────────────────────────────────────────────────────────────┐
│ 原始数据:全部专利引用与被引用信息分年.rds │
│ (包含专利引用与被引用信息,含省市区信息) │
└─────────────────────────────────────────────────────────────────┘
↓
① 根据公开公告号去重
↓
┌─────────────────────────────────────────────────────────────────┐
│ 中间文件:全部专利引用信息(去重后).rds │
│ 去除同一专利的不同公开版本,保留唯一记录 │
└─────────────────────────────────────────────────────────────────┘
↓
② 提取引用信息(处理自引与他引的双向关系)
↓
┌─────────────────────────────────────────────────────────────────┐
│ patent_citations.rds │
│ - 包含:他引信息、自引信息、被他引信息、被自引信息 │
│ - 结构:newipzlid(引用方)、newipzlid2(被引用方)、 │
│ date(引用方申请日)、date2(被引用方申请日) │
└─────────────────────────────────────────────────────────────────┘
↓
③ 保留5年内的相互引用(时间窗口筛选)
↓
┌─────────────────────────────────────────────────────────────────┐
│ patent_citations2.rds │
│ 筛选条件:0 ≤ date - date2 ≤ 5年 │
│ 理由:专利通常在申请后5年内被引用 │
└─────────────────────────────────────────────────────────────────┘
↓
④ 识别无后向引用的专利
↓
┌─────────────────────────────────────────────────────────────────┐
│ nobackrefs.rds │
│ 定义:被其他专利引用,但自己不引用任何专利的专利 │
│ 特点:这些专利的ACD直接设为2(纯突破性) │
└─────────────────────────────────────────────────────────────────┘

3.4 处理代码示例

以下是数据处理的关键步骤代码:

# 1. 读取原始数据
df1 <- read_rds("全部专利引用与被引用信息分年.rds")

# 2. 根据公开公告号去重
df2 <- df1 %>%
mutate(
公开公告号_original = str_remove(公开公告号_original, "[A-Z]$"),
公开公告号 = str_remove(公开公告号, "[A-Z]$")
) %>%
distinct(公开公告号_original, 公开公告号, .keep_all = TRUE)

# 3. 提取引用信息(处理双向关系)
# 此处代码需下载讲义材料查看~

3.5 数据规模对比

处理阶段 文件名 行数 说明
原始数据 全部专利引用与被引用信息分年.rds - 含省市区信息
去重后 patent_citations.rds 63,020,845 去除重复记录
5年窗口 patent_citations2.rds 46,102,368 筛选后减少26.9%
无后向引用 nobackrefs.rds 8,277,416 特殊处理专利

3.6 数据读取

读取本课程提供的处理后数据:

library(tidyverse)

# 读取专利引用数据(5年窗口,推荐使用)
patent_citations2 <- read_rds("patent_citations2.rds")
patent_citations2 %>%
slice_sample(n = 10)

专利引用数据的变量说明:

  • newipzlid:引用专利的ID(引用方)
  • newipzlid2:被引用专利的ID(被引用方)
  • date:引用专利的申请日期
  • date2:被引用专利的申请日期
cat("专利引用数据行数:", nrow(patent_citations2), "\n")
cat("被引用专利数:", n_distinct(patent_citations2$newipzlid2), "\n")
cat("引用专利数:", n_distinct(patent_citations2$newipzlid), "\n")

四、计算示例

4.1 单个专利的计算逻辑

以某个专利为例,详细展示 ACD 和 mACD 的计算过程:

# 以某个专利为例
id <- 20190809613

# 获取目标专利信息
patent_citations2 %>%
filter(newipzlid2 == id) -> target_patent

target_patent

步骤 1:获取后向引用专利

目标专利的后向引用专利(目标专利引用的专利):

# 获取目标专利的后向引用专利
patent_citations2 %>%
filter(newipzlid == id) %>%
select(newipzlid2) %>%
pull(newipzlid2) -> backrefs

cat("后向引用专利数:", length(backrefs), "\n")

步骤 2:获取未来引用专利

申请日期晚于目标专利的所有专利:

patent_citations2 %>%
filter(date >= target_patent$date2[1]) -> future_citations

cat("未来引用专利数:", nrow(future_citations), "\n")

步骤 3:分类三种引用情况

  • part1:引用目标专利的专利
  • part2:引用后向引用专利的专利

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

步骤 4:计算三种情况的专利集合

  • parta:既引用目标专利又引用后向引用专利
  • partb:只引用目标专利但不引用后向引用专利
  • partc:只引用后向引用专利但不引用目标专利
# 三种情况的专利集合
parta_ids <- intersect(part1$newipzlid, part2$newipzlid)
partb_ids <- setdiff(part1$newipzlid, part2$newipzlid)
partc_ids <- setdiff(part2$newipzlid, part1$newipzlid)

cat("parta (既引用目标又引用后向引用):", length(parta_ids), "\n")
cat("partb (只引用目标专利):", length(partb_ids), "\n")
cat("partc (只引用后向引用专利):", length(partc_ids), "\n")

步骤 5:计算 n_t 和 m_t

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

4.2 封装计算函数

将上述逻辑封装成函数,方便批量计算:

calc_patent_acd_macd <- function(patent_id, citations) {
# 获取目标专利的信息
target_patent <- citations %>%
filter(newipzlid2 == !!patent_id)

if (nrow(target_patent) == 0) {
return(tibble(newipzlid = patent_id, ACD = 0, mACD = 0, n_t = 0, m_t = 0))
}

target_date <- target_patent$date2[1]

# 获取目标专利的后向引用专利
backrefs <- citations %>%
filter(newipzlid == !!patent_id) %>%
pull(newipzlid2)

# 获取未来引用专利
future_citations <- citations %>%
filter(date >= target_date)

# part1 和 part2
part1 <- future_citations %>%
filter(newipzlid2 == !!patent_id) %>%
pull(newipzlid) %>%
unique()

part2 <- if (length(backrefs) > 0) {
future_citations %>%
filter(newipzlid2 %in% backrefs) %>%
pull(newipzlid) %>%
unique()
} else {
character(0)
}

# 计算三种情况的专利数
parta <- length(intersect(part1, part2))
partb <- length(setdiff(part1, part2))
partc <- length(setdiff(part2, part1))

# 计算 n_t 和 m_t
n_t <- parta + partb
m_t <- parta + partb + partc

# 计算 ACD 和 mACD
ACD <- if (n_t > 0) 2 * partb / n_t else 0
mACD <- if (m_t > 0) ACD * m_t else 0

tibble(
newipzlid = patent_id,
ACD = ACD,
mACD = mACD,
n_t = n_t,
m_t = m_t
)
}

# 测试函数
test_result <- calc_patent_acd_macd(20190809613, patent_citations2)
print(test_result)

五、批量计算与多线程优化

5.1 筛选需要计算的专利

并非所有专利都需要计算。如果某个专利没有后向引用,则所有引用它的专利都落在 partb,ACD = 2:

# 没有后向引用的专利
patent_citations2 %>%
distinct(newipzlid2) %>%
anti_join(
patent_citations2 %>%
distinct(newipzlid2 = newipzlid),
by = "newipzlid2"
) %>%
distinct(newipzlid2) -> nobackrefs

nobackrefs %>%
mutate(ACD = 2, mACD = 2, n_t = 0, m_t = 0) -> nobackrefs_acd

cat("无后向引用专利数:", nrow(nobackrefs), "\n")

5.2 批量计算

读取上市公司专利数据,只计算需要计算的专利:

# 读取上市公司专利数据
read_csv("2010年上市公司与专利数据匹配结果.csv") -> sspat

sspat %>%
distinct(newipzlid) %>%
filter(newipzlid %in% (patent_citations2 %>% distinct(newipzlid2) %>% pull(newipzlid2))) ->
need_calc

cat("需要计算的有后向引用的上市公司专利数:", nrow(need_calc), "\n")

5.3 多线程计算

由于计算量较大,使用多线程加速:

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

六、结果汇总

6.1 合并计算结果

将计算结果与上市公司专利数据合并:

need_calc_sample <- need_calc %>% slice(1:20)

results_list <- list()
for (id in need_calc_sample$newipzlid) {
results_list[[length(results_list) + 1]] <- calc_patent_acd_macd(id, patent_citations2)
}

acd_results <- bind_rows(results_list)

6.2 结果展示

acd_results

6.3 统计汇总

cat("=== ACD 统计 ===\n")
print(summary(acd_results$ACD))

cat("\n=== mACD 统计 ===\n")
print(summary(acd_results$mACD))

6.4 公司层面汇总

将专利层面的 ACD/mACD 汇总到公司-年份层面:

# 合并到上市公司专利数据
sspat %>%
inner_join(acd_results, by = "newipzlid") -> patent_acd

# 合并无后向引用的专利
bind_rows(
patent_acd,
sspat %>%
filter(newipzlid %in% nobackrefs$newipzlid2) %>%
mutate(ACD = 2, mACD = 2, n_t = 0, m_t = 0)
) -> all_patent_acd

# 公司-年份层面汇总
company_year_acd <- all_patent_acd %>%
group_by(股票代码, 年份) %>%
summarise(
ACD_mean = mean(ACD, na.rm = TRUE),
ACD_sd = sd(ACD, na.rm = TRUE),
mACD_mean = mean(mACD, na.rm = TRUE),
mACD_sd = sd(mACD, na.rm = TRUE),
n_patents = n(),
.groups = "drop"
)

company_year_acd

七、参考文献

  1. Funk, R. J., & Owen-Smith, J. (2017). A dynamic network measure of technological change. Management Science, 63(12), 4174-4187.
  2. 徐照宜, 巩冰, 陈彦名, 成程. 金融科技、数字化转型与企业突破性创新——基于全球专利引用复杂网络的分析[J]. 金融研究, 2023(10): 47-65.

八、附件说明

本课程提供了以下附件:

8.1 数据文件

文件名 行数 说明
具有引用与被引用信息的专利unique_newipzlid.rds 23,330,294 具有引用与被引用信息的专利ID列表
patent_citations.rds 63,020,845 原始专利引用关系数据
patent_citations2.rds 46,102,368 推荐使用:5年窗口筛选后的引用数据
nobackrefs.rds 8,277,416 无后向引用的专利(ACD=2)

8.2 代码文件

文件名 说明
计算ACD_mACD.R 单线程计算代码
计算ACD_mACD_多线程.R 多线程计算代码
合并汇总ACD_mACD.R 结果合并和汇总代码

8.3 参考文件

文件名 说明
金融科技、数字化转型与企业突破性创新——基于全球专利引用复杂网络的分析_徐照宜.pdf 参考文献
papers-and-patents-are-becoming-less-disruptive-over-time-2dlft235.pdf Funk & Owen-Smith (2017) 原文
pic1.png 论文中三种引用情况示意图
使用 R 语言测算专利的创新突破度:ACD指数和mACD指数.Rmd 本讲义文档

点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 R 语言测算专利的创新突破度:ACD指数和mACD指数

评论