重复测量数据多重填补 SAS code

临床试验长期随访数据中,缺失数据的利用和处理是经常遇到的问题,本文将围绕MMRM模型和delta法多重填补进行举例



前言

本文主要介绍多重填补的操作步骤,对相应原理不进行介绍:

一、模拟生成数据集

1. 生成无缺失值的数据集

代码如下:

*Format for visit;
PROC FORMAT;
 VALUE vis 1 = 'BL'
 7 = 'DAY 7'
 14= 'EOT'
 28= 'FU D28'
 42= 'FU D42'
 98= 'FU D98';
RUN;
/* Core data simulation */
DATA dd1;
 LENGTH subjid trtp $7. paramcd $4. param $17.;
 *Visit structure;
 ARRAY visits (6) _TEMPORARY_ (1 7 14 28 42 98);
 *Sets seed for all rand functions ;
 CALL STREAMINIT(1977);

 *Data simulation loop;
 DO id = 1 TO 200;
 *Assign subject id;
 subjid='101-'||PUT(id, Z3.);
 *Assign gender;
 IF RAND('Bernoulli', 0.5) = 1 THEN sex='M';
 ELSE sex='F';
 *Assign treatment group;
 IF RAND('Bernoulli', 0.5) = 1 THEN trtp='Active';
 ELSE trtp='Placebo';
 *Assign age;
 age=ROUND(RAND('Normal', 50, 15));
 *Assign result name and short code;
 paramcd='MIDI';
 param='Midichlorians (n)';
 *Simulate results;
 DO i=1 TO DIM(visits);
 avisitn=visits(i);
 avisit=PUT(avisitn, VIS.);
 IF trtp='Active' THEN DO;
 *Produces advancing treatment effect over time;
IF visits(i)=1 then aval=ROUND(RAND('Normal', 10000, 100));
 ELSE aval=ROUND(RAND('Normal', 10000, 100)+visits(i));
 END;
 ELSE DO;
 *Produces no treatment effect for placebo patients;
aval=ROUND(RAND('Normal', 10000, 100));
 END;
 OUTPUT;
 END;
 END;
 DROP i id;
RUN;

生成的完整数据集变量如下:
在这里插入图片描述
trp、sex为分类变量,age为连续性变量,共进行了6次访视, aval为每次访视得到的连续变量值。

2.模拟存在访视缺失数据集

代码如下:

*Derive baseline and simulate missing data;
DATA adeff;
 SET dd1;
 BY subjid;
 CALL STREAMINIT(1980);
 *Derive baseline value;
 RETAIN base .;
 IF first.subjid THEN base=.;
 IF avisit='BL' THEN base= aval;
 *Simulate arbitrary missing data pattern;
 IF avisit ne 'BL' THEN DO;
 IF RAND('Bernoulli', 0.08) THEN DELETE;
 END;
RUN;

在这里插入图片描述
生成的数据存在访视时点数据的缺失,研究目的为比较最后一次访视相比基线(avisitn=98-base)的变化情况

二、MMRM模型

对于连续纵向变量,当数据随机缺失时,混合效应模型重复测量(MMRM)提供稳定的的估计值,无需特定处理

主要有效性终点较基线变化的分析模型将包括固定效应治疗、性别、年龄、访视和治疗-访视交互作用,以及作为连续固定协变量的基线值。

1.数据库整理

代码如下:

*MMRM for post-baseline;
data ana_p;
  set adeff;
  where avisitn in (7,14,28,42,98) ;
  chg=aval-base;
run;

在这里插入图片描述

2.MMRM模型分析

proc mixed data=ana_p(where=( chg ne .));
	class trtp(ref="Placebo")  avisitn sex subjid;
	model chg=base sex age trtp  avisitn trtp*avisitn /htype = 3  ddfm=kenwardroger;
	repeated avisitn / subject = subjid type=un ;
	lsmeans avisitn*trtp / cl diff;
ods output  lsmeans=pls; /*change from baseline to last week**/
run;

最终可得到两组从基线至最后一次访视的最小二乘估计变化
在这里插入图片描述

三、delta方法多重插补

1.数据格式转换

代码如下:

*Transpose to horizontal structure;
PROC TRANSPOSE DATA=adeff OUT=onepersub PREFIX=MIDI;
 BY subjid age sex trtp base paramcd param;
 ID avisitn;
 VAR aval;
RUN;

/*检查数据中每个变量的缺失个数*/
proc means data=onepersub nmiss noprint;
var MIDI1 MIDI7 MIDI14 MIDI28 MIDI42 MIDI98;
output out=miss(drop=_type_ _freq_) nmiss=;
run;

在这里插入图片描述
在这里插入图片描述
数据格式由长转为宽,且可见各次访视存在的缺失情况

2.多重填补思路

