使用 Stata 进行绿色专利的筛选

在前不久的课程中我们讲解了如何使用 R 语言爬取处理 WIPO 绿色专利分类数据:https://rstata.duanshu.com/#/brief/course/6edd7ed2f3284915b2c916ead3fbfd10

×

今天我们继续上次课的内容讲解如何使用得到的绿色专利列表结果进行绿色专利的筛选和统计。

×

作为演示,我们使用 2013 年的工企专利匹配结果进行操作,2000~2014 年的完整数据可以从这里下载得到:https://rstata.duanshu.com/#/brief/course/04f4aea3b97e42289e990e1ced0081bc

附件中有提供 2013 年的数据:

  1. 完整版:工企专利匹配2013(完整版).dta
  2. 汇总版:工企专利数量2013.dta

×

完整版是直接把工企数据和专利数据进行匹配,里面的一条条观测值是一条条的专利;,而汇总版是汇总每家工企申请的各种类型的专利数量以及所有专利的数量。

在上次的 使用 R 语言爬取处理 WIPO 绿色专利分类数据 的课程中,通过爬取分析,我们得到了四个文件:

  • ipcdf1.dta
  • ipcdf2.dta
  • ipcdf3.dta
  • ipcdf4.dta

下面我们来逐一根据这些列表从工企专利匹配结果中筛选绿色专利。

读取数据:

use "工企专利匹配2013(完整版).dta", clear
keep gqid zlid 分类号 主分类号
save "gqzl2013sim", replace

由于数据里面有分类号和主分类号两个字段,所以我分别根据两个字段处理得到了两份结果。

首先我们根据分类号进行筛选:

* 根据分类号筛选
use gqzl2013sim, clear
drop 主分类号

由于每个专利对应着多个分类号,分类号之间使用“;”分隔。所以首先我们需要先把分类号拆分开,这里有两种办法。

方法一:split + gather

split 分类号, parse(";")
drop 分类号
* 安装 gather:ssc install tidy
gather 分类号*
drop if missing(value)
drop var
ren value 分类号
save data1, replace

不过这种方法对于大数据的操作会非常慢,可以考虑使用循环 + append

方法二:split + forval + append

use gqzl2013sim, clear
split 分类号, parse(";")
ret list
local k_new = r(k_new)
drop 分类号 主分类号
save temp, replace

use temp, clear
keep zlid gqid 分类号1
drop if missing(分类号1)
ren 分类号1 分类号
save data2, replace

forval i = 2/`k_new' {
di "`i'"
qui {
use temp, clear
keep zlid gqid 分类号`i'
drop if missing(分类号`i')
ren 分类号`i' 分类号
append using data2
save data2, replace
}
}

这种方法虽然代码稍微复杂,但是电脑处理起来更容易,不容易卡死,两种方法会得到同样的结果。

下面我们再处理分类号:

* 删除分类号里面不需要的部分
use data2, clear
replace 分类号 = ustrregexs(1) if ustrregexm(分类号, "(.*)\(")
drop if !index(分类号, "/")
save data3, replace

* 再检查下有没有别的问题了
use data3, clear
keep if index(分类号, " ")

* 如果有问题的话再一一处理

然后我们就可以根据绿色专利列表进行筛选了。

根据 ipcdf1 进行筛选

ipcdf1 是只有大类类别的:

* 属于 ipcdf1 的
use ipcdf1.dta, clear

use data3, clear
gen class = substr(分类号, 1, 3)
merge m:1 class using ipcdf1.dta
keep if _m == 3
keep zlid gqid class l1title l2title
ren class greenIPC
save dfres1, replace

根据 ipcdf2 进行筛选

use ipcdf2.dta, clear

* use data3, clear
* gen class = substr(分类号, 1, 4)
* merge m:1 class using ipcdf2.dta

这个时候报错了,检查可以发现,ipcdf2 中的 class 是存在重复值的。所以我们这个时候需要执行 m:m 的匹配,但是我们不能使用 merge 的 m:m 匹配,因为会得到错误的结果,例如下面这个案例:

* 考虑下面两个数据
clear
input str10 name1 str3 gender
"张三" "男"
"李四" "男"
"李梅" "女"
"张楠" "女"
end
save mdata1, replace

clear
input str10 name2 str3 gender
"王五" "男"
"赵四" "男"
"王琴" "女"
"赵英" "女"
end
save mdata2, replace

use mdata1, clear
merge m:m gender using "mdata2"

可以看到,这个结果不是我们想要的。那么如何进行 m:m 的匹配呢?我们可以循环进行 m 次 1:m 的匹配或者 m 次 m:1 的匹配:

use mdata1, clear
bysort gender: gen matchid = _n
save mdata1, replace

forval i = 1/2 {
use mdata1, clear
keep if matchid == `i'
merge 1:m gender using mdata2
save matchres`i', replace
}

use matchres1, clear
append using matchres2
drop _m matchid

这样就得到了所有同性别的组合了。

那么我们现在如果想进行 m:m 的匹配也要这样做:

use ipcdf2.dta, clear
bysort class: gen matchid = _n
save ipcdf2a, replace
tab matchid

use data3, clear
gen class = substr(分类号, 1, 4)
save data3, replace

forval i = 1/2 {
use ipcdf2a.dta, clear
keep if matchid == `i'
merge 1:m class using data3
save matchres`i', replace
}

* 合并结果
use matchres1, clear
append using matchres2

keep if _m == 3
keep zlid gqid class l1title l2title l3title l4title
ren class greenIPC
save dfres2, replace

ipcdf3 和 ipcdf4 可以合并起来处理

ipcdf3 和 ipcdf4 都是具体的分类号,可以合并起来处理:

use ipcdf3, clear
append using ipcdf4
gen 分类号 = class + IPC
order 分类号

* 检查分类号的重复性
duplicates report 分类号
bysort 分类号: gen matchid = _n
tab matchid
save ipcdf5, replace

* 循环匹配
forval i = 1/4 {
use ipcdf5.dta, clear
keep if matchid == `i'
merge 1:m 分类号 using data3
save matchres`i', replace
}

use matchres1, clear
forval i = 2/4 {
append using matchres`i'
}
keep if _m == 3
keep zlid gqid class l1title l2title l3title l4title l5title
ren class greenIPC
save dfres5, replace

