本次课程在原始 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 指数的问题
- 从未被引用的专利 CD = 0:这与”渐进性专利”的 CD = -1 混淆
- 正负值相抵:多个专利的 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 处理代码示例
以下是数据处理的关键步骤代码:
df1 <- read_rds("全部专利引用与被引用信息分年.rds")
df2 <- df1 %>% mutate( 公开公告号_original = str_remove(公开公告号_original, "[A-Z]$"), 公开公告号 = str_remove(公开公告号, "[A-Z]$") ) %>% distinct(公开公告号_original, 公开公告号, .keep_all = TRUE)
|
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)
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 <- 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 <- parta + partb m_t <- parta + partb + partc
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
|
七、参考文献
- Funk, R. J., & Owen-Smith, J. (2017). A dynamic network measure of technological change. Management Science, 63(12), 4174-4187.
- 徐照宜, 巩冰, 陈彦名, 成程. 金融科技、数字化转型与企业突破性创新——基于全球专利引用复杂网络的分析[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指数
评论