读者朋友你们好啊,如果你关注过之前几期公众号(全哥的学习生涯)的内容,你会知道我着重分享了如何利用R作meta分析的方法。而由于我本人研究方向的问题,今天这一期的内容将以文末参考文献为例,向大家分享展示如何利用heemod程序包构建Markov模型进行成本效果分析,以期为卫生经济评价的读者伙伴们提供参考与帮助。需要本文完整代码的请在公众号(全哥的学习生涯)内留言“卫生经济学评价”获取。
heemod 程序包主要开发用于卫生经济学评价,包括Markov 模型的构建、运行和敏感性分析等;与Excel 和TreeAge 等卫生经济学评价的常用软件相比,基于R 进行卫生经济学研究具有开源免费、灵活性高和图形功能强大等优势。其效果图展示如下:
1. heemod 包的安装与加载
代码如下:
install.packages(“heemod”)
library(“heemod”)
2. Markov 模型的构建
2.1 确定评价方案
根据实际情况明确需要进行比较的治疗方案(两种或两种以上)。本文进行比较的是两种晚期乳腺癌(advanced breast cancer,ABC)的治疗方案,拉帕替尼联合卡培他滨方案和卡培他滨单药方案。
2.2 Markov状态的设定
Markov状态主要依据具体的疾病和比较的方案进行设定,在一个周期中,模型中的患者只能处于唯一的健康状态中,肿瘤疾病中常用的是含有疾病稳定、疾病进展和死亡三种状态的Markov模型,也可以根据实际情况构建含有更多健康状态(state)的Markov模型,包含健康状态越多,模型越复杂。本例假设模型含有疾病稳定、治疗响应、疾病进展和死亡4 种健康状态。
2.3 转移概率的设定
静态Markov模型中,各个健康状态间的转移概率不随时间改变而变化,此种情况下可直接定义各状态下的转移概率并赋值。本文研究中假设转移概率不随时间改变,各状态间的转移概率源于关于拉帕替尼的两项临床试验。转移概率的定义代码如下:
mod_par <- define_parameters(
pSTR_comb = 0.0620,
pSTS_comb = 0.7440,
pSTP_comb = 0.1400,
pSTD_comb = 0.0540,
pSTR_mono = 0.0430,
pSTS_mono = 0.6800,
pSTP_mono = 0.2150,
pSTD_mono =0.0620,
pRTR_comb = 0.8150,
pRTP_comb = 0.1450,
pRTD_comb = 0.0400,
pRTR_mono = 0.8150,
pRTP_mono = 0.1050,
pRTD_mono = 0.0800,
pPTP_comb = 0.9070,
pPTD_comb = 0.0930,
pPTP_mono = 0.9040,
pPTD_mono = 0.0960)
上述代码中以S表示疾病稳定,P表示疾病进展,R表示治疗响应,D表示死亡状态;以comb表示拉帕替尼和卡培他滨联合给药方案,mono表示卡培他滨单药方案;pSTP_comb表示联合给药组从疾病稳定状态转移至疾病进展状态的概率,余则依次类推。
2.4 成本和健康效用值的定义
成本可根据实际情况进行区分,如可分为药物治疗成本、住院成本等。在本例中,250 mg拉帕替尼的价格为23美元(Clapa),卡培他滨价格为1.5美元/150 mg(uS),分别定义了疾病稳定(0.70)、治疗响应(0.84)和疾病进展(0.50)三种状态下的效用值。此外,因为卡培他滨按照体表面积给药,所以也设定了模拟患者的基线体表面积(body surface area,BSA),具体代码如下:
mod_par <- modify(mod_par,cLapa = 23,cCape = 1.5,uS = 0.70,uR = 0.84,uP = 0.50,BSA = 1.72)
2.5 转移概率矩阵
动态Markov模型中,各状态间的转移概率具有时间依赖性,通常需要进行参数生存分析以便于获得不同时间点的转移概率矩阵。当可以获取原始生存资料时,参数定义完毕后,即可通过define_transition()函数定义转移概率矩阵,具体代码如下:
mat_comb <- define_transition(state_names = c("S", "R","P", "D"),pSTS_comb,pSTR_comb, pSTP_comb, pSTD_comb,0, pRTR_comb,pRTP_comb,pRTD_comb,0,0,pPTP_comb,pPTD_comb,0, 0, 0, 1)
mat_mono <- define_transition(state_names = c("S", "R","P", "D",pSTS_mono, pSTR_mono, pSTP_mono, pSTD_mono,0, pRTR_mono,pRTP_mono, pRTD_mono,0, 0,pPTP_mono,pPTD_mono,0, 0, 0, 1)
每一种治疗方案均有各自的转移概率矩阵,此处mat_comb代表联合给药方案的转移概率矩阵,mat_mono代表单药方案的转移概率矩阵,通过plot()函数可绘制状态转移图(State Transition Diagram),命令如下:
plot(mat_comb)
plot(mat_mono)
结果如图1,图2所示。
2.6 定义状态值
定义状态值在define_state()函数中进行,主要定义各健康状态下的成本和收益(效用值),如定义死亡状态的效用值为0,本例模型含有4种健康状态,因此需要分别对4种状态下的成本和收益进行定义。具体代码如下:
S<- define_state(cost = dispatch_strategy(comb = 5*cLapa*6*7 + BSA*2000*cCape/150*4*7,mono = BSA*2500*cCape/150*4*7),qaly = uS)
R<- define_state(cost = dispatch_strategy(comb = 5*cLapa*6*7 + BSA*2000*cCape/150*4*7,mono = BSA*2500*cCape/150*4*7),qaly = uR)
P<- define_state(cost = dispatch_strategy(comb = 3631,mono = 3823),qaly = uP)
D<- define_state(cost = 0,qaly = 0)
以上代码中,欢迎关注公众号:全哥的学习生涯,获取更多数据分析知识。死亡状态的成本和效用值设置为0。dispatch_strategy()函数区分同一状态下不同治疗方案的成本或效果。各个健康状态下的成本是按照Markov周期长度计算的,如原始研究根据临床试验的随访时间将周期长度设为1.5月,计算的成本即为1.5月内经不同方案治疗的患者在各状态下的成本。
2.7 定义治疗方案
完成以上的步骤以后,即可对各治疗方案进行定义,本例中进行比较的方案为拉帕替尼联合卡培他滨方案(strat_comb)和卡培他滨单药方案(strat_mono)两种,代码如下:
strat_comb<- define_strategy(transition = mat_comb,S =S,R = R,P = P,D = D)
strat_mono<- define_strategy(transition = mat_mono,S = S,R = R,P = P,D =D)
3 运行模型与结果展示
3.1 模型的运行
完成参数、转移概率矩阵、状态值和方案的设定后,Markov模型即构建完成,接下来就是运行模型获得分析结果,模型运行命令如下:
res_mod<-run_model(parameters = mod_par,comb = strat_comb,mono = strat_mono,cycles = 20,cost = cost,effect = qaly)
在run_model()函数中,可通过指定cycles参数确定循环的周期数(cycles)
3.2 模型结果的展示
模型运行完成后,可通过summary()函数查看模型运行结果,包括成本、增量成本、效果、增量效果、增量成本-效果比(incremental cost-effectiveness ratio,ICER)和成本效果边界等,结果如图3所示。
使用plot()函数,并指定type参数,即可生成队列人数转移图和成本效果图,命令如下:
plot(res_mod)
plot(res_mod, type = "ce")
结果分别如图4和图5所示.
图4显示了各健康状态的人数随模型周期进行的变化情况,模型初期,所有患者(1000人)均处于疾病稳定状态。图5中默认以成本最低的方案(单药方案)为参照方案,连线为成本效果边界,连接两方案直线的斜率即为ICER。
4.敏感性分析
4.1 单因素敏感性分析
因模型参数常存在不确定性,欢迎关注公众号:全哥的学习生涯,获取更多数据分析知识。所以通过敏感性分析来考察不确定因素对结论的影响,敏感性分析包括单因素敏感性分析和概率敏感性分析。在单因素敏感性分析中,单一变量的取值在一定范围内(如95%置信区间或在基线值上下浮动10%等)变化,其他的变量固定为基线值,以观察单一变量值对模型结论的影响,结果通常以龙卷风图(tornado diagram)的形式展示,在函数define_parameters()中直接定义的参数均可以进行敏感性分析,以下为单因素敏感性分析和绘制龙卷风图得代码,结果如图6所示。
define_dsa<- define_dsa(cLapa, 18.4, 27.6,cCape, 1.2, 1.8,BSA, 1.5, 1.9, uS, 0.63, 0.77,uR, 0.765, 0.924,uP, 0.45, 0.55)
result_dsa<- run_dsa(res_mod, dsa = def_dsa)
plot(result_dsa, result = "icer", type = "difference")
其中,cLapa为25mg拉帕替尼的成本,uS为疾病稳定状态健康效用值,uR为治疗响应状态健康效用值,uP为疾病进展状态健康效用值,cCape为150mg卡培他滨成本,BSA为体表面积。
从龙卷风图中可见,拉帕替尼的成本对ICER的影响较大,其次为疾病稳定状态、治疗响应状态和疾病进展状态的效用值,卡培他滨的价格和BSA对结果的影响较小。
4.2 概率敏感性分析
概率敏感性分析中假定各变量均服从某一分布,如正态分布、对数正态分布、gamma分布和beta分布等等,通过从概率分布中随机取样,重复多次,观察不确定性因素对模型的影响情况,概率敏感性分析和相关图形绘制的代码如下:
define_psa<- define_psa(cLapa ~gamma(mean = 23, sd = 5),
cCape~gamma(mean = 1.5, sd = 0.5),
BSA ~normal(mean = 1.75, sd = 0.8),
uS ~normal(mean = 0.7, sd = 0.07),
uR ~normal(mean = 0.84, sd = 0.08),
uP ~normal(mean = 0.5, sd = 0.05))
result_psa<- run_psa(res_mod, psa = def_psa, N = 1000)
plot(result_psa, type = "ce")
plot(result_psa, type = "ac")
可通过修改参数N调整模拟次数,默认为1000次,当指定type参数为“ce”时,绘制增量效果为横坐标,增量成本为纵坐标绘制散点图(图7),当type=“ac”时,绘制成本效果可接受曲线(图8)。
最后,如果屏幕前的你对R语言学习还有什么问题和看法,或者有什么建议,欢迎在公众号(全哥的学习生涯)内给我留言,或者直接添加我的个人微信(公众号内菜单栏”与我联系—联系方式“可获得)
文中数据来源:
LE Q A, HAY J W. Cost-effectiveness analysis of lapatinib in HER-2-positive advanced breast cancer[J]. Cancer,2010,115(3):489-498.