该课程已经讲解完,感兴趣的小伙伴可以点击文末的阅读原文跳转至 RStata 平台观看视频讲解~
今天给大家分享一下 2023 年「中国工业经济」第一期<网络基础设施建设、信息可得性与企业创新边界>论文中提到的一些指标:
下面我们以 2000~2004 年工企专利匹配结果为例来演示如何使用 Stata 计算这四个指标:
专利技术相似度; 企业层面的知识宽度指标; 企业每年的新技术领域专利申请数量; 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 class, gen(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 class, gen(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号新增数」
直播地址:腾讯会议(需要报名 RStata 培训班参加) 讲义材料:需要购买 RStata 名师讲堂会员,详情可阅读:一起来学习 R 语言和 Stata 啦!学习过程中遇到的问题也可以随时提问!
更多关于 RStata 会员的更多信息可添加微信号 r_stata 咨询:
附件下载(点击文末的阅读原文即可跳转):
https://rstata.duanshu.com/#/brief/course/535f9284c31d47c2861b8cd1384394d0