名师讲堂|使用 Stata 测算数实融合水平(一):基于示例数据

之前给大家讲解了如何使用 Stata 测算数实融合水平,不过里面的计算方法有些问题,所以赶紧更正下。

今天给大家分享一下「新质生产力背景下数实融合的测算与时空比较——基于专利共分类方法的研究」一文中的数实融合水平指标的 Stata 计算方法,不过由于论文中关于指标计算的一些细节描述的较为含糊,所以计算过程中的一些处理方法还有待探讨,感兴趣的小伙伴也可以说说自己的想法。

按照论文的介绍,数实融合水平的测算过程如下所示:

由于内容较多,本课程会分三次进行讲解:

  1. 使用 Stata 测算数实融合水平(一):基于示例数据
  2. 使用 Stata 测算数实融合水平(二):基于真实专利数据
  3. 使用 Stata 测算数实融合水平(三):分城市、产业计算数实融合

今天我们先从最简单的示例开始。

准备示例数据

按照上面的示意图。计算数实融合需要下面三个数据:

一是各个专利的分类号:

*- 3 个专利
clear all
input str2 id str20 ipc
"P1" "IPC1;IPC3"
"P2" "IPC1;IPC2"
"P3" "IPC1;IPC2;IPC3"
end
compress
save 专利示例数据_示例, replace

二是 IPC 分类号与产业对照表:

clear all
input str4 uniq_ipc str20 industry
"IPC1" "I1"
"IPC2" "I2;I3"
"IPC3" "I3;I4"
end
compress
save IPC与产业对照表_示例, replace

不过使用下面的表达方式处理起来会更简单:

clear all
input str4 uniq_ipc str20 industry
"IPC1" "I1"
"IPC2" "I2"
"IPC2" "I3"
"IPC3" "I3"
"IPC3" "I4"
end
compress
save IPC与产业对照表_示例2, replace

这样样式也更接近我们后面使用的真实专利数据。

clear all
input str4 uniq_industry str20 class
"I1" "数字产业"
"I2" "数字产业"
"I3" "实体产业"
"I4" "实体产业"
end
compress
save 产业分类表_示例, replace

计算 IPC 融合矩阵

根据文献的介绍,IPC 融合矩阵的结果就是如果两个 IPC 号出现在一个专利的分类号上,返回 1,否则返回 0。因此我们可以使用 Mata 的代码循环各个专利,分别获取每个分类号里面的 IPC 组合,合并再统计数量。考虑到后面基于真实年份计算的时候要循环年份,而循环中不能出现 end,所以这里我们可以把 mata 代码放到一个 do 文件里面:matacode1.do,然后在主程序中使用 do matacode1.do 调用:

use 专利示例数据_示例, clear
gen _freq = 1
qui do matacode1.do

matacode1.do 的代码如下:

mata:
mata clear
ipc = st_sdata(., "ipc")
value = st_data(., "_freq")
// 保存到 res1 文件里面
stata("cap erase res1.csv")
filename = "res1.csv"
fh = fopen(filename, "rw")

for (r = 1; r <= rows(ipc); r++) {
fullcombinations = J(0, 3, "")
class_list = colshape(ustrsplit(ipc[r, 1], ";"), 1)
n_classes = rows(class_list)
if (n_classes == 2) {
fullcombinations = fullcombinations \ (class_list[1,1], class_list[2,1], strofreal(value[r,1]))
fullcombinations = fullcombinations \ (class_list[2,1], class_list[1,1], strofreal(value[r,1]))
}
if (n_classes > 2) {
combinations = J(n_classes * n_classes, 3, "")
row_index = 1

for (i = 1; i <= n_classes; i++) {
for (j = 1; j <= n_classes; j++) {
combinations[row_index, 1] = class_list[i,1]
combinations[row_index, 2] = class_list[j,1]
combinations[row_index, 3] = strofreal(value[r,1])
row_index++
}
}
fullcombinations = fullcombinations \ combinations
}
for (i = 1; i <= rows(fullcombinations); i++) {
fput(fh, invtokens(fullcombinations[i, .], ","))
}
}
fclose(fh)
end

和上次的课程不太一样,这次我选择了直接把结果保存为一个 csv 文件。

读取处理得到的 csv 文件:

import delimited using "res1.csv", clear
*> (encoding automatically selected: UTF-8)
*> (3 vars, 13 obs)
ren (v1 v2 v3) (ipc1 ipc2 value)
destring, replace
*> ipc1: contains nonnumeric characters; no replace
*> ipc2: contains nonnumeric characters; no replace
*> value already numeric; no replace
compress
*> (0 bytes saved)
collapse (sum) value, by(ipc1 ipc2)
drop if ipc1 == ipc2
*> (3 observations deleted)
save ipcmat, replace
*> file ipcmat.dta saved
list
*> +---------------------+
*> | ipc1 ipc2 value |
*> |---------------------|
*> 1. | IPC1 IPC2 2 |
*> 2. | IPC1 IPC3 2 |
*> 3. | IPC2 IPC1 2 |
*> 4. | IPC2 IPC3 1 |
*> 5. | IPC3 IPC1 2 |
*> |---------------------|
*> 6. | IPC3 IPC2 1 |
*> +---------------------+