合并所有的结果

最后合并所有的结果就可以了:

* 合并所有的结果
use dfres1, clear
append using dfres2
append using dfres5
* 如果想删除重复值,可以:
* duplicates drop zlid gqid, force
save 基于分类号筛选的绿色专利.dta, replace

类似的方法就可以根据主分类号进行筛选了,而且更为简单(不需要拆分分类号了):

* 根据主分类号筛选
use gqzl2013sim, clear
drop 分类号

* 为了直接使用上面的代码,把主分类号重命名为 分类号
ren 主分类号 分类号
save data2, replace

* 下面我们再处理分类号
* 删除分类号里面不需要的部分
use data2, clear
replace 分类号 = ustrregexs(1) if ustrregexm(分类号, "(.*)\(")
drop if !index(分类号, "/")
save data3, replace

* 绿色专利筛选
* 属于 ipcdf1 的
use ipcdf1.dta, clear

use data3, clear
gen class = substr(分类号, 1, 3)
merge m:1 class using ipcdf1.dta
keep if _m == 3
keep zlid gqid class l1title l2title
ren class greenIPC
save dfres1, replace

* 属于 ipcdf2 的
use ipcdf2.dta, clear
bysort class: gen matchid = _n
save ipcdf2a, replace
tab matchid

use data3, clear
gen class = substr(分类号, 1, 4)
save data3, replace

forval i = 1/2 {
use ipcdf2a.dta, clear
keep if matchid == `i'
merge 1:m class using data3
save matchres`i', replace
}

* 合并结果
use matchres1, clear
append using matchres2

keep if _m == 3
keep zlid gqid class l1title l2title l3title l4title
ren class greenIPC
save dfres2, replace

* ipcdf3 和 ipcdf4 可以合并起来处理
use ipcdf3, clear
append using ipcdf4
gen 分类号 = class + IPC
order 分类号

* 检查分类号的重复性
duplicates report 分类号
bysort 分类号: gen matchid = _n
tab matchid
save ipcdf5, replace

* 循环匹配
forval i = 1/4 {
use ipcdf5.dta, clear
keep if matchid == `i'
merge 1:m 分类号 using data3
save matchres`i', replace
}

use matchres1, clear
forval i = 2/4 {
append using matchres`i'
}
keep if _m == 3
keep zlid gqid class l1title l2title l3title l4title l5title
ren class greenIPC
save dfres5, replace

* 合并所有的结果
use dfres1, clear
append using dfres2
append using dfres5
* 如果想删除重复值,可以:
* duplicates drop zlid gqid, force
save 基于主分类号筛选的绿色专利.dta, replace

然后我们就可以统计各种类型绿色专利的数量了。这里以“基于主分类号筛选的绿色专利.dta”为例:

use 基于主分类号筛选的绿色专利.dta, clear
duplicates drop zlid gqid, force
merge 1:1 zlid gqid using "工企专利匹配2013(完整版).dta"
keep if _m == 3
collapse (count) zlid, by(gqid 专利类型)
spread 专利类型 zlid
* 安装 spread:ssc install tidy
* 这里可能会报错,因为 spread 认为中文不能作为变量名
* 可以运行 adoedit spread 修改里面检查变量名称部分的代码
* 也就是注释掉 52~56 行
/* if `r(N)' > 0 {
levelsof `variable' if `temp' == 1
display as error `"Some observations for `variable' don't have valid variable names: `=r(levels)'"'
exit 4
} */
* 然后保存之后再 clear all 就行

ren 发明型专利 发明型绿色专利
ren 实用型专利 实用型绿色专利
gen 绿色专利数量 = 发明型绿色专利 + 实用型绿色专利
replace 发明型绿色专利 = 0 if missing(发明型绿色专利)
replace 实用型绿色专利 = 0 if missing(实用型绿色专利)
replace 绿色专利数量 = 0 if missing(绿色专利数量)
save "2013年各公司绿色专利数量", replace

use 工企专利数量2013.dta, clear
merge 1:1 gqid using "2013年各公司绿色专利数量"
order gqid 年份 设计型专利 发明型专利 实用型专利 总专利数量 发明型绿色专利 实用型绿色专利 绿色专利数量

replace 发明型绿色专利 = 0 if missing(发明型绿色专利)
replace 实用型绿色专利 = 0 if missing(实用型绿色专利)
replace 绿色专利数量 = 0 if missing(绿色专利数量)

save 工企绿色专利数量2013.dta, replace

最后删除掉所有的临时文件:

* 删去无用的文件
cap erase data1.dta
cap erase data2.dta
cap erase data3.dta
cap erase dfres1.dta
cap erase dfres5.dta
cap erase dfres2.dta
cap erase gqzl2013sim.dta
cap erase ipcdf2a.dta
cap erase matchres1.dta
cap erase matchres2.dta
cap erase matchres3.dta
cap erase matchres4.dta
cap erase mdata1.dta
cap erase mdata2.dta
cap erase temp.dta
cap erase ipcdf5.dta

按照这个方法循环所有的年份即可。

点击这里跳转到 RStata 短书平台获取附件:使用 Stata 进行绿色专利的筛选

评论