名师讲堂|使用 Stata 计算专利技术空间相似度、企业层面的知识宽度、新技术空间专利申请及IPC号新增数

教育   教育   2024-11-02 14:14   安徽  

该课程已经讲解完,感兴趣的小伙伴可以点击文末的阅读原文跳转至 RStata 平台观看视频讲解~

今天给大家分享一下 2023 年「中国工业经济」第一期<网络基础设施建设、信息可得性与企业创新边界>论文中提到的一些指标:

下面我们以 2000~2004 年工企专利匹配结果为例来演示如何使用 Stata 计算这四个指标:

  1. 专利技术相似度;
  2. 企业层面的知识宽度指标;
  3. 企业每年的新技术领域专利申请数量;
  4. IPC 号新增数。

专利技术相似度

首先我们需要提取 IPC 分类号的前 4 位,然后统计每家企业每年各类别专利申请的数量和比例:

use "2000~2004年工企与专利数据匹配结果.dta"clear 

*- 生成个体变量
order 企业匹配唯一标识码
egen group = group(企业匹配唯一标识码)

*- 去除重复的专利
replace 公开公告号 = subinstr(公开公告号, "A""", .)
replace 公开公告号 = subinstr(公开公告号, "B""", .)
replace 公开公告号 = subinstr(公开公告号, "U""", .)
replace 公开公告号 = subinstr(公开公告号, "S""", .)
replace 专利类型 = "发明" if index(专利类型, "发明")

*- 使用 duplicates drop 去除重复的
duplicates drop group 年份 公开公告号, force 

*- 使用主分类号的前 4 位
gen class = substr(主分类号, 1, 4) 

*- 删除设计专利
drop if index(专利类型, "设计")

