代码分享: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")

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注