这里之所以有不对称的问题,其实主要是因为,如果申请人有两个,上面的 mata 程序里面只保留了 A-B-Value 的结果,没有同时生成 B-A-Value 的结果。
可以通过下面的方式把数据转换成对称的:
*- 处理成对称矩阵 use tempdata3, clear gen id = _n drop value gather city1 city2 *> id keep value duplicatesdrop value, force *> Duplicates in terms of value *> (10,148 observations deleted) save temp1b, replace *> file temp1b.dta saved ren value value2 cross using temp1b ren value city1 ren value2 city2 merge 1:1 city1 city2 using tempdata3 *> Result Number of obs *> ----------------------------------------- *> Not matched 117,251 *> from master 117,251 (_merge==1) *> from using 0 (_merge==2) *> Matched 5,249 (_merge==3) *> ----------------------------------------- drop _m replace value = 0 ifmi(value) *> (117,251 real changes made) save temp1c, replace *> file temp1c.dta saved ren city1 temp ren city2 city1 ren temp city2 ren value value2 merge 1:1 city1 city2 using tempdata3 *> Result Number of obs *> ----------------------------------------- *> Not matched 117,251 *> from master 117,251 (_merge==1) *> from using 0 (_merge==2) *> Matched 5,249 (_merge==3) *> ----------------------------------------- *- 因为对于每个专利,ab ba 的情况都统计了,所以这里选择最大的(统计最全面的)作为共现结果 egen value3 = rowmax(value value2) replace value = value3 *> (118,258 real changes made) drop value2 _m value3 dropif city1 == city2 *> (350 observations deleted) gsort city1 city2 dropif value == 0 *> (115,256 observations deleted) ren value 合作申请专利数量 save 2015年各城市对合作申请专利数量计算结果, replace *> file 2015年各城市对合作申请专利数量计算结果.dta saved
这个也是那个课程里面讲解的方法。不过其实有更好的办法,也就是直接纠正 Mata 程序:
use tempdata2, clear mata: city = st_sdata(., "city") value = st_data(., "_freq") fullcombinations = J(0, 3, "") for (r = 1; r <= rows(city); r++) { class_list = colshape(ustrsplit(city[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 } }
*- 合并所有的 appendall res *> (6,894 observations deleted) foreach i of varlist _all { *> 2. cap format `i' %10s *> 3. } order 年份 gsort 年份 label data "数据计算:微信公众号 RStata" save data1, replace *> (file data1.dta not found) *> file data1.dta saved
类似的代码统计分类型的专利:
*- 分类型 foreach v in"发明""外观设计""实用新型" { capmkdir"res`v'" forval y = 2015/2017 { di"`v': `y'" qui { use tempdata, clear keepif 专利类型 == "`v'" keepif 年份 == `y' if `=_N' > 0 { duplicatesdrop newipzlid 申请人编号, force keep newipzlid 申请人编号 市 spread 申请人编号 市 unite 申请人*, gen(city) sep(" ") drop 申请人* replace city = strtrim(city) replace city = subinstr(city, " ", " ", .) replace city = subinstr(city, " ", ";", .) contract city
*- 去除重复的城市 egen city2 = ipc_unique(city), parse(;) drop city ren city2 city replace city = subinstr(city, ";", " ", .) replace city = strtrim(city) replace city = subinstr(city, " ", " ", .) replace city = subinstr(city, " ", ";", .)
*- 删除没有互相合作的 dropif !index(city, ";") order city
do matacode.do destring value, replace dropif city1 == city2 collapse (sum) value, by(city1 city2) ren value 合作申请`v'专利数量 gen 年份 = `y' save res`v'/`y', replace
评论