代码分享:CRS、VRS、规模效率计算
调试好了一串 R 代码,适用于 DEA 分析
功能:计算每个省市的CRS技术效率得分、VRS纯技术效率得分以及规模效率得分,并且形成三个三线表(CRS、VRS、规模效率),最后导出为Word 可用的三线表和 Excel 文件。
代码如下:
#----------------------设置工作路径-------------------#
setwd("/Volumes/Louis's HUB/SynologyDrive/Documents/Academic research/Research papers/R")
#-----------------------初始化-------------------------#
if (!require(readxl)) install.packages("readxl") # 读取 Excel 文件
if (!require(showtext)) install.packages("showtext") # 安装showtext包以支持中文
if (!require(Benchmarking)) install.packages("Benchmarking")
if (!require(ggplot2)) install.packages("ggplot2")
if (!require(openxlsx)) install.packages("openxlsx")
if (!require(flextable)) install.packages("flextable")
if (!require(officer)) install.packages("officer")
library(openxlsx)#加载写入excel 文件功能
library(Benchmarking)
library(ggplot2)
library(showtext)#加载中文支持包
library(readxl)#加载读取Excel功能包
library(flextable)
library(officer)
font_add_google("Noto Sans SC", "noto")#添加字体
showtext.auto(enable = TRUE)
#----------------------读取数据文件-------------------#
data <- read_excel("全国数据汇总.xlsx")#读取文件
head(data)
# 提取年份列表
years <- unique(data$年份)
# 创建空的数据框来存储所有年份的效率值
efficiency_crs <- data.frame()
efficiency_vrs <- data.frame()
scale_efficiency <- data.frame()
# 循环计算每年的 DEA 效率
for (year in years) {
# 提取当前年份的数据
data_year <- subset(data, 年份 == year)
# 提取投入和产出指标
inputs <- as.matrix(data_year[, c("生均公共财政预算教育事业费(小学)", "本科及以上学历教师比例(小学)","校舍建筑面积(小学)")])
outputs <- as.matrix(data_year[, c("毕业生数(小学)", "毕业率(小学)")])
# 运行 CRS 和 VRS 模型
dea_crs <- dea(inputs, outputs, RTS = "crs", ORIENTATION = "in")
dea_vrs <- dea(inputs, outputs, RTS = "vrs", ORIENTATION = "in")
# 计算规模效率
scale_eff <- dea_crs$eff / dea_vrs$eff
# 创建包含效率值的 data frame,并保留3位小数
efficiency_crs_year <- data.frame(
年份 = year,
DMU = data_year$地区, # 确保有地区这一列表示 DMU
Efficiency = round(dea_crs$eff, 3)
)
efficiency_vrs_year <- data.frame(
年份 = year,
DMU = data_year$地区, # 确保有地区这一列表示 DMU
Efficiency = round(dea_vrs$eff, 3)
)
scale_eff_year <- data.frame(
年份 = year,
DMU = data_year$地区, # 确保有地区这一列表示 DMU
Efficiency = round(scale_eff, 3)
)
# 合并到总的效率值数据框
efficiency_crs <- rbind(efficiency_crs, efficiency_crs_year)
efficiency_vrs <- rbind(efficiency_vrs, efficiency_vrs_year)
scale_efficiency <- rbind(scale_efficiency, scale_eff_year)
}
# 转换为宽格式表格
efficiency_crs_wide <- reshape(efficiency_crs, idvar = "DMU", timevar = "年份", direction = "wide")
efficiency_vrs_wide <- reshape(efficiency_vrs, idvar = "DMU", timevar = "年份", direction = "wide")
scale_efficiency_wide <- reshape(scale_efficiency, idvar = "DMU", timevar = "年份", direction = "wide")
# 创建 Excel 文件并添加三个工作表
wb <- createWorkbook()
addWorksheet(wb, "CRS基础教育资源配置")
addWorksheet(wb, "VRS基础教育资源配置")
addWorksheet(wb, "规模效率")
writeData(wb, sheet = "CRS基础教育资源配置", x = efficiency_crs_wide)
writeData(wb, sheet = "VRS基础教育资源配置", x = efficiency_vrs_wide)
writeData(wb, sheet = "规模效率", x = scale_efficiency_wide)
saveWorkbook(wb, "DEA效率值表格.xlsx", overwrite = TRUE)
# 创建 Word 文档
doc <- read_docx()
# 添加表格到文档
doc <- doc %>%
body_add_par(value = "表 1: CRS基础教育资源配置") %>%
body_add_flextable(value = flextable(efficiency_crs_wide), align = "left") %>%
body_add_break() %>%
body_add_par(value = "表 2: VRS基础教育资源配置") %>%
body_add_flextable(value = flextable(efficiency_vrs_wide), align = "left") %>%
body_add_break() %>%
body_add_par(value = "表 3: 规模效率") %>%
body_add_flextable(value = flextable(scale_efficiency_wide), align = "left")
# 保存 Word 文档
print(doc, target = "DEA效率值报告.docx")