From 7c26d0cb8834c8a01dc15a98a2842c9f4ae039d9 Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Fri, 21 Mar 2025 16:25:31 +0800 Subject: [PATCH 01/14] feat(SPS4): Initial commit --- ...SPS4 - Specification of Data Imputation.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 specs/SPS4 - Specification of Data Imputation.md diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md new file mode 100644 index 0000000..42a6190 --- /dev/null +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -0,0 +1,20 @@ +# Specification of Data Imputation + +- 创建日期:2025-03-21 +- 更新日期:2025-03-21 + +本文件规定了缺失数据处理的一般规范。 + +## 日期缺失 + +典型例子:不良事件、合并用药的开始日期 + +需要借助一个非缺失的干预日期(治疗开始日期、器械使用事件等)对开始日期进行填补,同时事件的结束日期不能是缺失的。 + +填补规则如下: + +| 缺失值 | 填补规则 | +| -------- | -------------------------------------------------------------------------------------------------------------------------- | +| 日 | 如果年和月与干预日期的年和月相同,并且结束日期在干预日期之后或者缺失,则使用干预日期进行填补;否则填补为 1。 | +| 日/月 | 如果年与治疗开始日期的年份相同,并且结束日期在治疗开始日期之后或者缺失,则使用治疗开始日期进行填补;否则填补为 1 月 1 日。 | +| 日/月/年 | 如果结束日期在治疗开始日期之后或者缺失,则使用治疗开始日期进行填补;否则不进行填补。 | From 66c95f9dcf14eba5597330d26155c55d0e355c8e Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Fri, 21 Mar 2025 16:26:51 +0800 Subject: [PATCH 02/14] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 20f968d..08f8752 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,4 @@ SMJC Programming Specification | [SPS1](./specs/SPS1%20-%20Specification%20of%20Setup.md) | Specification of Setup | Active | | [SPS2](./specs/SPS2%20-%20Specification%20of%20Header%20Comment.md) | Specification of Header Comment | Active | | [SPS3](./specs/SPS3%20-%20Specification%20of%20TFL%20Main%20Program.md) | Specification of TFL Main Program | Active | +| [SPS4](./specs//SPS4%20-%20Specification%20of%20Data%20Imputation.md) | Specification of Data Imputation | Active | From 93127c17f70cbe109df5a598bb37df85eeb2668a Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Fri, 21 Mar 2025 16:28:16 +0800 Subject: [PATCH 03/14] Update SPS4 - Specification of Data Imputation.md --- specs/SPS4 - Specification of Data Imputation.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md index 42a6190..63d9227 100644 --- a/specs/SPS4 - Specification of Data Imputation.md +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -9,12 +9,12 @@ 典型例子:不良事件、合并用药的开始日期 -需要借助一个非缺失的干预日期(治疗开始日期、器械使用事件等)对开始日期进行填补,同时事件的结束日期不能是缺失的。 +需要借助一个非缺失的*干预日期*(治疗开始日期、器械使用事件等)对开始日期进行填补,同时事件的结束日期不能是缺失的。 填补规则如下: -| 缺失值 | 填补规则 | -| -------- | -------------------------------------------------------------------------------------------------------------------------- | -| 日 | 如果年和月与干预日期的年和月相同,并且结束日期在干预日期之后或者缺失,则使用干预日期进行填补;否则填补为 1。 | -| 日/月 | 如果年与治疗开始日期的年份相同,并且结束日期在治疗开始日期之后或者缺失,则使用治疗开始日期进行填补;否则填补为 1 月 1 日。 | -| 日/月/年 | 如果结束日期在治疗开始日期之后或者缺失,则使用治疗开始日期进行填补;否则不进行填补。 | +| 缺失值 | 填补规则 | +| -------- | -------------------------------------------------------------------------------------------------------------------- | +| 日 | 如果年和月与*干预日期*的年和月相同,并且结束日期在*干预日期*之后或者缺失,则使用*干预日期*进行填补;否则填补为 1。 | +| 日/月 | 如果年与*干预日期*的年份相同,并且结束日期在*干预日期*之后或者缺失,则使用*干预日期*进行填补;否则填补为 1 月 1 日。 | +| 日/月/年 | 如果结束日期在*干预日期*之后或者缺失,则使用*干预日期*进行填补;否则不进行填补。 | From 99c29c16a25a447375f109e0657b2c6651f9e7a1 Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Fri, 21 Mar 2025 16:29:07 +0800 Subject: [PATCH 04/14] Update SPS4 - Specification of Data Imputation.md --- specs/SPS4 - Specification of Data Imputation.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md index 63d9227..836c803 100644 --- a/specs/SPS4 - Specification of Data Imputation.md +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -9,12 +9,12 @@ 典型例子:不良事件、合并用药的开始日期 -需要借助一个非缺失的*干预日期*(治疗开始日期、器械使用事件等)对开始日期进行填补,同时事件的结束日期不能是缺失的。 +需要借助一个非缺失的 _干预日期_(治疗开始日期、器械使用事件等)对开始日期进行填补,同时事件的结束日期不能是缺失的。 填补规则如下: -| 缺失值 | 填补规则 | -| -------- | -------------------------------------------------------------------------------------------------------------------- | -| 日 | 如果年和月与*干预日期*的年和月相同,并且结束日期在*干预日期*之后或者缺失,则使用*干预日期*进行填补;否则填补为 1。 | -| 日/月 | 如果年与*干预日期*的年份相同,并且结束日期在*干预日期*之后或者缺失,则使用*干预日期*进行填补;否则填补为 1 月 1 日。 | -| 日/月/年 | 如果结束日期在*干预日期*之后或者缺失,则使用*干预日期*进行填补;否则不进行填补。 | +| 缺失值 | 填补规则 | +| -------- | -------------------------------------------------------------------------------------------------------------------------- | +| 日 | 如果年和月与 _干预日期_ 的年和月相同,并且结束日期在 _干预日期_ 之后或者缺失,则使用 _干预日期_ 进行填补;否则填补为 1。 | +| 日/月 | 如果年与 _干预日期_ 的年份相同,并且结束日期在 _干预日期_ 之后或者缺失,则使用 _干预日期_ 进行填补;否则填补为 1 月 1 日。 | +| 日/月/年 | 如果结束日期在 _干预日期_ 之后或者缺失,则使用 _干预日期_ 进行填补;否则不进行填补。 | From 8b434c35b228d44f031aa295f7100bafa60386c5 Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Fri, 21 Mar 2025 16:30:37 +0800 Subject: [PATCH 05/14] Update SPS4 - Specification of Data Imputation.md --- specs/SPS4 - Specification of Data Imputation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md index 836c803..0658b93 100644 --- a/specs/SPS4 - Specification of Data Imputation.md +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -9,7 +9,7 @@ 典型例子:不良事件、合并用药的开始日期 -需要借助一个非缺失的 _干预日期_(治疗开始日期、器械使用事件等)对开始日期进行填补,同时事件的结束日期不能是缺失的。 +需要借助一个非缺失的 _干预日期_(治疗开始日期、器械使用事件等)对开始日期进行填补。 填补规则如下: From d644a8bc5aef93b831782e05b9c887a32852c987 Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Thu, 15 May 2025 14:48:25 +0800 Subject: [PATCH 06/14] Update SPS4 - Specification of Data Imputation.md --- ...SPS4 - Specification of Data Imputation.md | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md index 0658b93..57e31c1 100644 --- a/specs/SPS4 - Specification of Data Imputation.md +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -18,3 +18,74 @@ | 日 | 如果年和月与 _干预日期_ 的年和月相同,并且结束日期在 _干预日期_ 之后或者缺失,则使用 _干预日期_ 进行填补;否则填补为 1。 | | 日/月 | 如果年与 _干预日期_ 的年份相同,并且结束日期在 _干预日期_ 之后或者缺失,则使用 _干预日期_ 进行填补;否则填补为 1 月 1 日。 | | 日/月/年 | 如果结束日期在 _干预日期_ 之后或者缺失,则使用 _干预日期_ 进行填补;否则不进行填补。 | + +## 评价指标缺失 + +典型例子:评价指标在多个访视均有收集,但其中一个访视作为主要评价的时间点。 + +使用多重填补,根据数据缺失的模式(单调缺失、随机缺失)选择具体的填补方法。 + +主要填补步骤如下: + +1. 使用 `PROC MI` 过程填补成多个完整的数据集; +2. 对多个完整的数据集分别建模,得到一组效应量(包含效应量和效应量的标准误); +3. 使用 `PROC MIANALYZE` 过程合并效应量,得到最终的结果。 + +例如:在一个平行阳性对照、非劣效试验中,主要指标在基线、治疗后 1 个月、治疗后 3 个月、6 个月均有收集,其中 6 个月为主要指标的评价时间点,数据缺失模式为随机缺失。 + +参考代码如下: + +```sas +/*将访视数据横向排列*/ +proc sql noprint; + create table analysis as + select + a.usubjid, + a.arm, + a.armn, + b0.base as base, + b1.aval as aval1, + b3.aval as aval3, + b6.aval as aval6, + from adsl as a left join adrs(where = (ablfl = "Y")) as b0 on a.usubjid = b0.usubjid + left join adrs(where = (avisit = "治疗后1个月")) as b1 on a.usubjid = b1.usubjid + left join adrs(where = (avisit = "治疗后3个月")) as b3 on a.usubjid = b3.usubjid + left join adrs(where = (avisit = "治疗后6个月")) as b6 on a.usubjid = b6.usubjid + ; +quit; + +/*FCS 方法多重填补*/ +proc mi data = analysis out = mi_out nimpute = 5 minimum = . 0 0 0 0 maximum = . 100 100 100 100 round = . 1 1 1 1; + class arm; + var arm base aval1 aval3 aval6; + fcs reg(aval6 = arm base aval1 aval3); +run; + +/*用填补数据建模*/ +ods output LSMeans = LSMeans Estimates = Estimates; +proc glm data = mi_out plots=none; + class arm site; + model aval6 = arm site; + lsmeans arm /cl stderr; + estimate "试验组 vs 对照组" arm -1 1; + by _Imputation_; +quit; + +/*合并分析结果*/ +proc sort data = LSMeans; + by arm; +run; + +ods output ParameterEstimates = LSMeansPE; +proc mianalyze data = LSMeans; + modeleffects LSMean; + stderr stderr; + by arm; +run; + +ods output ParameterEstimates = EstimatesPE; +proc mianalyze data = Estimates; + modeleffects Estimate; + stderr StdErr; +run; +``` From bfa59ad2f3df4f661a05d5053d67bb93b4659253 Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Thu, 15 May 2025 14:49:01 +0800 Subject: [PATCH 07/14] Update SPS4 - Specification of Data Imputation.md --- specs/SPS4 - Specification of Data Imputation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md index 57e31c1..5176179 100644 --- a/specs/SPS4 - Specification of Data Imputation.md +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -1,7 +1,7 @@ # Specification of Data Imputation - 创建日期:2025-03-21 -- 更新日期:2025-03-21 +- 更新日期:2025-05-15 本文件规定了缺失数据处理的一般规范。 From 03bcab3907ca1752fa6589de890f2ceae2fa91e5 Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Thu, 15 May 2025 14:50:22 +0800 Subject: [PATCH 08/14] Update SPS4 - Specification of Data Imputation.md --- specs/SPS4 - Specification of Data Imputation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md index 5176179..aeaf9f6 100644 --- a/specs/SPS4 - Specification of Data Imputation.md +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -47,7 +47,7 @@ proc sql noprint; b1.aval as aval1, b3.aval as aval3, b6.aval as aval6, - from adsl as a left join adrs(where = (ablfl = "Y")) as b0 on a.usubjid = b0.usubjid + from adsl as a left join adrs(where = (ablfl = "Y")) as b0 on a.usubjid = b0.usubjid left join adrs(where = (avisit = "治疗后1个月")) as b1 on a.usubjid = b1.usubjid left join adrs(where = (avisit = "治疗后3个月")) as b3 on a.usubjid = b3.usubjid left join adrs(where = (avisit = "治疗后6个月")) as b6 on a.usubjid = b6.usubjid From 7671399f8c85d72cbffabfe85a2f27ca72a25b61 Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Thu, 15 May 2025 14:52:54 +0800 Subject: [PATCH 09/14] Update SPS4 - Specification of Data Imputation.md --- specs/SPS4 - Specification of Data Imputation.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md index aeaf9f6..4998dcf 100644 --- a/specs/SPS4 - Specification of Data Imputation.md +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -41,6 +41,7 @@ proc sql noprint; create table analysis as select a.usubjid, + a.site, a.arm, a.armn, b0.base as base, @@ -56,8 +57,8 @@ quit; /*FCS 方法多重填补*/ proc mi data = analysis out = mi_out nimpute = 5 minimum = . 0 0 0 0 maximum = . 100 100 100 100 round = . 1 1 1 1; - class arm; - var arm base aval1 aval3 aval6; + class arm site; + var arm site base aval1 aval3 aval6; fcs reg(aval6 = arm base aval1 aval3); run; From be56f80ee37e2d605c77dd06ecf7d96296e7079b Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Thu, 15 May 2025 14:54:37 +0800 Subject: [PATCH 10/14] Update SPS4 - Specification of Data Imputation.md --- specs/SPS4 - Specification of Data Imputation.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md index 4998dcf..3f2cdc6 100644 --- a/specs/SPS4 - Specification of Data Imputation.md +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -31,7 +31,7 @@ 2. 对多个完整的数据集分别建模,得到一组效应量(包含效应量和效应量的标准误); 3. 使用 `PROC MIANALYZE` 过程合并效应量,得到最终的结果。 -例如:在一个平行阳性对照、非劣效试验中,主要指标在基线、治疗后 1 个月、治疗后 3 个月、6 个月均有收集,其中 6 个月为主要指标的评价时间点,数据缺失模式为随机缺失。 +例如:在一个平行阳性对照、非劣效试验中,主要指标在基线、治疗后 1 个月、治疗后 3 个月、6 个月均有收集,其中 6 个月较基线变化值为主要指标的评价时间点,数据缺失模式为随机缺失。 参考代码如下: @@ -55,23 +55,31 @@ proc sql noprint; ; quit; + /*FCS 方法多重填补*/ proc mi data = analysis out = mi_out nimpute = 5 minimum = . 0 0 0 0 maximum = . 100 100 100 100 round = . 1 1 1 1; class arm site; var arm site base aval1 aval3 aval6; - fcs reg(aval6 = arm base aval1 aval3); + fcs reg(aval6 = arm site base aval1 aval3); +run; + +data mi_out; + set mi_out; + chg = aval6 - base; run; + /*用填补数据建模*/ ods output LSMeans = LSMeans Estimates = Estimates; proc glm data = mi_out plots=none; class arm site; - model aval6 = arm site; + model chg = arm site; lsmeans arm /cl stderr; estimate "试验组 vs 对照组" arm -1 1; by _Imputation_; quit; + /*合并分析结果*/ proc sort data = LSMeans; by arm; From ca38daa59727df3151dd7009a78f153fc67d48be Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Thu, 15 May 2025 14:55:43 +0800 Subject: [PATCH 11/14] Update SPS4 - Specification of Data Imputation.md --- specs/SPS4 - Specification of Data Imputation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md index 3f2cdc6..038cee5 100644 --- a/specs/SPS4 - Specification of Data Imputation.md +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -36,7 +36,7 @@ 参考代码如下: ```sas -/*将访视数据横向排列*/ +/*将各访视数据横向排列*/ proc sql noprint; create table analysis as select @@ -95,6 +95,6 @@ run; ods output ParameterEstimates = EstimatesPE; proc mianalyze data = Estimates; modeleffects Estimate; - stderr StdErr; + stderr stderr; run; ``` From 592f85fa2cce76c546b184c76d1df8a011f446d7 Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Thu, 15 May 2025 14:57:24 +0800 Subject: [PATCH 12/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08f8752..6b8319b 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,4 @@ SMJC Programming Specification | [SPS1](./specs/SPS1%20-%20Specification%20of%20Setup.md) | Specification of Setup | Active | | [SPS2](./specs/SPS2%20-%20Specification%20of%20Header%20Comment.md) | Specification of Header Comment | Active | | [SPS3](./specs/SPS3%20-%20Specification%20of%20TFL%20Main%20Program.md) | Specification of TFL Main Program | Active | -| [SPS4](./specs//SPS4%20-%20Specification%20of%20Data%20Imputation.md) | Specification of Data Imputation | Active | +| [SPS4](./specs/SPS4%20-%20Specification%20of%20Data%20Imputation.md) | Specification of Data Imputation | Active | From 25e3573887e5fa9cebe8ecfe0dbb0dd957b3592d Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Thu, 15 May 2025 16:57:22 +0800 Subject: [PATCH 13/14] Update SPS4 - Specification of Data Imputation.md --- specs/SPS4 - Specification of Data Imputation.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md index 038cee5..54bfc9c 100644 --- a/specs/SPS4 - Specification of Data Imputation.md +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -42,6 +42,7 @@ proc sql noprint; select a.usubjid, a.site, + a.siteid, a.arm, a.armn, b0.base as base, @@ -58,9 +59,9 @@ quit; /*FCS 方法多重填补*/ proc mi data = analysis out = mi_out nimpute = 5 minimum = . 0 0 0 0 maximum = . 100 100 100 100 round = . 1 1 1 1; - class arm site; - var arm site base aval1 aval3 aval6; - fcs reg(aval6 = arm site base aval1 aval3); + class arm siteid; + var arm siteid base aval1 aval3 aval6; + fcs reg(aval6 = arm siteid base aval1 aval3); run; data mi_out; @@ -72,8 +73,8 @@ run; /*用填补数据建模*/ ods output LSMeans = LSMeans Estimates = Estimates; proc glm data = mi_out plots=none; - class arm site; - model chg = arm site; + class arm siteid; + model chg = arm siteid; lsmeans arm /cl stderr; estimate "试验组 vs 对照组" arm -1 1; by _Imputation_; From 7880c470229fc568e6c3efd3eccf1271fcdc255a Mon Sep 17 00:00:00 2001 From: Kun Jinkao <45487685+Snoopy1866@users.noreply.github.com> Date: Thu, 15 May 2025 17:00:28 +0800 Subject: [PATCH 14/14] Update SPS4 - Specification of Data Imputation.md --- specs/SPS4 - Specification of Data Imputation.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/specs/SPS4 - Specification of Data Imputation.md b/specs/SPS4 - Specification of Data Imputation.md index 54bfc9c..dbdf821 100644 --- a/specs/SPS4 - Specification of Data Imputation.md +++ b/specs/SPS4 - Specification of Data Imputation.md @@ -99,3 +99,7 @@ proc mianalyze data = Estimates; stderr stderr; run; ``` + +> [!WARNING] +> +> 分类变量使用 `site` 和 `siteid` 可能会导致不同的结果,这是因为 `site` 的排序结果和 `siteid` 可能不一致。