如何利用R语言进行卫生经济学的成本效果分析

读者朋友你们好啊,如果你关注过之前几期公众号(全哥的学习生涯)的内容,你会知道我着重分享了如何利用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所示。


图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
图 5

图4显示了各健康状态的人数随模型周期进行的变化情况,模型初期,所有患者(1000人)均处于疾病稳定状态。图5中默认以成本最低的方案(单药方案)为参照方案,连线为成本效果边界,连接两方案直线的斜率即为ICER。

4.敏感性分析

4.1 单因素敏感性分析

因模型参数常存在不确定性,欢迎关注公众号:全哥的学习生涯,获取更多数据分析知识。所以通过敏感性分析来考察不确定因素对结论的影响,敏感性分析包括单因素敏感性分析和概率敏感性分析。在单因素敏感性分析中,单一变量的取值在一定范围内(如95%置信区间或在基线值上下浮动10%等)变化,其他的变量固定为基线值,以观察单一变量值对模型结论的影响,结果通常以龙卷风图(tornado diagram)的形式展示,在函数define_parameters()中直接定义的参数均可以进行敏感性分析,以下为单因素敏感性分析和绘制龙卷风图得代码,结果如图6所示。


图 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")


图 7


图 8

可通过修改参数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.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容