在这里插入图片描述
多重填补考虑要点如上图,主要包括:

  1. 判断缺失状态:缺失假设方面MAR、MNAR、MCAR;缺失类型:单调缺失、任意缺失;缺失变量:连续、分类、计数、有序;依据缺失 变量情况采用的填补方法
  2. 依据缺失变量(连续、分类等)确定相应的填补方法进行填补
  3. 基于填补好的数据进行分析
  4. 最终进行汇总分析

整体多重填补思路如下

在这里插入图片描述

(1) 判断缺失情况并进行数据填补

/* Multiple Imputation - 3-step process */
*Step 1a - check missing data pattern (arbitrary vs monotone);
PROC MI DATA=onepersub NIMPUTE=0;
 CLASS sex trtp;
 FCS;
 VAR sex trtp age base midi7 midi14 midi28 midi42 midi98;
RUN; 

在这里插入图片描述
属于任意缺失,且所研究的变量为连续性变量

相应变量的填补方法见下图
变量相应方法
其中 fully conditional specification (FCS) 方法对须填补的连续型变量处于任意缺失、协变量包括分类变量和连续型变量效果较好。

假设该变量为非随机缺失 (MNAR).,采用delta-adjusted pattern imputation:结合FCS方法对数据进行填补

代码如下:

*Step 1b - select appropriate method given missing
 data pattern and variables to be imputed;
proc mi data=onepersub out=imputed seed=125 nimpute=50;
class sex trtp;
var sex trtp age base midi7 midi14 midi28 midi42 midi98;
fcs reg;
mnar 
adjust(midi7 / shift=1 adjustobs=(trtp="Active"))
adjust(midi14 / shift=1 adjustobs=(trtp="Active"))
adjust(midi28  / shift=1 adjustobs=(trtp="Active"))
adjust(midi42 / shift=1 adjustobs=(trtp="Active"))
adjust(midi98 / shift=1 adjustobs=(trtp="Active"));
run;

(2)数据分析

填补后的数据基于ANCOVA方法对访视最后一次相比基线变化进行分析

data imputed;set imputed;chg=midi98-base;run;
*Step 2 - Analysis step;
/*ANCOVA*/
proc mixed data=imputed;
by _imputation_;
       class  sex trtp(ref="Placebo") ;
       model chg =base sex age trtp/htype=3 ddfm=kr;
       lsmeans trtp  /diff alpha=0.05;
     ods output tests3 = etest3 diffs=ediffs lsmeans=els;
run;

(3)合并结果

最终得出分析结果

*Step 3 – Pooling step;
proc sort data=els;by trtp;run;
proc mianalyze data=els;
by trtp;
modeleffects estimate;
stderr stderr;
run; 
proc mianalyze data=ediffs;
modeleffects estimate;
stderr stderr;
run; 

最终两组结果如下
在这里插入图片描述


总结

临床试验中`多次测量数据常采用MMRM模型直接估计缺失值,不进行缺失值填补;
多重填补后的数据可用于敏感性分析以验证结果的稳健性

Reference

  1. Multiple Imputation: A Statistical Programming Story
  2. Using SAS® for Multiple Imputation and Analysis of Longitudinal Data
  3. SAS® V9.4 MNAR statement for multiple imputations for missing not at random in longitudinal clinical trials
  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多重填补(Multiple Imputation)是一种处理缺失数据的方法,在MATLAB中也有相应的函数可以实现。你可以使用MATLAB的fillmissing函数来进行多重填补。具体使用方法如下: 1. 首先,定义一个包含缺失值的矩阵A,例如:A = [5,NaN,7,NaN,3]。 2. 然后,使用fillmissing函数进行填补操作,指定填补方法为'movmean',并设置窗口大小为3。例如:F = fillmissing(A,'movmean',3)。 这样,MATLAB会根据指定的填补方法和参数对缺失值进行填补,返回填补后的矩阵F,其中缺失值被相应的填补值替代。 需要注意的是,MATLAB中没有直接计算F1分数的内置函数,但你可以在MATLAB Central的文件交换平台上找到其他人编写的代码来计算F1分数。可以参考给出的链接来获取相关的代码和使用说明。 请记得将相关函数放到MATLAB的工作文件夹下,以确保正确的运行。 参考文献: MATLAB官方文档:https://ww2.mathworks.cn/help/matlab/ref/fillmissing.html Eugenio Bertolini (2021). Precision, Specificity, Sensitivity, Accuracy & F1-score (https://www.mathworks.com/matlabcentral/fileexchange/86158-precision-specificitysensitivity-accuracy-f1-score), MATLAB Central File Exchange. Retrieved August 5, 2021.<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MATLAB&机器学习进阶](https://blog.csdn.net/qq_53471484/article/details/125583898)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [MATLAB数据预处理之缺失值插补](https://blog.csdn.net/WANGSIRHHXI/article/details/114819183)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值