没有专利被引用量指标如何衡量专利质量?或许可以这样!附 Stata 代码!
如何在中国情境下有效测算企业不同类型专利的质量,是研究者普遍面临的一个难题。既有文献普遍采用专利被引用次数来表示企业专利的质量(Hsu et al., 2014)。然而,中国国家知识产权的企业专利数据库无法准确有效地提供企业专利被引用次数信息,这就需要重新寻找适合中国情境下企业专利质量测算的新思路。观察和借鉴 Aghion et al. (2015) 、Akcigit et al. (2016) 等文献最新使用的专利宽度法,为我们提供了这样一种新的测算视角———知识宽度法。
上面这段内容摘选自张杰、郑文平(2020)「创新追赶战略抑制了中国专利质量么?」。
前不久我们分享了两份 1998~2013 年工企与专利匹配的数据,详情可以阅读下面两篇推文:
使用第二篇推文介绍的数据就可以计算企业专利质量了。
具体的计算方法又分成两种:
方法一:直接企业层面
一种是李宏、王云廷等(2021,世界经济)中介绍的方法:
在大组层面(使用主专利号提取)上定义企业专利知识宽度为:
其中, 为企业 截至 年在 大组下发明与实用新型申请专利的累计数目, 为企业 截至 年在全部大组下申请专利的累计数目。 的值越大,说明企业专利的知识宽度越大,专利质量越高。
这样直接就可以得到企业-年份层面的专利质量数据了。
方法二:专利层面 -> 企业层面
另一种是张杰、郑文平(2020)中介绍的方法:
采取大组层面(使用分类号提取)的赫芬达尔—赫希曼指数(HH)的逻辑思路对其进行加权,企业专利知识宽度的具体计算方法为:
其中, 表示专利分类号中各大组分类所占比重。可以看出,越大,各个大组层面的专利分类号之间的差异越大,即表明企业创造专利所运用的知识宽度越大,其专利质量可能就表现为越高。
经过上面的计算可以得到专利层面的知识宽度信息,然后可以汇总到企业层面,具体来说又分为两种,均值法和中位数方法。
Stata 实现
下面我们一起来看一下这两种方法的 Stata 实现。
李宏、王云廷等(2021,世界经济)法
首先我们从 RStata 平台(点击阅读原文跳转)上下载 1998~2013年工企与专利匹配、各工企专利申请数量等数据 推文介绍的两份数据:
1998~2009工企数据库和专利数据库匹配结果(仅有匹配到专利的企业).dta 2010~2013工企数据库和专利数据库匹配结果(仅有匹配到专利的企业).dta
读取数据然后把所有的字符串变量都以 %10s 的格式显示:
use '1998~2009工企数据库和专利数据库匹配结果(仅有匹配到专利的企业).dta', clear
foreach i of varlist _all {
cap format `i' %10s
}
保留我们需要的几个变量:
keep 年份 企业匹配唯一标识码 企业名称 组织机构代码 patent_type 主分类号

由于企业匹配唯一标识码变量有一些缺失的,我们检查下这些缺失的在其它年份是否有不缺失的,可以尝试填补缺失值,如果没有填补上说明这个缺失企业匹配唯一标识码的在其它年份都没有数据:
bysort 企业名称: carryforward 企业匹配唯一标识码 if !missing(企业名称), replace
bysort 组织机构代码: carryforward 企业匹配唯一标识码 if !missing(组织机构代码), replace
``
确实没有一个填补成功,所以下面我们可以直接使用组织机构代码进行填补:
```stata
gsort 企业匹配唯一标识码 企业名称 组织机构代码 年份
count if missing(企业匹配唯一标识码)
replace 企业匹配唯一标识码 = 组织机构代码 if missing(企业匹配唯一标识码)
这里面的逻辑是如果这些缺失企业匹配唯一标识码的观测值在其它年份企业匹配唯一标识码变量不缺失,那么我们应该使用不缺失的值填补缺失的,而如果其它年份没有,等于我们需要为这些企业再生成一个企业匹配唯一标识码,使用组织机构代码即可(少有企业会改变组织机构代码)。
按照李宏、王云廷等(2021,世界经济)论文中介绍的思路,我们先生成大组变量、计算 和 :
* 生成大组变量gen 大组 = ustrregexs(1) if ustrregexm(主分类号, '(.*)/')* 计算 Zimt:企业每年每个大组非设计型专利的数量bysort 企业匹配唯一标识码 年份 大组: egen Zimt = sum(patent_type != 'd')* 计算 Zit:企业每年的总专利数量bysort 企业匹配唯一标识码 年份: egen Zit = count(企业匹配唯一标识码)order 年份 企业匹配唯一标识码 Zimt Zit 大组
然后就可以计算知识宽度了:
* Zimt 已经加总到了 i m t 层面,所以删除重复值(只保留每组的最后一个观测值)
bysort 企业匹配唯一标识码 年份 大组: keep if _n == _N
gen z1 = (Zimt / Zit) ^ 2
bysort 企业匹配唯一标识码 年份: egen z2 = sum(z1)
gen patent_knowledge = 1 - z2
order 年份 企业匹配唯一标识码 patent_knowledge Zimt Zit 大组 z1 z2
gsort patent_knowledge 企业匹配唯一标识码 企业名称 年份
由于外观设计专利并不能体现创新水平(或者说没那么强的体现效力),所以删除没有发明或实用专利的企业:
drop if Zimt == 0* hist patent_knowledge keep 年份 企业匹配唯一标识码 patent_knowledge 企业名称 组织机构代码save 企业层面专利宽度9809, replace
这样我们就得到了 98~09 年的企业-年份层面专利宽度数据。下面使用类似的方法计算 10~13 年的:
* 计算 2010-2013 年的
use '2010~2013工企数据库和专利数据库匹配结果(仅有匹配到专利的企业).dta', clear
foreach i of varlist _all {
cap format `i' %10s
}
keep 年份 企业匹配唯一标识码 企业名称 组织机构代码 专利类型原有 主分类号
gen patent_type = 'i' if inlist(专利类型原有, 1, 8)
replace patent_type = 'u' if inlist(专利类型原有, 2, 9)
replace patent_type = 'd' if inlist(专利类型原有, 3)
drop 专利类型原有
* 生成大组变量
gen 大组 = ustrregexs(1) if ustrregexm(主分类号, '(.*)/')
* 计算 Zimt:企业每年每个大组非设计型专利的数量
bysort 企业匹配唯一标识码 年份 大组: egen Zimt = sum(patent_type != 'd')
* 计算 Zit:企业每年的总专利数量
bysort 企业匹配唯一标识码 年份: egen Zit = count(企业匹配唯一标识码)
order 年份 企业匹配唯一标识码 Zimt Zit 大组
* 计算知识宽度
* Zimt 已经加总到了 i m t 层面,所以删除重复值(只保留每组的最后一个观测值)
bysort 企业匹配唯一标识码 年份 大组: keep if _n == _N
gen z1 = (Zimt / Zit) ^ 2
bysort 企业匹配唯一标识码 年份: egen z2 = sum(z1)
gen patent_knowledge = 1 - z2
order 年份 企业匹配唯一标识码 patent_knowledge Zimt Zit 大组 z1 z2
gsort patent_knowledge 企业匹配唯一标识码 企业名称 年份
* 删除没有发明或实用专利的企业
drop if Zimt == 0
keep 年份 企业匹配唯一标识码 patent_knowledge 企业名称 组织机构代码
save 企业层面专利宽度1013, replace
然后我们再合并两份数据:
* 合并两份数据use 企业层面专利宽度9809, clear append using 企业层面专利宽度1013
再检查刚刚企业匹配唯一标识码缺失的填补是否有问题(因为这里又把 10~13 年的数据使用上了):
replace 企业匹配唯一标识码 = '' if 企业匹配唯一标识码 == 组织机构代码
bysort 企业名称: carryforward 企业匹配唯一标识码 if !missing(企业名称), replace
bysort 组织机构代码: carryforward 企业匹配唯一标识码 if !missing(组织机构代码), replace
* 无法填充,说明这些缺失的在其他年份也是没数据的
replace 企业匹配唯一标识码 = 组织机构代码 if missing(企业匹配唯一标识码)
bysort 企业匹配唯一标识码 年份: keep if _n == _N
save 企业年份层面专利宽度_方法1, replace
查看分布:
tw hist patent_knowledge, by(年份) || ///kdensity patent_knowledge, by(年份, ///ti(1998~2013年企业专利宽度分布) ///subti('计算:微信公众号 RStata') /// leg(off) note('') ///caption('数据来源:中国工业企业数据库、中国知识产权专利数据库')) ///xla(0(0.2)1, format(%6.1f)) ///xti('专利知识宽度') yti('密度')
gr export patent_knowledge_hist.png, replace width(1200)

另外如果想得到企业层面的截面数据可以使用均值法或者中位数法:
* 加总到企业层面
* 均值法
bysort 企业匹配唯一标识码: egen patent_knowledge_mean = mean(patent_knowledge)
* 中位数法
bysort 企业匹配唯一标识码: egen patent_knowledge_median = median(patent_knowledge)
bysort 企业匹配唯一标识码: keep if _n == _N
order 企业匹配唯一标识码 组织机构代码 企业名称 patent_knowledge*
keep 企业匹配唯一标识码 企业名称 patent_knowledge_mean patent_knowledge_median 组织机构代码
save 企业层面专利宽度, replace
张杰、郑文平(2020)法
按照 gather 命令的方法是:
ssc install tidy
下面的代码中 gather 命令的运行需要较大的电脑内存(估计需要 64G),因为 gather 之后的观测值数目多达 6000 万。
这个方法我们需要使用的变量是分类号而不是主分类号:
use '1998~2009工企数据库和专利数据库匹配结果(仅有匹配到专利的企业).dta', clear
foreach i of varlist _all {
cap format `i' %10s
}
keep 年份 企业匹配唯一标识码 企业名称 组织机构代码 patent_type 分类号
* 删除设计型专利
drop if patent_type == 'd'
split 分类号, parse(;)
gen patentid = _n
drop 分类号
gather 分类号*
drop if value == ''
save temp, replace
use temp, clear
* 提取
gen 大组 = ustrregexs(1) if ustrregexm(value, '(.*)/')
* 计算每个专利的分类号数量
bysort patentid: egen z1 = count(patentid)
bysort patentid 大组: egen z2 = count(patentid)
bysort patentid 大组: keep if _n == _N
gen z3 = z2 / z1
* 计算 z3 的和
bysort patentid: egen z4 = sum(z3^2)
gen patent_knowledge = 1 - z4
hist patent_knowledge
bysort patentid: keep if _n == _N
drop z* v*
drop 大组
save 专利层面专利宽度9809, replace
然后再使用同样的方法计算 10~13 年的:
use '2010~2013工企数据库和专利数据库匹配结果(仅有匹配到专利的企业).dta', clear foreach i of varlist _all {cap format `i' %10s}
keep 年份 企业匹配唯一标识码 企业名称 组织机构代码 专利类型原有 分类号gen patent_type = 'i' if inlist(专利类型原有, 1, 8)replace patent_type = 'u' if inlist(专利类型原有, 2, 9)replace patent_type = 'd' if inlist(专利类型原有, 3)
keep 年份 企业匹配唯一标识码 企业名称 组织机构代码 patent_type 分类号
* 删除设计型专利drop if patent_type == 'd'
split 分类号, parse(;)gen patentid = _ndrop 分类号gather 分类号*drop if value == ''save temp2, replace
use temp2, clear* 提取gen 大组 = ustrregexs(1) if ustrregexm(value, '(.*)/')
* 计算每个专利的分类号数量bysort patentid: egen z1 = count(patentid)bysort patentid 大组: egen z2 = count(patentid)bysort patentid 大组: keep if _n == _Ngen z3 = z2 / z1
* 计算 z3 的和bysort patentid: egen z4 = sum(z3^2)gen patent_knowledge = 1 - z4hist patent_knowledgebysort patentid: keep if _n == _N
drop z* v*drop 大组save 专利层面专利宽度1013, replace
然后我们再把两份数据合并起来:
* 合并两份数据
use 专利层面专利宽度9809, clear
append using 专利层面专利宽度1013
save 专利层面专利宽度, replace
这样我们得到的专利知识宽度是专利层面的数据,如果想汇总成企业层面的,可以用均值法或中位数法:
* 汇总到企业层面use 专利层面专利宽度, clear replace 企业匹配唯一标识码 = 组织机构代码 if missing(企业匹配唯一标识码)
* 加总到企业层面* 均值法bysort 企业匹配唯一标识码 年份: egen patent_knowledge_mean = mean(patent_knowledge)bysort 企业匹配唯一标识码 年份: egen patent_knowledge_median = median(patent_knowledge)bysort 企业匹配唯一标识码 年份: keep if _n == _N keep 企业匹配唯一标识码 企业名称 patent_knowledge_mean patent_knowledge_median 组织机构代码 年份save 企业年份层面专利宽度, replace
同样,我们绘制一幅多年分布图查看下:
tw hist patent_knowledge_median, by(年份) || ///
kdensity patent_knowledge_median, by(年份, ///
ti(1998~2013年企业专利宽度分布(方法二)) ///
subti('计算:微信公众号 RStata') ///
leg(off) note('') ///
caption('数据来源:中国工业企业数据库、中国知识产权专利数据库')) ///
xla(0(0.2)1, format(%6.1f)) ///
xti('企业专利知识宽度') yti('密度')
gr export firm_patent_knowledge_hist2.png, replace width(1200)
