名师讲堂|使用 Stata 测算上市公司技术专业化与技术多样化

本教程介绍如何使用 Stata 测算上市公司技术专业化(Technological Specialization, TSP)与技术多样化(Technological Diversification, TDI)。

方法说明

IPC 分类说明

IPC 层级 位数 示例 用于计算
部 (Section) 1位 A, G -
大类 (Class) 3位 G06, H04 TDI
小类 (Subclass) 4位 G06F, H04L TSP

Stata 代码实现

完整代码

以下是使用 Stata 计算技术专业化与多样化的完整代码(计算技术专业化与多样化.do):

*-----------------------------------------------------------
*- 计算上市公司技术专业化(TSP)与技术多样化(TDI)
*-----------------------------------------------------------
*- 参考:王慧扬, 刘建华, 赵玉冰.《知识搜索与科技领军企业关键核心技术突破》
*- 科学学研究, 2025
*- 数据:2020年上市公司与专利数据匹配结果.dta
*-----------------------------------------------------------
*- 变量定义:
*- 技术专业化(TSP):技术集中度,由企业n个技术小类占
*- 总专利申请数量比值的变异系数计算得出
*- 技术多样化(TDI):Shannon熵指数
*- TDI = -Σ p_it_a * ln(p_it_a)
*- 其中 p_it_a = N_it_a / N_it
*- N_it_a 表示企业i在时间t隶属技术大类a的专利数
*- N_it 表示企业i在时间t的专利总数
*-----------------------------------------------------------

*- 设置工作目录
cd "/Users/ac/Desktop/使用 Stata 测算上市公司技术专业化与技术多样化"

capture log close
log using "计算技术专业化与多样化.log", text replace

disp "=============================================="
disp "计算上市公司技术专业化(TSP)与技术多样化(TDI)"
disp "=============================================="

*-----------------------------------------------------------
*- 步骤1: 读取数据
*-----------------------------------------------------------
disp "=== 步骤1: 读取数据 ==="
use "2020年上市公司与专利数据匹配结果.dta", clear
disp "原始数据: `=_N' 行"

*-----------------------------------------------------------
*- 步骤2: 数据去重
*-----------------------------------------------------------
disp "=== 步骤2: 数据去重 ==="

*- Step 2.1: 清洗公开公告号(去掉末尾字母)
disp "2.1 清洗公开公告号(去掉末尾字母)"
gen 公开公告号_clean = 公开公告号
replace 公开公告号_clean = substr(公开公告号_clean, 1, ///
length(公开公告号_clean) - 1) if !missing(公开公告号_clean) ///
& regexm(公开公告号_clean, "[A-Z]$")

*- Step 2.2: 按 股票代码 + 年份 + 公开公告号_clean 去重
disp "2.2 按 股票代码 + 年份 + 公开公告号_clean 去重"
local n_before = _N
duplicates drop 股票代码 年份 公开公告号_clean, force
disp " 去重前: `n_before'"
disp " 去重后: `=_N'"

*- Step 2.3: 按 股票代码 + 年份 + 申请号 去重
disp "2.3 按 股票代码 + 年份 + 申请号 去重"
local n_before = _N
duplicates drop 股票代码 年份 申请号, force
disp " 去重前: `n_before'"
disp " 去重后: `=_N'"

*-----------------------------------------------------------
*- 步骤3: 提取IPC分类信息
*-----------------------------------------------------------
disp "=== 步骤3: 提取IPC分类信息 ==="
gen IPC大类 = substr(IPC主分类, 1, 3)
gen IPC小类 = substr(IPC主分类, 1, 4)

count if missing(IPC主分类)
disp "IPC主分类NA数量: `r(N)' (" %4.2f `=r(N)/_N*100' "%)"

drop if missing(IPC大类) | missing(IPC小类)
disp "移除IPC为NA后: `=_N' 行"

save "清洗后数据_2020年.dta", replace

*-----------------------------------------------------------
*- 步骤4: 计算技术专业化(TSP) - 变异系数
*- 此处代码需下载讲义材料查看~

*- 步骤5: 计算技术多样化(TDI) - Shannon熵
*- 此处代码需下载讲义材料查看~

*-----------------------------------------------------------
*- 步骤6: 合并结果并保存
*-----------------------------------------------------------
disp "=== 步骤6: 合并结果并保存 ==="
use "TSP计算结果.dta", clear
merge 1:1 股票代码 using "TDI计算结果.dta", nogen
merge 1:1 股票代码 using "企业总专利数.dta", nogen
sort 股票代码

save "技术专业化与多样化_2020年.dta", replace
export delimited "技术专业化与多样化_2020年.csv", replace

disp "=== 计算完成 ==="
log close

结果展示

读取结果

# 读取 Stata 生成的结果
result_file <- file.path(work_dir, "技术专业化与多样化_2020年.csv")
if (file.exists(result_file)) {
result <- read_csv(result_file, locale = locale(encoding = "UTF-8"), show_col_types = FALSE)
cat(sprintf("**样本量**: %d 家企业\n\n", nrow(result)))
} else {
cat("结果文件未找到,请检查 Stata 代码执行是否成功。\n")
}

描述性统计

if (exists("result")) {
stats_df <- tibble(
变量 = c("TSP (技术专业化)", "TDI (技术多样化)", "总专利数"),
最小值 = c(min(result$TSP), min(result$TDI), min(result$总专利数)),
Q25 = c(quantile(result$TSP, 0.25), quantile(result$TDI, 0.25), quantile(result$总专利数, 0.25)),
中位数 = c(median(result$TSP), median(result$TDI), median(result$总专利数)),
均值 = c(mean(result$TSP), mean(result$TDI), mean(result$总专利数)),
Q75 = c(quantile(result$TSP, 0.75), quantile(result$TDI, 0.75), quantile(result$总专利数, 0.75)),
最大值 = c(max(result$TSP), max(result$TDI), max(result$总专利数))
)

kable(stats_df, digits = 4, format = "html",
caption = "描述性统计(2020年,3,947家上市公司)") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover"))
}

结果预览

if (exists("result")) {
kable(head(result, 20), digits = 4, format = "html",
caption = "技术专业化与多样化计算结果(前20行)") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
}

结果可视化

以下是使用 Stata 绘制结果图表的代码:

*-----------------------------------------------------------
*- 绘制 TSP 和 TDI 分布直方图
*-----------------------------------------------------------

cd "/Users/ac/Desktop/使用 Stata 测算上市公司技术专业化与技术多样化"

use "技术专业化与多样化_2020年.dta", clear

*- 此处代码需下载讲义材料查看~

以下是使用 Stata 绘制 TSP 与 TDI 散点图的代码:

*-----------------------------------------------------------
*- 绘制 TSP vs TDI 散点图
*-----------------------------------------------------------

cd "/Users/ac/Desktop/使用 Stata 测算上市公司技术专业化与技术多样化"

use "技术专业化与多样化_2020年.dta", clear

*- 此处代码需下载讲义材料查看~

graph export "TSP_vs_TDI散点图.png", replace width(4800)

点击这里跳转到 RStata 短书平台获取附件:名师讲堂|使用 Stata 测算上市公司技术专业化与技术多样化

评论