计算行业共现矩阵

分别把两个 ipc 变量和 IPC与产业对照表_示例2 匹配即可:

use ipcmat, clear
ren ipc1 uniq_ipc
ren ipc2 uniq_ipc2
joinby uniq_ipc using IPC与产业对照表_示例2, unmatched(master)
drop _m uniq_ipc
ren industry industry1
ren uniq_ipc2 uniq_ipc
joinby uniq_ipc using IPC与产业对照表_示例2, unmatched(master)
drop _m uniq_ipc
ren industry industry2
collapse (sum) value, by(industry1 industry2)
drop if industry1 == industry2
*> (1 observation deleted)
save industrymat, replace
*> file industrymat.dta saved
list
*> +-----------------------------+
*> | indust~1 indust~2 value |
*> |-----------------------------|
*> 1. | I1 I2 2 |
*> 2. | I1 I3 4 |
*> 3. | I1 I4 2 |
*> 4. | I2 I1 2 |
*> 5. | I2 I3 1 |
*> |-----------------------------|
*> 6. | I2 I4 1 |
*> 7. | I3 I1 4 |
*> 8. | I3 I2 1 |
*> 9. | I3 I4 1 |
*> 10. | I4 I1 2 |
*> |-----------------------------|
*> 11. | I4 I2 1 |
*> 12. | I4 I3 1 |
*> +-----------------------------+

计算数实融合

然后我们就可以根据公式计算数实融合水平了:

use industrymat, clear
ren industry1 uniq_industry
merge m:1 uniq_industry using 产业分类表_示例
*> Result Number of obs
*> -----------------------------------------
*> Not matched 0
*> Matched 12 (_merge==3)
*> -----------------------------------------
keep if _m == 3
*> (0 observations deleted)
drop _m
ren uniq_industry industry1
ren class class1
ren industry2 uniq_industry
merge m:1 uniq_industry using 产业分类表_示例
*> Result Number of obs
*> -----------------------------------------
*> Not matched 0
*> Matched 12 (_merge==3)
*> -----------------------------------------
keep if _m == 3
*> (0 observations deleted)
drop _m
ren uniq_industry industry2
ren class class2
drop if value == 0
*> (0 observations deleted)
*- 分别的行业数量
bysort class1: egen freq1 = nvals(industry1)
bysort class2: egen freq2 = nvals(industry2)
list
*> +-------------------------------------------------------------------+
*> | indust~1 indust~2 value class1 class2 freq1 freq2 |
*> |-------------------------------------------------------------------|
*> 1. | I4 I3 1 实体产业 实体产业 2 2 |
*> 2. | I2 I3 1 数字产业 实体产业 2 2 |
*> 3. | I1 I3 4 数字产业 实体产业 2 2 |
*> 4. | I1 I4 2 数字产业 实体产业 2 2 |
*> 5. | I2 I4 1 数字产业 实体产业 2 2 |
*> |-------------------------------------------------------------------|
*> 6. | I3 I4 1 实体产业 实体产业 2 2 |
*> 7. | I3 I1 4 实体产业 数字产业 2 2 |
*> 8. | I2 I1 2 数字产业 数字产业 2 2 |
*> 9. | I4 I1 2 实体产业 数字产业 2 2 |
*> 10. | I4 I2 1 实体产业 数字产业 2 2 |
*> |-------------------------------------------------------------------|
*> 11. | I1 I2 2 数字产业 数字产业 2 2 |
*> 12. | I3 I2 1 实体产业 数字产业 2 2 |
*> +-------------------------------------------------------------------+
*- 汇总统计
collapse (sum) value (first) freq1 (first) freq2, by(class1 class2)
gen RH = value / (freq1 * freq2)
gen class = "数实融合" if class1 != class2
*> (2 missing values generated)
replace class = "数数融合" if class1 == "数字产业" & class2 == "数字产业"
*> (1 real change made)
replace class = "实实融合" if class1 == "实体产业" & class2 == "实体产业"
*> (1 real change made)
keep class RH
duplicates drop _all, force
*> Duplicates in terms of RH class
*> (1 observation deleted)
list
*> +---------------+
*> | RH class |
*> |---------------|
*> 1. | .5 实实融合 |
*> 2. | 2 数实融合 |
*> 3. | 1 数数融合 |
*> +---------------+

这样我们就计算出来该示例数据的数实融合水平为 2,数数融合水平为 1,实实融合水平为 0.5。

下次课我们再继续讲解基于真实专利数据的计算。

点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 Stata 测算数实融合水平(一):基于示例数据

评论