名师讲堂|专利的前向相似度与后向相似度:使用 Stata 计算专利关键数字技术突破创新指标(三)

上次课程主页:https://rstata.duanshu.com/#/course/fb64d7abf9c74710a7e6fffde4d2e136

继续上次课的内容,今天我们继续讲解第三部分:

专利的前向相似度与后向相似度:使用 Stata 计算专利关键数字技术突破创新指标(三):使用并行技术提升计算速度。

在之前的课程「使用 Stata 进行地理编码:地址解析经纬度、坐标转换 & 根据经纬度判断所处的省市区县」中,我给大家介绍过使用 parallel 进行并行的方法。今天我们再来介绍下 Mata 程序中如何使用并行技术提升速度。

使用 Stata 进行地理编码:地址解析经纬度、坐标转换 & 根据经纬度判断所处的省市区县:https://rstata.duanshu.com/#/brief/course/537300af1a9947edb758789785c600f3

上次课的结尾我们给出了计算所有专利相似度的 Mata 代码:

cd "~/Desktop/专利的前向相似度与后向相似度:使用 Stata 计算专利关键数字技术突破创新指标(三)"
*> /Users/ac/Desktop/专利的前向相似度与后向相似度:使用 Stata 计算专利关键数字技术突破创新指标(三)
use tempdata7, clear
*> (数据处理:微信公众号 RStata)
*- 抽样 0.5%
sample 0.5
*> (583,361 observations deleted)
*- 如果 group 相等,那么就是同样的属性
egen group = group(人工智能技术 元宇宙技术 区块链技术 工业互联网技术 物联网技术 量子信息技术 高端芯片技术)
destring newipzlid, replace
*> newipzlid: all characters numeric; replaced as double
mata:
data = st_data(., .)
// 提取专利编号、申请日和属性
patent_id = data[., 1]
application_date = data[., 2]
attributes = data[., 3..cols(data)]

stata("cap erase res2.csv")
filename = "res2.csv"
fh = fopen(filename, "rw")
for(i = 1; i <= rows(data); i++) {
i
index_p = selectindex(application_date :< application_date[i])
index_l = selectindex(application_date :> application_date[i])

M_p = attributes[index_p, .]
M_l = attributes[index_l, .]

// 互不相同的行
M_p2 = uniqrows(M_p)
M_l2 = uniqrows(M_l)

// 各行的数量(需要循环统计)
freq_p = J(rows(M_p2), 1, .)
for (j=1; j<=rows(M_p2); j++) {
freq_p[j] = colsum(M_p[., 8] :== M_p2[j, 8])
}

freq_l = J(rows(M_l2), 1, .)
for (j=1; j<=rows(M_l2); j++) {
freq_l[j] = colsum(M_l[., 8] :== M_l2[j, 8])
}

// 去除最后一列
M_p3 = M_p2[., 1..7]
M_l3 = M_l2[., 1..7]
attributes3 = attributes[., 1..7]

cos_p = (attributes3[i, .] * M_p3') :/ (sqrt(attributes3[i, .] * attributes3[i, .]') :* sqrt(diagonal(M_p3 * M_p3')'))
cos_l = (attributes3[i, .] * M_l3') :/ (sqrt(attributes3[i, .] * attributes3[i, .]') :* sqrt(diagonal(M_l3 * M_l3')'))
fput(fh, invtokens(strofreal((patent_id[i], application_date[i], rowsum(cos_p :* freq_p'), rowsum(cos_l :* freq_l')), "%16.12g"), ","))
}
end

import delimited using res2.csv, clear

在 Stata 中可以使用 parallel 命令进行并行运算,安装方法如下:

net install st0572.pkg, from("http://www.stata-journal.com/software/sj19-3") replace

注意不要用 ssc install 安装,ssc 上的 parallel 和我介绍的这个用法不同。

如果我们是直接下载文件,直接保存相应的循环代码,然后 parallel do … 就好了,但是这里我们是需要把所有的结果保存到单个 csv 文件里面,如果直接这样做,结果会乱掉。因此我们需要修改下代码,也就是每个进程的结果保存到各自的文件里面。para_matacode.do 里面的代码就是修改好的:

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

worker_id = st_global("pll_instance") 代码可以从 Stata 的环境中提取每个进程的编号,然后就可以每个进程保存不同的 csv 文件了。在代码的结尾我还设置了直接把 csv 文件直接转换成 dta 的程序。

cap mkdir "csv"
cap mkdir "dta"

parallel initialize 16, force
parallel do para_matacode.do
parallel clean

parallel initialize 16, force 表示创建了 16 个线程,这个数量需要根据自己电脑的配置设定,并非越多越好。可以运行下面的代码查看可用进程数量:

c(processors_mach)

para_matacode.do 就是前面展示的 Mata 代码。

parallel clean 用于清除多线程运算过程中产生的相关文件。

另外有个非常重要的注意事项。在 Windows 电脑上,parallel 的使用要求工作目录中不能出现中文,最好相关的文件名称也不要有中文。否则可能会报错。

合并结果:

appendall dta

appendall 的源代码在附件中也有提供。

ren (v1 v2 v3 v4) (newipzlid date BS FS)
format date %tdCY-N-D

gen tp = FS / BS

这样就计算得到了每个专利的突破性创新指标。不过这里我没有限定时间范围,想要限定时间范围可以参考上次课程修改。

点击这里跳转到 RStata 短书平台获取附件:名师讲堂|专利的前向相似度与后向相似度:使用 Stata 计算专利关键数字技术突破创新指标(三)

评论