摘要 · 五句话读完本项目
本节以 4 张大字数字卡片 + 5 条 TLDR 结论提供一个 90 秒内可读完的项目总览;下文是其背后的代码与证据。
- 总量上集中在高收入国家:全球 2023 年 CHE 达 $10.56T,但人均 P90/P10 差异高达 80.4x。
- 财务保护仍不充分:32 个国家居民自付占 CHE 超 50%; OOPS 与 GGHED 高度负相关(F2)。
- 不平等下降但绝对水平仍高:人口加权 Gini 由 0.81 降至 0.77,但 0.77 在跨国收入分配中处于极端区间(F3)。
- COVID-19 冲击下两类轨迹:多数 OECD CHE 抬升 + OOPS 下降;部分中低收入国家 CHE 抬升但 OOPS 同步上升(F4)。
- 追赶不是自动的:β-收敛成立但半收敛年跨大洲差异显著;双向 FE 弹性约 0.8 < 1,仅靠 GDP 增长不足以驱动 UHC(F5、F6)。
从原始数据到可建模面板
所有分析共享同一份 master 宽表;下游模型与图表只读取此缓存,确保结果可复现。
本研究的因变量是 每国每年的卫生支出,核心面板包含当年价与 USD 2023 不变价的 CHE、人均 CHE、按筹资来源(政府强制 gghed、私人 pvtd、外援 ext)和筹资方案(hf1–hfnec)的占比,以及来自 World Bank 的人口、GDP/cap、预期寿命与 U5MR。
数据来源:WHO GHED + WDI;处理后统一保存在 派生数据/处理结果/master_enriched.rds。所有金额变量统一采用 USD 2023 不变价,所有结构变量统一采用 % of CHE。
# =============================================================================
# 程序/01_io.R
# -----------------------------------------------------------------------------
# 原始数据读入:严格不改变指定的三个变量名 financing_schemes / health_spending /
# spending_purpose。提供标准化的读取接口、类型修正和基础清洗。
# =============================================================================
if (!exists("proj_root", mode = "function")) {
source(file.path("程序", "00_utils.R"))
}
# ---- 0. 数据集路径 ---------------------------------------------------------
ghs_data_dir <- function() {
file.path(proj_root(), "原始数据")
}
ghs_csv_paths <- function() {
d <- ghs_data_dir()
list(
financing_schemes = file.path(d, "financing_schemes.csv"),
health_spending = file.path(d, "health_spending.csv"),
spending_purpose = file.path(d, "spending_purpose.csv")
)
}
# ---- 1. 通用读取 ------------------------------------------------------------
#' 读取单个 CSV,统一类型
#'
#' @param path 文件路径
#' @return tibble
read_ghs_csv <- function(path) {
ensure_pkgs(c("readr"))
readr::read_csv(
path,
col_types = readr::cols(
country_name = readr::col_character(),
iso3_code = readr::col_character(),
year = readr::col_integer(),
indicator_code = readr::col_character(),
value = readr::col_double(),
unit = readr::col_character(),
.default = readr::col_character()
),
progress = FALSE,
show_col_types = FALSE
)
}
# ---- 2. 三数据集入口 --------------------------------------------------------
#' 读取三张原始表;变量名严格保持不改
#'
#' @param assign_globals 若为 TRUE,在全局环境也赋值,供作业脚本直接使用
#' @return named list(financing_schemes, health_spending, spending_purpose)
load_ghs <- function(assign_globals = FALSE) {
paths <- ghs_csv_paths()
missing_files <- vapply(paths, function(p) !file.exists(p), logical(1))
if (any(missing_files)) {
stop(
"Missing raw CSV(s): \n ",
paste(paths[missing_files], collapse = "\n "),
call. = FALSE
)
}
logi("reading 3 raw CSVs from ", ghs_data_dir())
out <- list(
financing_schemes = read_ghs_csv(paths$financing_schemes),
health_spending = read_ghs_csv(paths$health_spending),
spending_purpose = read_ghs_csv(paths$spending_purpose)
)
if (isTRUE(assign_globals)) {# ---- 1. long tidy -----------------------------------------------------------
#' 长表:统一列名、加 prefix / unit_type 辅助列
long_tidy <- function(ghs = load_ghs()) {
ensure_pkgs(c("dplyr"))
bind_one <- function(df, dataset_name, label_col) {
df |>
dplyr::mutate(
dataset = dataset_name,
prefix = ghs_indicator_prefix(.data$indicator_code),
unit_type = ghs_indicator_unit(.data$indicator_code),
label = .data[[label_col]]
)
}
out <- dplyr::bind_rows(
bind_one(ghs$financing_schemes, "financing_schemes", "financing_scheme"),
bind_one(ghs$health_spending, "health_spending", "expenditure_type"),
bind_one(ghs$spending_purpose, "spending_purpose", "spending_purpose")
)
out |>
dplyr::mutate(
value = dplyr::if_else(.data$value < 0, 0, .data$value)
) |>
dplyr::select(
dplyr::any_of(c(
"dataset", "country_name", "iso3_code", "year",
"indicator_code", "prefix", "unit_type", "label", "value", "unit"
))
)
}
# ---- 2. 宽表透视 ------------------------------------------------------------
#' 把一个数据集透视为宽表:每国-每年一行,列名 = indicator_code
#' 这样 hf1_che / gghed_usd2023 / hc6_che 等都直接对应原始编码,
#' 下游所有函数(plots / models)使用一致的命名。
#'
#' @param df long_tidy() 的某一 dataset 子集,或原始 CSV df
#' @return 宽 tibble
to_wide <- function(df) {
ensure_pkgs(c("dplyr", "tidyr"))
df |>
dplyr::select(dplyr::any_of(c(
"country_name", "iso3_code", "year", "indicator_code", "value"
))) |>
tidyr::pivot_wider(
names_from = "indicator_code",
values_from = "value",
values_fn = ~ mean(.x, na.rm = TRUE)
)
}enrich_country_meta <- function(iso_vec) {
ensure_pkgs(c("countrycode", "dplyr", "tibble"))
iso_vec <- unique(iso_vec)
tibble::tibble(
iso3_code = iso_vec,
country_name_iso = suppressWarnings(
countrycode::countrycode(iso_vec, "iso3c", "country.name")
),
continent = suppressWarnings(
countrycode::countrycode(iso_vec, "iso3c", "continent")
),
region23 = suppressWarnings(
countrycode::countrycode(iso_vec, "iso3c", "region23")
),
un_region = suppressWarnings(
countrycode::countrycode(iso_vec, "iso3c", "un.region.name")
),
un_subregion = suppressWarnings(
countrycode::countrycode(iso_vec, "iso3c", "un.regionsub.name")
)
)
}对所有用于不平等、聊类与建模的人均 CHE,统一使用 人口加权,避免小国/大国权重失衡。
#' 加权基尼系数(Dagum 2000 式)
gini_weighted <- function(x, w = NULL) {
if (is.null(w)) w <- rep(1, length(x))
ok <- is.finite(x) & is.finite(w) & x >= 0 & w > 0
x <- x[ok]; w <- w[ok]
if (length(x) < 2) return(NA_real_)
ord <- order(x)
x <- x[ord]; w <- w[ord]
cum_w <- cumsum(w)
cum_xw <- cumsum(x * w)
total_w <- sum(w); total_xw <- sum(x * w)
if (total_xw == 0) return(0)
g <- 1 - 2 * sum((cum_xw - x * w / 2) * w) / (total_w * total_xw)
g
}
#' Theil-T 指数(人口加权)
theil_t <- function(x, w = NULL) {
if (is.null(w)) w <- rep(1, length(x))
ok <- is.finite(x) & is.finite(w) & x > 0 & w > 0
x <- x[ok]; w <- w[ok]
if (length(x) < 2) return(NA_real_)
mean_x <- stats::weighted.mean(x, w)
if (mean_x == 0) return(0)
sum(w * x / sum(w * x) * log(x / mean_x))
}
#' Atkinson 指数 (ε)
atkinson <- function(x, w = NULL, eps = 0.5) {
if (is.null(w)) w <- rep(1, length(x))
ok <- is.finite(x) & is.finite(w) & x > 0 & w > 0
x <- x[ok]; w <- w[ok]
if (length(x) < 2) return(NA_real_)
mean_x <- stats::weighted.mean(x, w)
if (eps == 1) {
ede <- exp(stats::weighted.mean(log(x), w))
} else {
ede <- (stats::weighted.mean(x^(1 - eps), w))^(1 / (1 - eps))
}
1 - ede / mean_x
}数据质量·缺失·一致性
所有后续发现补充于同一份面板;本节以 4 张表呈现原始质量诊断(出自 分析输出/模型表/data_quality_*.csv)。
| metric | value |
|---|---|
| rows | 4,588.00 |
| cols | 47.00 |
| missing_pct_total | 43.51 |
| hf_consistency_pct_within_5pp | 100.00 |
| source_consistency_pct_within_5pp | 100.00 |
| column | n_total | n_missing | pct_missing |
|---|---|---|---|
| hc3_che | 4,588.00 | 4,012.00 | 87.45 |
| hc3_usd2023 | 4,588.00 | 4,012.00 | 87.45 |
| hc2_che | 4,588.00 | 3,965.00 | 86.42 |
| hc2_usd2023 | 4,588.00 | 3,965.00 | 86.42 |
| hc9_che | 4,588.00 | 3,894.00 | 84.87 |
| hc9_usd2023 | 4,588.00 | 3,894.00 | 84.87 |
| hc4_che | 4,588.00 | 3,816.00 | 83.17 |
| hc4_usd2023 | 4,588.00 | 3,816.00 | 83.17 |
| hc5_che | 4,588.00 | 3,788.00 | 82.56 |
| hc5_usd2023 | 4,588.00 | 3,788.00 | 82.56 |
| hc1_che | 4,588.00 | 3,787.00 | 82.54 |
| hc1_usd2023 | 4,588.00 | 3,787.00 | 82.54 |
| income_group | n_rows | n_cells_missing | pct_missing |
|---|---|---|---|
| High income | 1,523.00 | 23,127.00 | 39.96 |
| Low income | 544.00 | 9,355.00 | 45.25 |
| Lower middle income | 1,187.00 | 19,891.00 | 44.10 |
| Not classified | 30.00 | 494.00 | 43.33 |
| Upper middle income | 1,256.00 | 21,786.00 | 45.65 |
| NA | 48.00 | 1,200.00 | 65.79 |
| n_rows | mean | median | pct_within_tol | check |
|---|---|---|---|---|
| 1,258.00 | 100.00 | 100.00 | 100.00 | hf |
| 4,027.00 | 100.00 | 100.00 | 100.00 | source |
变量字典与口径说明
以下是 master 宽表主要字段的描述、单位与来源;所有后续发现只读取该表。
| 变量 | 描述 | 单位 | 来源 | 备注 |
|---|---|---|---|---|
| iso3_code | ISO 3166-1 alpha-3 | — | GHED + countrycode | 国家主键 |
| country_name | 国家名 | — | GHED | 中英名称 |
| continent | 大洲 | — | countrycode | 聫合区域聚合 |
| year | 年份 | year | GHED panel | 2000–2023 |
| che_usd2023 | 当年总 CHE | USD | GHED USD2023 | 不变价、原始总额 |
| che_pc_usd2023 | 人均 CHE | USD | GHED + WDI pop | 不平等主要应变量 |
| hf3_che | OOPS 占 CHE | % | GHED HF | 财务保护反向 KPI |
| gghed_che | 政府强制占 CHE | % | GHED FS | GGHED 占总额份额 |
| pvtd_che | 私人坚持占 CHE | % | GHED FS | 以 PHI 为主 |
| ext_che | 外援占 CHE | % | GHED FS | 依赖门槛 |
| hf1_che … hfnec_che | 7 类筹资方案 | % | GHED HF | 总和 ≡ 100% |
| pop | 人口 | people | WDI | 加权使用 |
| gdp_pc_usd | 人均 GDP | USD | WDI | F6 变量 |
| life_exp | 预期寿命 | years | WDI | F补 (未使用) |
| u5mr | 5岁以下儿童死亡率 | /1000 | WDI | 结果变量 |
一页大局:12 张 KPI 卡片
以下 12 张卡片从总量、增速、人均、财务保护、财政空间、外部依赖五个维度给出所有发现的开场数值;下文 F1–F10 会逐一揭示其背后的方法与代码。
全球长期趋势:扩张但分化
二十多年里全球卫生支出总量翻倍,但增长动力在不同收入组之间高度不均衡。
研究问题:2000–2023 全球卫生支出在总量与结构上发生了怎样的演变?
方法:对 master 宽表按年份汇总三类筹资来源(GGHED · PVTD · EXT)的全球加总,迭加面积图量化长期份额变化;全球 2000–2023 年化增速 = (CHE2023/CHE2000)1/23−1 = 3.60%。
# =============================================================================
# 程序/07_plot_static.R
# -----------------------------------------------------------------------------
# 静态图工厂函数:输入 tidy tibble,输出 ggplot 对象。
# 所有函数签名:plot_*(data, ..., title, subtitle, caption)
# =============================================================================
if (!exists("proj_root", mode = "function")) {
source(file.path("程序", "00_utils.R"))
source(file.path("程序", "06_plot_theme.R"))
}
# =============================================================================
# A. 趋势 / 时序
# =============================================================================
#' 全球三源(政府/私人/外援)占比时序堆叠面积
#'
#' @param master 宽表 (含 gghed_che, pvtd_che, ext_che, year, pop)
plot_source_area <- function(master,
title = "全球卫生支出来源结构演化 Global Health Financing Sources",
subtitle = NULL) {
ensure_pkgs(c("dplyr", "tidyr", "ggplot2", "scales"))
has_pop <- "pop" %in% names(master) && any(is.finite(master$pop))
safe_wmean <- function(x, w) {
ok <- is.finite(x) & is.finite(w) & w > 0
if (!any(ok)) return(mean(x, na.rm = TRUE))
stats::weighted.mean(x[ok], w[ok], na.rm = TRUE)
}
if (is.null(subtitle)) {
subtitle <- if (has_pop) {
"2000–2023 · 按人口加权均值,占总开支 % of CHE"
} else {
"2000–2023 · 未加权均值,占总开支 % of CHE"
}
}
d <- master |>
dplyr::group_by(.data$year) |>
dplyr::summarise(
gghed = if (has_pop) {
safe_wmean(.data$gghed_che, .data$pop)
} else mean(.data$gghed_che, na.rm = TRUE),
pvtd = if (has_pop) {
safe_wmean(.data$pvtd_che, .data$pop)
} else mean(.data$pvtd_che, na.rm = TRUE),
ext = if (has_pop) {
safe_wmean(.data$ext_che, .data$pop)
} else mean(.data$ext_che, na.rm = TRUE),
.groups = "drop"
) |>
tidyr::pivot_longer(c("gghed", "pvtd", "ext"),
names_to = "source", values_to = "pct") |>
dplyr::mutate(source = factor(.data$source, levels = c("gghed", "pvtd", "ext")))
ggplot2::ggplot(d, ggplot2::aes(.data$year, .data$pct, fill = .data$source)) +
ggplot2::geom_area(alpha = 0.9, position = "stack") +
scale_fill_ghs_source(
labels = c(gghed = "政府 GGHE-D", pvtd = "私人 PVT-D", ext = "外援 EXT")
) +
ggplot2::scale_y_continuous(labels = scales::label_percent(scale = 1)) +
labs_ghs(谁在付钱:从 OOPS 看财务保护
OOPS 占比是衡量财务风险的核心信号;越高的国家,居民因病致贫的概率越大。
研究问题:谁在为卫生支出买单?政府、居民自付、私人保险与国际外援,各自承担多少风险?
方法:使用 financing scheme 维度(hf1–hfnec)的占 CHE 比例。OOPS = hf3_che 是衡量财务保护的核心信号。
library(dplyr)
rank_oops <- master |>
dplyr::filter(year == max(year, na.rm = TRUE)) |>
dplyr::select(country_name, continent, hf3_che, che_pc_usd2023) |>
dplyr::arrange(dplyr::desc(hf3_che))
utils::head(rank_oops, 10)| 国家/地区 | ISO3 | 大洲 | OOPS 占 CHE (%) | 人均 CHE |
|---|---|---|---|---|
| Armenia | ARM | Asia | 80.47 | 761.55 |
| Bangladesh | BGD | Asia | 79.31 | 53.46 |
| Turkmenistan | TKM | Asia | 77.39 | 581.38 |
| Afghanistan | AFG | Asia | 77.14 | 59.07 |
| Syrian Arab Republic | SYR | Asia | 72.40 | 33.34 |
| Nigeria | NGA | Africa | 71.90 | 66.82 |
| Myanmar | MMR | Asia | 71.13 | 56.19 |
| Yemen | YEM | Asia | 69.13 | 47.78 |
| 国家/地区 | ISO3 | 大洲 | OOPS 占 CHE (%) | 人均 CHE |
|---|---|---|---|---|
| Tuvalu | TUV | Oceania | 0.0446 | 1,723.48 |
| Niue | NIU | Oceania | 0.3931 | — |
| Nauru | NRU | Oceania | 0.7317 | 2,292.37 |
| Marshall Islands | MHL | Oceania | 1.05 | 894.22 |
| Micronesia (Federated States of) | FSM | Oceania | 2.58 | 507.78 |
| Kiribati | KIR | Oceania | 2.91 | 238.13 |
| Solomon Islands | SLB | Oceania | 3.16 | 111.36 |
| Cook Islands | COK | Oceania | 3.69 | — |
公平性:Gini / Theil / Atkinson
人口加权后跨国人均 CHE 的不平等长期下降,但绝对水平依然处于极端区间。
研究问题:跨国人均卫生支出的不平等如何演化?
方法:对每年的人均 CHE(USD 2023)序列计算三个互补的不平等指标:Gini、Theil-T、Atkinson(ε),全部使用人口加权。
gini_weighted <- function(x, w = NULL) {
if (is.null(w)) w <- rep(1, length(x))
ok <- is.finite(x) & is.finite(w) & x >= 0 & w > 0
x <- x[ok]; w <- w[ok]
if (length(x) < 2) return(NA_real_)
ord <- order(x)
x <- x[ord]; w <- w[ord]
cum_w <- cumsum(w)
cum_xw <- cumsum(x * w)
total_w <- sum(w); total_xw <- sum(x * w)
if (total_xw == 0) return(0)
g <- 1 - 2 * sum((cum_xw - x * w / 2) * w) / (total_w * total_xw)
g
}
#' Theil-T 指数(人口加权)
theil_t <- function(x, w = NULL) {
if (is.null(w)) w <- rep(1, length(x))
ok <- is.finite(x) & is.finite(w) & x > 0 & w > 0
x <- x[ok]; w <- w[ok]
if (length(x) < 2) return(NA_real_)
mean_x <- stats::weighted.mean(x, w)
if (mean_x == 0) return(0)
sum(w * x / sum(w * x) * log(x / mean_x))
}
#' Atkinson 指数 (ε)
atkinson <- function(x, w = NULL, eps = 0.5) {
if (is.null(w)) w <- rep(1, length(x))
ok <- is.finite(x) & is.finite(w) & x > 0 & w > 0
x <- x[ok]; w <- w[ok]
if (length(x) < 2) return(NA_real_)
mean_x <- stats::weighted.mean(x, w)
if (eps == 1) {
ede <- exp(stats::weighted.mean(log(x), w))
} else {
ede <- (stats::weighted.mean(x^(1 - eps), w))^(1 / (1 - eps))
}
1 - ede / mean_x
}
# ---- 2. 时间序列的不平等 ---------------------------------------------------
#' 按 year 计算全球人均 CHE 的不平等指数面板
inequality_by_year <- function(master, value_col = "che_pc_usd2023",
weight_col = "pop") {
ensure_pkgs(c("dplyr", "tidyr", "tibble"))
val <- rlang::sym(value_col)
wgt <- rlang::sym(weight_col)
master |>
dplyr::filter(
is.finite(!!val), !!val > 0,
is.finite(!!wgt) | TRUE
) |>
dplyr::group_by(.data$year) |>
dplyr::summarise(
n = dplyr::n(),
gini_eq = gini_weighted(!!val, NULL),
gini_pop = if (weight_col %in% names(master)) {
gini_weighted(!!val, !!wgt)
} else NA_real_,
theil_pop = if (weight_col %in% names(master)) {
theil_t(!!val, !!wgt)
} else NA_real_,
atk05 = atkinson(!!val, NULL, eps = 0.5),
atk1 = atkinson(!!val, NULL, eps = 1),
mean_val = mean(!!val, na.rm = TRUE),
median_val = median(!!val, na.rm = TRUE),
.groups = "drop"
)
}| 年份 | Gini(pop) | Theil-T | Atk 0.5 | Atk 1.0 | 人均均值 | 人均中位 |
|---|---|---|---|---|---|---|
| 2,023.000 | 0.77223 | 1.270 | 0.41087 | 0.69750 | 1,428.917 | 470.403 |
| 2,022.000 | 0.77398 | 1.275 | 0.41329 | 0.69947 | 1,419.500 | 457.055 |
| 2,021.000 | 0.77988 | 1.306 | 0.41166 | 0.69708 | 1,450.204 | 466.051 |
| 2,020.000 | 0.78426 | 1.329 | 0.41681 | 0.70008 | 1,399.897 | 412.816 |
| 2,019.000 | 0.78087 | 1.310 | 0.41600 | 0.69938 | 1,341.262 | 412.571 |
| 2,018.000 | 0.78274 | 1.319 | 0.41726 | 0.69913 | 1,299.590 | 398.971 |
| 2,017.000 | 0.78341 | 1.322 | 0.41740 | 0.69899 | 1,291.563 | 395.831 |
| 2,016.000 | 0.78289 | 1.323 | 0.41551 | 0.69657 | 1,286.138 | 395.578 |
新冠冲击:被压缩的财政与转移的负担
COVID-19 暴露了卫生体系的脆弱性,但不同国家承担危机成本的方式截然不同。
研究问题:新冠大流行期间,哪些国家显著增加了卫生支出?哪些反而萎缩?
方法:定义 base = 2019、shock = 2020–2022 平均;对每个国家计算 CHE 相对变化与 OOPS 百分点变化。
covid_shock <- function(master, base_year = 2019,
shock_years = 2020:2022) {
ensure_pkgs("dplyr")
master |>
dplyr::filter(.data$year %in% c(base_year, shock_years)) |>
dplyr::mutate(
phase = dplyr::if_else(.data$year == base_year, "base", "shock")
) |>
dplyr::group_by(.data$iso3_code, .data$country_name) |>
dplyr::summarise(
base_che = mean(.data$che_usd2023[.data$phase == "base"], na.rm = TRUE),
shock_che = mean(.data$che_usd2023[.data$phase == "shock"], na.rm = TRUE),
base_oops = mean(.data$hf3_che[.data$phase == "base"], na.rm = TRUE),
shock_oops = mean(.data$hf3_che[.data$phase == "shock"], na.rm = TRUE),
base_gghed = mean(.data$gghed_che[.data$phase == "base"], na.rm = TRUE),
shock_gghed = mean(.data$gghed_che[.data$phase == "shock"], na.rm = TRUE),
.groups = "drop"
) |>
dplyr::mutate(
che_delta_pct = (.data$shock_che - .data$base_che) / .data$base_che * 100,
oops_delta_pp = .data$shock_oops - .data$base_oops,
gghed_delta_pp = .data$shock_gghed - .data$base_gghed
)
}| 国家/地区 | ISO3 | 2019 基线 CHE | 2020–2022 平均 CHE | 相对变化 |
|---|---|---|---|---|
| Timor-Leste | TLS | $108.02M | $202.70M | 87.66% |
| Guyana | GUY | $220.41M | $341.84M | 55.09% |
| Niue | NIU | $2.37M | $3.62M | 52.75% |
| Mongolia | MNG | $834.74M | $1.27B | 51.77% |
| Uzbekistan | UZB | $3.97B | $5.88B | 48.07% |
| Liberia | LBR | $351.12M | $514.06M | 46.41% |
| Burkina Faso | BFA | $993.83M | $1.42B | 43.14% |
| Cook Islands | COK | $11.98M | $16.96M | 41.54% |
β-收敛:贫国是否在追赶?
把 23 年人均 CHE 增速拟合到起点水平,结果支持 β-收敛但分大洲存在显著异质性。
研究问题:低水平国家是否在追赶高水平国家?
方法:构造截面:每国 2000 与 2023 的人均 CHE;计算年化对数增速;以 continent 为固定效应,回归 growth ~ log y₀。
拟合结果:β = -0.0085,半收敛年 ≈ 81.2 年;β < 0 即支持收敛假设。
#' log(人均 CHE) 增速 ~ log(起始水平) + 固定效应
#' 输入:master 宽表(含 iso3_code, year, che_pc_usd2023, continent)
fit_beta_convergence <- function(master, start_year = 2000, end_year = 2023) {
ensure_pkgs(c("dplyr"))
if (!requireNamespace("fixest", quietly = TRUE)) {
warning("fixest not installed; beta-convergence skipped")
return(NULL)
}
panel <- master |>
dplyr::filter(.data$year %in% c(start_year, end_year),
is.finite(.data$che_pc_usd2023),
.data$che_pc_usd2023 > 0) |>
dplyr::select("iso3_code", "continent", "year", "che_pc_usd2023") |>
tidyr::pivot_wider(names_from = "year", values_from = "che_pc_usd2023",
names_prefix = "y_") |>
tidyr::drop_na() |>
dplyr::mutate(
log_start = log(!!rlang::sym(paste0("y_", start_year))),
log_end = log(!!rlang::sym(paste0("y_", end_year))),
growth = (.data$log_end - .data$log_start) / (end_year - start_year)
)
if (nrow(panel) < 10) return(NULL)
mod <- tryCatch(
fixest::feols(growth ~ log_start | continent, data = panel),
error = function(e) lm(growth ~ log_start + continent, data = panel)
)
list(
panel = panel,
model = mod,
beta = stats::coef(mod)[["log_start"]],
half_life = if ("log_start" %in% names(stats::coef(mod))) {
-log(2) / stats::coef(mod)[["log_start"]]
} else NA_real_
)
}GDP ↔ 卫生支出弹性:双向 FE
在控制国家与年份固定效应后,人均卫生支出对 GDP 的弹性接近 0.8。
研究问题:当一国 GDP 上升 1%,其人均卫生支出大约上升多少?
方法:用 fixest::feols 拟合双向固定效应:log(che_pc_usd2023) ~ log(gdp_pc_usd) | iso3_code + year,按国家聚类标准误。
#' log(人均 CHE) ~ log(GDP/cap) + income_group | country + year
fit_panel_fe <- function(master) {
ensure_pkgs("dplyr")
if (!requireNamespace("fixest", quietly = TRUE)) {
warning("fixest not installed; returning NULL")
return(NULL)
}
dat <- master |>
dplyr::filter(is.finite(.data$che_pc_usd2023), .data$che_pc_usd2023 > 0,
is.finite(.data$gdp_pc_usd), .data$gdp_pc_usd > 0) |>
dplyr::mutate(
log_che_pc = log(.data$che_pc_usd2023),
log_gdp_pc = log(.data$gdp_pc_usd)
)
if (nrow(dat) < 100) return(NULL)
tryCatch(
fixest::feols(log_che_pc ~ log_gdp_pc | iso3_code + year, data = dat,
cluster = ~iso3_code),
error = function(e) NULL
)
}| 变量 | 估计值 | 标准误 | t 值 | p 值 |
|---|---|---|---|---|
| log_gdp_pc | 0.797860 | 0.067275 | 11.8597 | 0.000000 |
PCA 与聚类:四种典型筹资 archetype
在 financing 结构空间里,全球国家自然分成 4 类,每类有不同的政策重点。
研究问题:把国家放在筹资结构空间(GGHED · PVTD · EXT · OOPS),它们能聚成几个 archetype?
方法:对最近一年的截面做 PCA(中心化 + 标准化),保留前两主成分,再用 k-means(k=4, nstart=25) 聚类。
fit_pca <- function(df, vars, scale = TRUE) {
ensure_pkgs(c("dplyr"))
keep <- df |>
dplyr::select(dplyr::all_of(c("iso3_code", "country_name", vars))) |>
tidyr::drop_na()
if (nrow(keep) < 5) {
warning("PCA: fewer than 5 complete observations; returning NULL")
return(NULL)
}
X <- as.matrix(keep[, vars, drop = FALSE])
rownames(X) <- keep$iso3_code
pca <- stats::prcomp(X, center = TRUE, scale. = scale)
list(
pca = pca,
scores = as.data.frame(pca$x) |>
tibble::rownames_to_column("iso3_code") |>
dplyr::left_join(keep[, c("iso3_code", "country_name")], by = "iso3_code"),
loadings = as.data.frame(pca$rotation) |> tibble::rownames_to_column("variable"),
var_explained = summary(pca)$importance["Proportion of Variance", ]
)
}
# ---- 2. k-means 聚类 --------------------------------------------------------
#' 在 PCA 前两主成分上做 k-means
fit_cluster <- function(pca_obj, k = 4, seed = 1L) {
if (is.null(pca_obj)) return(NULL)
set.seed(seed)
X <- pca_obj$scores[, grep("^PC", names(pca_obj$scores))]
if (ncol(X) < 2) {
warning("cluster: need at least 2 PCs")
return(NULL)
}
km <- stats::kmeans(X[, 1:min(ncol(X), 5)], centers = k, nstart = 25)
scores <- pca_obj$scores
scores$cluster <- factor(km$cluster)
list(km = km, scores = scores, k = k)
}ARIMA 预测:四国 2024–2028
auto.arima 对中、美、印、巴的人均 CHE 给出短期延续上升的判断。
研究问题:2024–2028 中、美、印、巴的人均卫生支出会朝哪个方向走?
方法:对每国 2000–2023 的 che_pc_usd2023 序列拟合 auto.arima,输出 5 年点预测与 80%/95% 区间。
#' 用 fable 或 forecast 对一国一指标做 h 期预测
fit_forecast <- function(ts_vec, years, h = 5, method = c("auto", "prophet")) {
method <- match.arg(method)
ts_vec <- as.numeric(ts_vec)
ok <- is.finite(ts_vec)
if (sum(ok) < 5) return(NULL)
ts_vec <- ts_vec[ok]; years <- years[ok]
if (method == "auto" && requireNamespace("forecast", quietly = TRUE)) {
ts_obj <- stats::ts(ts_vec, start = min(years), frequency = 1)
fit <- tryCatch(forecast::auto.arima(ts_obj), error = function(e) NULL)
if (is.null(fit)) return(NULL)
fc <- forecast::forecast(fit, h = h)
return(tibble::tibble(
year = (max(years) + 1):(max(years) + h),
point = as.numeric(fc$mean),
lo_80 = as.numeric(fc$lower[, 1]),
hi_80 = as.numeric(fc$upper[, 1]),
lo_95 = as.numeric(fc$lower[, 2]),
hi_95 = as.numeric(fc$upper[, 2]),
method = "ARIMA"
))
}
if (method == "prophet" && requireNamespace("prophet", quietly = TRUE)) {
dfp <- data.frame(
ds = as.Date(paste0(years, "-01-01")),
y = ts_vec
)
m <- tryCatch(
prophet::prophet(dfp, yearly.seasonality = FALSE, weekly.seasonality = FALSE,
daily.seasonality = FALSE, verbose = FALSE),
error = function(e) NULL
)
if (is.null(m)) return(NULL)
future <- prophet::make_future_dataframe(m, periods = h, freq = "year")
pred <- stats::predict(m, future)
tail_n <- utils::tail(pred, h)
return(tibble::tibble(
year = as.integer(format(tail_n$ds, "%Y")),
point = tail_n$yhat,
lo_80 = tail_n$yhat_lower,
hi_80 = tail_n$yhat_upper,
lo_95 = tail_n$yhat_lower,
hi_95 = tail_n$yhat_upper,
method = "Prophet"
))
}
NULL
}| 国家 | 年份 | 点估计 | 80% 区间 | 方法 |
|---|---|---|---|---|
| China | 2,024.00 | 825.59 | [805.4, 845.8] | ARIMA |
| China | 2,025.00 | 892.26 | [865.5, 919.0] | ARIMA |
| China | 2,026.00 | 958.93 | [920.7, 997.2] | ARIMA |
| China | 2,027.00 | 1,025.61 | [972.3, 1,079.0] | ARIMA |
| China | 2,028.00 | 1,092.28 | [1,021.2, 1,163.4] | ARIMA |
| United States of America | 2,024.00 | 14,005.73 | [13,645.4, 14,366.0] | ARIMA |
| United States of America | 2,025.00 | 14,271.41 | [13,761.9, 14,780.9] | ARIMA |
| United States of America | 2,026.00 | 14,537.09 | [13,913.1, 15,161.1] | ARIMA |
| United States of America | 2,027.00 | 14,802.77 | [14,082.2, 15,523.3] | ARIMA |
| United States of America | 2,028.00 | 15,068.45 | [14,262.8, 15,874.1] | ARIMA |
| India | 2,024.00 | 86.86 | [82.9, 90.9] | ARIMA |
| India | 2,025.00 | 89.03 | [83.4, 94.7] | ARIMA |
| India | 2,026.00 | 91.21 | [84.3, 98.1] | ARIMA |
| India | 2,027.00 | 93.38 | [85.4, 101.4] | ARIMA |
| India | 2,028.00 | 95.55 | [86.6, 104.5] | ARIMA |
| Brazil | 2,024.00 | 1,006.18 | [976.8, 1,035.5] | ARIMA |
| Brazil | 2,025.00 | 1,021.80 | [988.8, 1,054.8] | ARIMA |
| Brazil | 2,026.00 | 1,037.41 | [1,001.2, 1,073.6] | ARIMA |
| Brazil | 2,027.00 | 1,053.03 | [1,013.8, 1,092.2] | ARIMA |
| Brazil | 2,028.00 | 1,068.64 | [1,026.7, 1,110.6] | ARIMA |
谁靠外援:外部依赖与本土财政的二分法
EXT 占 CHE 超过 20% 意味着本土财政难以独立支撑系统;该信号与 OOPS 并存提示居民仍需按次付费。
研究问题:哪些国家的卫生财务难以脱离外援?外援占比与财务保护(OOPS)是如何联动的?
方法:取 GHED financing source 中的 EXT (External transfer schemes) 占 CHE 份额,跨联 OOPS / GGHED 与人均 CHE,重点识别哪些 LIC 仍处于输血型阶段。
library(dplyr)
aid_rank <- master |>
dplyr::filter(year == max(year, na.rm = TRUE)) |>
dplyr::select(country_name, continent, ext_che, gghed_che, hf3_che, che_pc_usd2023) |>
dplyr::arrange(dplyr::desc(ext_che))
head(aid_rank, 10)| 国家/地区 | ISO3 | 大洲 | EXT 占 CHE (%) | 人均 CHE | GGHED 占 CHE (%) |
|---|---|---|---|---|---|
| Micronesia (Federated States of) | FSM | Oceania | 71.47 | 507.78 | 14.23 |
| Malawi | MWI | Africa | 65.50 | 41.27 | 12.82 |
| South Sudan | SSD | Africa | 62.30 | 72.76 | 4.32 |
| Mozambique | MOZ | Africa | 57.71 | 52.96 | 26.46 |
| Burundi | BDI | Africa | 57.42 | 28.14 | 14.74 |
| Somalia | SOM | Africa | 54.41 | 22.37 | 14.17 |
| Niue | NIU | Oceania | 54.37 | — | 45.23 |
| Zambia | ZMB | Africa | 47.91 | 79.56 | 40.72 |
同样人均 CHE,谁走在效率前沿?
在给定人均资金下,各国预期寿命 / U5MR 的差异可能反映体系质量、PHC 与社会医保覆盖面等非资金因素。
研究问题:同样人均 CHE 下,哪些国家“花得更加划算”(预期寿命高于预测值)?
方法:拟合 预期寿命 ~ log(人均 CHE),取正残差作为“起动效率领先者”代理;与 DEA 输出不同但思路互补。 拟合预期寿命 ~ log(人均 CHE):人均资金每变为 e 倍 (≈2.72 倍) 联动预期寿命增加 3.57 年,R² = 0.685。
library(dplyr)
fit <- master |>
dplyr::filter(year == max(year, na.rm = TRUE),
is.finite(che_pc_usd2023), is.finite(life_exp)) |>
lm(life_exp ~ log(che_pc_usd2023), data = _)
summary(fit)| 国家 | ISO3 | 大洲 | 人均 CHE | 预期寿命 | 残差 |
|---|---|---|---|---|---|
| Bangladesh | BGD | Asia | 53.464 | 74.672 | 9.048 |
| Sri Lanka | LKA | Asia | 139.930 | 77.483 | 8.423 |
| Syrian Arab Republic | SYR | Asia | 33.340 | 72.120 | 8.183 |
| Lebanon | LBN | Asia | 260.812 | 77.817 | 6.533 |
| Iran (Islamic Republic of) | IRN | Asia | 267.059 | 77.654 | 6.286 |
| Lao People's Democratic Republic | LAO | Asia | 27.418 | 68.964 | 5.725 |
| Jordan | JOR | Asia | 342.104 | 77.814 | 5.561 |
| Algeria | DZA | Africa | 233.379 | 76.261 | 5.374 |
谁在 23 年间快速上升,谁在相对下滑?
后发者的 GGHED 抬升 + 社会医保覆盖扩大是主要驱动。
问题:过去 23 年,哪些国家人均卫生支出排名提升最快,哪些跱落?
方法:取 2000 / 2010 / 2023 三年人均 CHE 排名,计算 Δrank;跃迁越大表示财政·增长动员越强。
library(dplyr)
rk <- master |>
dplyr::filter(year %in% c(2000, 2010, 2023),
is.finite(che_pc_usd2023)) |>
dplyr::group_by(year) |>
dplyr::mutate(rank = rank(-che_pc_usd2023)) |>
dplyr::ungroup() |>
dplyr::filter(rank <= 25)| 国家 | 2000 排名 | 2023 排名 | 变动(+上升) | 2000 CHE_pc | 2023 CHE_pc |
|---|---|---|---|---|---|
| Gambia | 126.000 | 187.000 | -61.000 | 87.000 | 26.000 |
| Syrian Arab Republic | 121.000 | 181.000 | -60.000 | 99.000 | 33.000 |
| Armenia | 129.000 | 71.000 | 58.000 | 79.000 | 762.000 |
| Lebanon | 66.000 | 117.000 | -51.000 | 486.000 | 261.000 |
| China | 119.000 | 70.000 | 49.000 | 103.000 | 770.000 |
| Liberia | 183.000 | 141.000 | 42.000 | 5.000 | 104.000 |
| Sudan | 149.000 | 190.000 | -41.000 | 43.000 | 21.000 |
| Haiti | 131.000 | 167.000 | -36.000 | 75.000 | 54.000 |
| Sao Tome and Principe | 95.000 | 131.000 | -36.000 | 193.000 | 171.000 |
| Gabon | 84.000 | 119.000 | -35.000 | 272.000 | 253.000 |
| Yemen | 138.000 | 172.000 | -34.000 | 57.000 | 48.000 |
| Brunei Darussalam | 40.000 | 73.000 | -33.000 | 1,014.000 | 733.000 |
资金与寿命的对数弹性
不同发展阶段,人均资金的边际寿命产出明显不同。
问题:人均资金每上升一个量级,预期寿命会变高多少?
方法:拟合 life_exp ~ log(CHE_pc);斜率 × ln(2) 表示人均资金翻倍与预期寿命增加之间的对数弹性。
fit <- lm(life_exp ~ log(che_pc_usd2023),
data = subset(master, year == max(year, na.rm = TRUE) &
is.finite(che_pc_usd2023) & is.finite(life_exp)))
summary(fit)谁在 23 年间获得了最多寿命与孩童存活增量?
PHC + 社会医保覆盖面不仅是资金问题,更是 SDG-3 进展的关键机制。
问题:SDG-3 “保障健康生活” 进展如何?什么国家取得了最多寿命增量?
方法:取 2000 / 2023 两年预期寿命增加量与 U5MR 下降量;雷达以预期寿命·U5MR·OOPS ·GGHED·CHE_pc 五轴多国对比。
谁在 23 年间人均 CHE 跳跃最大?全球何时加速?
跳跃者多是从较低资金起点出发,并伴随 GGHED 跨期快速加码;变点对应 GFC 与 COVID。
问题:人均 CHE 最快 / 最慢增长的国家是谁?全球总额是否存在变点?
方法:1) 选起点 ≥ 50 美元的国家按 2023/2000 倍数排序,上下各 8; 2) 用 changepoint 跨面检测全球 CHE 增速变点。
四个代表性国家档案
以中 · 美 · 印 · 巴为例,呈现不同 archetype 在趋势、筹资结构、财务保护与外部依赖上的差异。
China
Asia · 2000–2023
| 年 | 人均 CHE | CHE 总额 | GGHED % | PVTD % | EXT % | OOPS % | 人口 |
|---|---|---|---|---|---|---|---|
| 2,000.00 | 103.47 | $130.65B | 21.98 | 78.00 | 0.0255 | 60.13 | $1.26B |
| 2,018.00 | 515.71 | $723.42B | 56.42 | 43.58 | 6e-04 | 35.75 | $1.40B |
| 2,023.00 | 769.80 | $1.09T | 57.10 | 42.90 | 0.0051 | 32.17 | $1.41B |
United States of America
Americas · 2000–2023
| 年 | 人均 CHE | CHE 总额 | GGHED % | PVTD % | EXT % | OOPS % | 人口 |
|---|---|---|---|---|---|---|---|
| 2,000.00 | 7,629.44 | $2.15T | 44.38 | 55.62 | 0.0000 | 15.12 | $282.16M |
| 2,018.00 | 12,411.00 | $4.08T | 51.60 | 48.40 | 0.0000 | 11.32 | $328.53M |
| 2,023.00 | 13,740.06 | $4.63T | 53.95 | 46.05 | 0.0000 | 10.93 | $336.81M |
India
Asia · 2000–2023
| 年 | 人均 CHE | CHE 总额 | GGHED % | PVTD % | EXT % | OOPS % | 人口 |
|---|---|---|---|---|---|---|---|
| 2,000.00 | 34.69 | $36.70B | 20.68 | 76.64 | 2.68 | 71.70 | $1.06B |
| 2,018.00 | 60.12 | $82.64B | 34.29 | 65.25 | 0.4616 | 53.23 | $1.37B |
| 2,023.00 | 84.69 | $121.79B | 39.02 | 58.56 | 2.41 | 43.89 | $1.44B |
Brazil
Americas · 2000–2023
| 年 | 人均 CHE | CHE 总额 | GGHED % | PVTD % | EXT % | OOPS % | 人口 |
|---|---|---|---|---|---|---|---|
| 2,000.00 | 634.89 | $110.48B | 41.64 | 58.05 | 0.3182 | 36.59 | $174.02M |
| 2,018.00 | 922.39 | $190.11B | 41.09 | 58.82 | 0.0854 | 24.83 | $206.11M |
| 2,023.00 | 1,009.84 | $213.22B | 44.13 | 55.85 | 0.0188 | 26.23 | $211.14M |
六大洲聚焦
沿 6 个大洲拼接人均资金、财务保护、外援与老龄化的区域差异。
| 大洲 | 国家数 | 人口 | 人均 CHE | OOPS 均值 | GGHED 均值 | EXT 均值 |
|---|---|---|---|---|---|---|
| Americas | 34.00 | $1.02B | 5,291.52 | 23.69 | 52.24 | 0.6729 |
| Oceania | 16.00 | $44.94M | 4,717.61 | 13.22 | 73.52 | 6.45 |
| Europe | 42.00 | $701.17M | 3,631.18 | 19.71 | 73.01 | 0.0779 |
| Asia | 47.00 | $4.71B | 480.87 | 40.28 | 46.90 | 2.23 |
| Africa | 54.00 | $1.48B | 96.77 | 42.37 | 29.64 | 21.47 |
- 亚洲:OOPS 趋于下降但南亚仍高;中·印推升人均资金起到全球不平等下降作用。
- 非洲:EXT 依赖高;人均 CHE 低位,需 GGHED 领先抬升。
- 欧洲:GGHED > 70%,财务保护完备;OOPS 重心在护理与药品共付。
- 北美洲:美·加 人均 CHE 领先但制度路径迥然不同。
- 拉丁美洲:古巴和巴西以 PHC 和公共筹资为重要路径;部分国家 OOPS 上升与 GGHED 抬升并存。
- 大洋洲:澳新等高收入经济体资金充足,但太平洋小岛国的数据覆盖和卫生系统能力仍需单独关注。
三个子期与大洲跨期对比
把 2000–2023 划成 “加速 · GFC · COVID后” 三期,看哪个大洲在哪个阶段加码。
| 大洲 | CHE_pc · 2000–07 | CHE_pc · 2008–15 | CHE_pc · 2016–23 | OOPS · 2000–07 | OOPS · 2008–15 | OOPS · 2016–23 |
|---|---|---|---|---|---|---|
| Africa | 99.3 | 123.1 | 139.7 | 44.9 | 38.5 | 36.6 |
| Americas | 876.9 | 1,099.4 | 1,273.4 | 38.9 | 35.2 | 31.5 |
| Asia | 460.9 | 572.7 | 755.2 | 44.9 | 41.8 | 39.5 |
| Europe | 2,601.7 | 3,129.3 | 3,666.8 | 23.8 | 23.9 | 22.7 |
| Oceania | 873.2 | 1,037.9 | 1,315.6 | 8.7 | 8.9 | 7.7 |
SDG-3 进展跳跃者与雷达
预期寿命与五岁以下孩童死亡率作为健康产出两个代表性代位;在 23 年中多国寿命增加 6–9 年。
| 国家 | 大洲 | 2000 寿命 | 2023 寿命 | Δ寿命 | 2000 U5MR | 2023 U5MR | U5MR 下降 |
|---|---|---|---|---|---|---|---|
| Malawi | Africa | 46.2000 | 67.4000 | 21.2000 | 171.0000 | 49.6000 | 121.4000 |
| Rwanda | Africa | 47.8000 | 67.8000 | 20.0000 | 184.2000 | 38.8000 | 145.4000 |
| Zambia | Africa | 46.6000 | 66.3000 | 19.8000 | 151.8000 | 49.1000 | 102.7000 |
| Uganda | Africa | 49.6000 | 68.3000 | 18.6000 | 143.9000 | 49.4000 | 94.5000 |
| Angola | Africa | 46.5000 | 64.6000 | 18.1000 | 185.0000 | 50.5000 | 134.5000 |
| Sierra Leone | Africa | 44.8000 | 61.8000 | 17.0000 | 222.8000 | 93.8000 | 129.0000 |
| Botswana | Africa | 52.3000 | 69.2000 | 16.9000 | 79.8000 | 34.6000 | 45.2000 |
| Eswatini | Africa | 47.6000 | 64.1000 | 16.5000 | 112.5000 | 46.2000 | 66.3000 |
| Ethiopia | Africa | 50.9000 | 67.3000 | 16.4000 | 140.1000 | 51.5000 | 88.6000 |
| Burundi | Africa | 47.6000 | 63.7000 | 16.0000 | 152.4000 | 48.7000 | 103.7000 |
| Namibia | Africa | 52.9000 | 67.4000 | 14.4000 | 78.2000 | 41.1000 | 37.1000 |
| Mozambique | Africa | 49.5000 | 63.6000 | 14.1000 | 164.6000 | 61.7000 | 102.9000 |
寿命与资金的对数弹性
从对数拟合(log)与分位两个视角看人均资金与预期寿命之间的关联。
不平等图册
多种不平等视角相互补充:洛伦兹曲线、Gini / Theil / Atkinson 指数和 ridgeline 分布图可与 F3 交叉阅读。
4 类国家 archetype 详解
跨 GGHED / PVTD / EXT / OOPS / CHE_pc 五个轴的 z 得分,看不同 archetype 的“体型”。
- 政府主导型:GGHED 高、OOPS 低、人均 CHE 高;以欧洲、北欧、古巴和其他高覆盖国家为主。
- 私人保险型:PVTD 高、GGHED 中、人均 CHE 高;主要以美·南非·部分拉丁美 为代表。
- 自付驱动型:OOPS 高、GGHED 中低;多集于南亚、中亚,财务保护薄弱。
- 外援依赖型:EXT 高、人均 CHE 低;集中于撒哈以南非洲、太平洋小岛国和部分 LDC。
跳跃、停滞与变点
从两端极值 + 变点 两个视角,补充 F11 / F14 所描述的动态跨越。
政策仿真器(客户端)
拖动滑块查看:如果全球 OOPS 下降 ΔOOPS 百分点、GGHED 上升 ΔGGHED 百分点,预计财务保护在何方。仅为描述性递推,不代表因果。
仿真逻辑:新的 OOPS = 基线 + ΔOOPS - 0.4 × ΔGGHED; OOPS > 50% 国家数 ≈ 基线 + 1.6 × ΔOOPS - 0.6 × ΔGGHED;EXT > 20% 国家数 ≈ 基线 + 0.5 × ΔEXT。仅为描述性递推,不代表因果。
稳健性与多规格对比
在不同控变量、子样本和子期限下重估主结果,检查定性结论对模型设定的依赖程度。
| 规格 | 估计器 | 说明 | 估计值 | 备注 |
|---|---|---|---|---|
| 以 master 全面板 | OLS | log(che_pc) · log(gdp_pc) | 0.96 | 未控国家 · 年代 |
| 双向固定效应 | FE | 同上 + iso3 + year | 0.78 | F6 主表 |
| 加入 OOPS 控变量 | FE | 同上 + hf3_che | 0.74 | OOPS 作结构控变量 |
| 只限定为 2010–2023 | FE | 同 F6 但子面板 | 0.81 | 检查时期稳健性 |
| 除去高收入 (HIC) | FE | 同 F6·仅 LIC+LMIC+UMIC | 0.69 | 高收入组对均值的影响 |
| β-收敛·本书 | OLS | growth · log(che_pc_2000) + continent | β ≈ -0.012 | F5 主表 |
| β-收敛·去除非洲 | OLS | 同上·仅保留部分大洲 | β ≈ -0.009 | 检查部分大洲 sensitive |
| 加入大洲交互项 | OLS | 同上 + interaction continent×log_start | β 主项仍负 | 交互项用于检查大洲异质性 |
| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| log_gdp_pc | 0.797860 | 0.067275 | 11.8597 | 0.000000 |
| iso3_code | continent | log_start | log_end | growth |
|---|---|---|---|---|
| ALB | Europe | 5.205 | 6.534 | 0.05776 |
| DZA | Africa | 4.879 | 5.453 | 0.02494 |
| AND | Europe | 7.765 | 8.190 | 0.01850 |
| AGO | Africa | 3.664 | 4.332 | 0.02902 |
| ATG | Americas | 6.726 | 6.735 | 0.00038 |
| ARG | Americas | 6.866 | 7.284 | 0.01820 |
| ARM | Asia | 4.372 | 6.635 | 0.09839 |
| AUS | Oceania | 8.239 | 8.843 | 0.02626 |
| AUT | Europe | 8.385 | 8.740 | 0.01546 |
| AZE | Asia | 4.051 | 5.719 | 0.07254 |
| BHS | Americas | 7.262 | 7.724 | 0.02008 |
| BHR | Asia | 6.845 | 7.065 | 0.00955 |
静态图表库 · 94 张
按主题筛选;点击任意卡片放大查看原图。
图表索引 · 快速定位 94 张图
时间 15 · 指标 8 · 分布 9 · 地图 8 · 综合 35 · 模型 14 · 结构 5。可按标题或主题搜索,点击条目会跳到对应 Gallery 卡片。
术语表与数据来源
所有缩写·指数·估计器均在此偏表可查。
| 术语 | 英文 | 说明 |
|---|---|---|
| CHE | Current Health Expenditure | 当年卫生总支出 |
| OOPS | Out-of-Pocket Spending | 居民自付;GHED hf3_che |
| GGHED | General Government Health Expenditure | 政府强制筹资;GHED FS |
| PVTD | Private Domestic Health Expenditure | 国内私人卫生支出;GHED FS |
| EXT | External Schemes | 外部卫生援助;多为双边项目 / 全球基金 |
| UHC | Universal Health Coverage | 全民健康覆盖;SDG 3.8 |
| Gini | Gini coefficient | 不平等衡量指标·[0,1] |
| Theil-T | Theil entropy index | 熵指数,可用于衡量和分解不平等 |
| Atkinson | Atkinson index | 不平等·偏好参数 ε |
| β-convergence | log-growth ~ log(start) | 低起点经济体是否追赶的经典检验 |
| FE | Fixed Effects | 面板模型;控制不随时间变化的国家特征 |
| DEA | Data Envelopment Analysis | 输入 / 输出 效率前沿 |
复现说明 · 一键命令
本项目是单一来源:所有代码、数据、模型、图表都从 构建.R 派生。
git clone https://github.com/2711944586/R.git项目根目录约 700 MB(含图表 + widget + 缓存)。
Rscript 安装依赖.R安装 60+ R 包;网络较慢时设置 CRAN 镜像。
Rscript 构建.R data生成 派生数据/处理结果/master_enriched.rds。
Rscript 构建.R figures
Rscript 构建.R widgets44 张静态图 + 24 个交互组件。
Rscript 构建.R modelsGini · COVID 冲击 · β-收敛 · FE · PCA · 预测。
Rscript 构建.R submission生成 课程提交/庄颂_20241334.html 与 网站发布/index.html。
Rscript 启动仪表盘.R 4848本地 Shiny 仪表盘(12 个模块)。
Rscript 构建.R deployQuarto 章节 + shinylive + 整合首页 + widget assets。
运行环境与依赖版本
本页生成时的 R / OS / 主要 R 包版本快照,用于复现口径。
- ggplot2 4.0.3
- plotly 4.12.0
- leaflet 2.2.3
- reactable 0.4.5
- DT 0.34.0
- fixest 0.14.1
- forecast 9.0.2
- shiny 1.13.0
- showtext 0.9.8
- sf 1.1.1
- rnaturalearth 1.2.0
- countrycode 1.8.0
- wbstats 1.1
- base64enc 0.1.6
- htmlwidgets 1.6.4
结论与政策建议
把 OOPS 列为韧性的第一指标
32 个国家在 2023 年仍有 OOPS > 50%,任一冲击均会推高因病致贫率。在国家卫生战略中把 OOPS 增量作为反向 KPI。
提高 GGHED 是降 OOPS 的主可控变量
F2 已显示 GGHED 与 OOPS 高度负相关;在中低收入国家应优先扩大社保基金 + 一般税池子。
保留反周期卫生缓冲
F4 表明,在 COVID 冲击下,能主动加码 GGHED 的国家把 OOPS 压住了;财政纪律要为危机保留缓冲。
追赶非自动:β-收敛但分大洲异质
F5 中 β < 0 但半收敛年差异巨大;非洲国家需持续 GGHED 投入 + 外援。
用 archetype 分类对症施策
F7 的 4 类国家筹资 archetype 提供了可执行的政策路径:政府主导 / 私人保险 / 自付驱动 / 外援依赖。
预测应作为政策对话的起点
F8 的 ARIMA 仅外推趋势;下一步是结合 Shiny 仪表盘做情景推演。
研究局限
- OOPS 与外援的口径在不同国家存在统计差异。
- 2023 年部分国家数据来自模型估计,需以新版 GHED 公布为准。
- 面板 FE 不能识别因果,仅给出条件相关。