drop if missing(class

*- 统计每个公司每年每种类别专利的数量
destring newzlid, replace 
ren 年份 year 
collapse (count) num = newzlid, by(group year class)

*- 总数量
bysort group year: egen sum = sum(num)

*- 比例
gen ratio = num / sum 

drop sum num 
spread class ratio 

*- 缺失值替换成 0
foreach i of varlist _all {
 cap replace `i' = 0 if mi(`i')


*- 由于企业申请专利的年份并不连续,所以生成一个新的年份
gsort group year
bysort group: gen newyear = _n 
order group newyear 
save data0, replace 

由于企业并不一定是每年都有专利申请,所以上面的代码中我生成了一个 newyear 变量,这样方便后面计算企业当年和上一个申请专利的年份的专利技术相似度。

下面我们先以两年的数据为例:

*- 第一、二年的数据
use data0, clear 
keep if inlist(newyear, 1, 2) 

*- 保留两年都有数据的
bysort group: egen max = max(newyear)
drop if max == 1 
drop max 
gsort group newyear 
save temp, replace

*- 第一年的
use temp, clear 
keep if newyear == 1 
drop newyear year 
save temp1, replace 

*- 第二年的
use temp, clear 
keep if newyear == 2 
drop newyear year 
save temp2, replace 

使用 mkmat 可以把这个数据后面的变量转换成矩阵:

clear all 
use temp1, clear 
mkmat A01B - H05K, mat(m1) 

use temp2, clear 
mkmat A01B - H05K, mat(m2)

我们来思考下这个专利技术相似度的计算过程:

如果我们把这个矩阵和其转置矩阵相乘,可以得到:

也就是说相乘之后得到的矩阵对角线就是 , 而如果把 和   相乘,得到的矩阵对角线就会是 ,也就是上述公式的分子。

因此我们可以使用下面的 mata 程序计算:

mata:
 m1 = st_matrix("m1")
 m2 = st_matrix("m2")

 m12 = m1 * m2'
 m11 = m1 * m1'
 m22 = m2 * m2'

 n = st_nobs()
 tp = J(n, 1, .)

 for (i = 1; i <= n; i++) {
  tp[i, 1] = m12[i, i] / (sqrt(m11[i, i]) * sqrt(m22[i, i]))
 }
 st_matrix("tp", tp)
end 

keep group
svmat tp 

svmat 可以把矩阵再转换成 dta 数据中的变量。

然后就可以循环所有年份了,由于循环中不能出现 end,所以需要预先编写一个 mata 函数:

*- 编写函数
clear all 
mata:
void matfun() {
 m1 = st_matrix("m1")
 m2 = st_matrix("m2")

 m12 = m1 * m2'
 m11 = m1 * m1'
 m22 = m2 * m2'

 n = st_nobs()
 tp = J(n, 1, .)

 for (i = 1; i <= n; i++) {
  tp[i, 1] = m12[i, i] / (sqrt(m11[i, i]) * sqrt(m22[i, i]))
 }
 st_matrix("tp", tp)
}
end 

循环:

*- 第 i 年
cap mkdir "res" 
forval i = 1/4 {
 di "`i'"
 qui {
  *- 第i、i+1年的数据
  use data0, clear 
  keep if inlist(newyear, `i', `=`i'+1')

  *- 保留两年都有数据的
  bysort group: egen max = max(newyear)
  drop if max == `i' 
  drop max 
  gsort group newyear 
  local N = `=_N' 
  save temp, replace

  if `N' >= 2 {
   *- 第 i 年的
   use temp, clear 
   keep if newyear == `i'
   drop newyear year 
   save temp1, replace 

   *- 第 i+1 年的
   use temp, clear 
   keep if newyear == `=`i'+1' 
   drop newyear year 
   save temp2, replace 

   use temp1, clear 
   mkmat A01B - H05K, mat(m1) 

   use temp2, clear 
   mkmat A01B - H05K, mat(m2)

   mata: matfun() 

   keep group
   svmat tp 
   ren tp1 year_`i'
   save "res/year_`i'"replace 
  }
 }
}

*- 合并结果
use "res/year_1.dta"clear 
forval j = 2/4 {
 merge 1:1 group using "res/year_`j'.dta" 
 drop _m 
}

gather year* 
ren var newyear
replace newyear = subinstr(newyear, "year_""", .)
destring newyear, replace 
drop if missing(value)
save res, replace 

然后再把这个数据和 data0 匹配即可:

use data0, clear 
keep group newyear year 
replace newyear = newyear - 1 
merge 1:1 group newyear using res 
drop newyear 
drop _m 
ren year 年份 
ren value 专利技术空间相似度
label data "数据计算:微信公众号 RStata" 
save "工企专利技术空间相似度"replace

企业层面的知识宽度指标

其中, 表示在当年企业申请的所有专利中某类 IPC 号数量所占的比重。

这个就比较简单了:

*- 分年计算
cap mkdir "ihres" 
clear all 
mata
void matfun2() {
 m0 = st_matrix("m0"
 m = m0 * m0' 
 n = st_nobs()
 ih = J(n, 1, .)
 for (i = 1; i <= n; i++) {
  ih[i, 1] = 1 - m[i, i]
 }
 st_matrix("ih", ih)
}
end 

forval j = 2000/2004 {
 use data0, clear 
 drop newyear 
 keep if year == `j' 
 mkmat A01B - H05K, mat(m0) 
 mata: matfun2() 

 keep group year 
 svmat ih 

 ren year 年份 
 save "ihres/`j'"replace 
}

use ihres/2000, clear 
forval j = 2001/2004 {
 append using ihres/`j'
}
save "工企知识宽度计算结果"replace 

企业每年的新技术领域专利申请数量

这个只需要准备两个数据,一个是当年的数据,一个是之前年份的数据,匹配之后保存 _m == 1 的就是新的了,再统计下数量即可:

*- 企业每年的新技术领域专利申请数量
use "2000~2004年工企与专利数据匹配结果.dta"clear 

*- 生成个体变量
order 企业匹配唯一标识码
egen group = group(企业匹配唯一标识码)

*- 去除重复的专利
replace 公开公告号 = subinstr(公开公告号, "A""", .)
replace 公开公告号 = subinstr(公开公告号, "B""", .)
replace 公开公告号 = subinstr(公开公告号, "U""", .)
replace 公开公告号 = subinstr(公开公告号, "S""", .)
replace 专利类型 = "发明" if index(专利类型, "发明")

*- 使用 duplicates drop 去除重复的
duplicates drop group 年份 公开公告号, force 

*- 使用主分类号的前 4 位
gen class = substr(主分类号, 1, 4) 

*- 删除设计专利
drop if index(专利类型, "设计")

drop if missing(class

*- 统计每个公司每年每种类别专利的数量
destring newzlid, replace 
ren 年份 year 
collapse (count) num = newzlid, by(group year class)

*- 生成
save data1, replace 

*- 以 2004 年为例
use data1, clear 
keep if year == 2004 
ren num num1
drop year 
save tempdata1, replace 

use data1, clear 
keep if year < 2004 
ren num num0 
drop year 
save tempdata0, replace 

use tempdata1, clear 
merge 1:m group class using tempdata0 
keep if _m == 1 
drop num0 _m 
encode classgen(classcode) 
collapse (sum) 新技术空间专利申请 = num1 (count) IPC号新增数 = classcode, by(group) 
gen year = 2004 

*- 循环所有年份 
cap mkdir "newres"
forval y = 2001 / 2004 {
 use data1, clear 
 keep if year == `y' 
 ren num num1
 drop year 
 save tempdata1, replace 

 use data1, clear 
 keep if year < `y' 
 ren num num0 
 drop year 
 save tempdata0, replace 

 use tempdata1, clear 
 merge 1:m group class using tempdata0 
 keep if _m == 1 
 drop num0 _m 
 encode classgen(classcode) 
 collapse (sum) 新技术空间专利申请 = num1 (count) IPC号新增数 = classcode, by(group) 
 gen year = `y' 
 save "newres/`y'"replace 
}

use newres/2001, clear 
forval y = 2002/2004 {
 append using newres/`y'
}
ren year 年份
save "新技术空间专利申请"replace 

最后我们再合并三部分数据:

use 工企专利技术空间相似度.dta, clear 
merge 1:1 group 年份 using 工企知识宽度计算结果.dta
drop _m 
merge 1:1 group 年份 using 新技术空间专利申请.dta
drop _m 
ren ih1 企业层面专利知识宽度
save "计算结果"replace 

这样我们就计算好了这四个指标。

直播信息

欢迎各位名师讲堂会员参加明晚 8 点的直播课:「使用 Stata 计算专利技术空间相似度、企业层面的知识宽度、新技术空间专利申请及IPC号新增数」

  1. 直播地址:腾讯会议(需要报名 RStata 培训班参加)
  2. 讲义材料:需要购买 RStata 名师讲堂会员,详情可阅读:一起来学习 R 语言和 Stata 啦!学习过程中遇到的问题也可以随时提问!

更多关于 RStata 会员的更多信息可添加微信号 r_stata 咨询:

附件下载(点击文末的阅读原文即可跳转):

https://rstata.duanshu.com/#/brief/course/535f9284c31d47c2861b8cd1384394d0


RStata
一起学习 R 语言和 Stata 吧!
 最新文章