## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  warning = FALSE,
  message = FALSE
)
library(Desimml)
# 设置随机种子，保证结果的严格可重复性
set.seed(2026)

# 生成模拟数据: 样本量 n = 200, 协变量维度 p = 5
# family = "gaussian" 表示生成连续型高斯分布的响应变量
dat <- generate.data(
  n = 200, 
  p = 5, 
  family = "gaussian", 
  sigma = 0.4, 
  pi.1 = 0.5, 
  s = 2,      # 交互效应类型：非线性 (s=2 代表指数平方形式的非线性交互)
  delta = 1   # 主效应强度
)

# 检查生成数据的基本结构和维度
dim(dat$X)
table(dat$A)
head(dat$y)
# 拟合 SIMML 模型
# bs = "ps" 指定使用 P-splines
# k = 8 指定样条基底函数的自由度/维度
fit_res <- simml(
  y = dat$y, 
  A = dat$A, 
  X = dat$X, 
  family = "gaussian",
  bs = "ps",  
  k = 8       
)

# 输出最终收敛估计的单指数系数向量 beta
# 这些系数量化了 X 中的各个特征在决定最佳治疗方案时的权重
print(fit_res$beta.coef)
# 计算链接函数的一阶导数
# eps = 10^(-6) 控制数值偏导计算的微小步长
derivative_vals <- der.link(fit_res$g.fit, eps = 10^(-6))

# 查看部分观测样本对应的导数值
head(derivative_vals)
# 提取前 5 个观测样本的协变量作为新患者数据演示
new_X <- dat$X[1:5, ]

# 进行预测，假设目标是最大化响应变量值 (maximize = TRUE)
predictions <- pred.simml(
  simml.obj = fit_res, 
  newX = new_X, 
  type = "response", 
  maximize = TRUE
)

# 查看针对每个可能治疗方案的预测期望结果 
# 矩阵大小: n_new x L，其中每列代表一种治疗方案的预期 outcome
print(predictions$pred.new)

# 查看为这 5 个患者推荐的最优治疗方案 (即 pred.new 中每行最大值对应的治疗分配)
print(predictions$trt.rule)

