1.7K Views
October 21, 24
スライド概要
[第10回大阪sas勉強会]
SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです
統計解析結果の バリデーションを考える 大阪大学医学部附属病院 増村 一穂
目次 ● 背景 ● 解析結果の誤りはどこで発生するのか ● 工程毎のバリデーション ● まとめ
背景 120 N 性別 年齢 男性(1) 61(50.8%) 女性(2) 59(49.2%) 50歳以上(1) 75(62.5%) 50歳未満(2) 45(37.5%) 上記の解析結果を見て何か気づくことはありますでしょうか
背景 120 N 性別 年齢 男性(1) 59(49.2%) 女性(2) 61(50.8%) 50歳以上(1) 75(62.5%) 50歳未満(2) 45(37.5%) 男性と女性の数が逆になっています 男性:1、女性2で集計すべき結果を 男性2、女性1で集計したことによるプログラム誤りが原因 解析結果の誤りは気づきにくい 正確な統計解析結果にはバリデーション(validation:確認)が必須
解析結果の誤りはどこで発生するのか データベース 構造定義書 ② ① 研究実施計画書 (プロトコル) プログラム 仕様書 ④ 統計解析 計画書 ③ 統計解析 データセット (SAS) 統計解析結果 EDCデータ ①:データベース構造定義書+研究実施計画書 ②:統計解析計画書 ③:EDCデータ+プログラム仕様書 ④:統計解析データセット+プログラム仕様書 ⇒ ⇒ ⇒ ⇒ 統計解析計画書 プログラム仕様書 統計解析データセット 統計解析結果 ①~④、どこでも統計解析結果誤りの原因は発生する可能性がある
赤文字は突合 青文字は情報元が未記載 解析結果作成工程① データベース構造定義書 登録情報 登録日 Visit 血液検査 薬物療法 薬物療法後治療 生存情報 検査項目A 検査値B 検査値C 投与開始日 投与終了日 投与開始日 投与終了日 死亡の有無 死亡日 統計解析計画書 SUBJDAT YYYY/MM/DD Week1/Week2/ VISIT Week3 ITEMA はい/いいえ ITEMB xx.xx ITEMC xx.xx DRUGSTDAT YYYY/MM/DD DRUGENDAT YYYY/MM/DD ADRUGSTDAT YYYY/MM/DD ADRUGENDAT YYYY/MM/DD DSYN あり/なし DSDAT YYYY/MM/DD 研究実施計画書 解析1 ・血液検査において初週における検査値の統計量を 算出する。また、指標Dは検査値BとCの和より算出 する 解析2 ・全生存期間(Overall Survival:OS)(薬物療法 開始から死亡までの期間)に対する解析を実施する 解析1 Week1における以下の統計量を算出する。 定性評価は頻度、割合を算出し、定量評価は 総数、平均、標準偏差、最大値、最小値を算出 する。また、指標DはB+Cとし、一方が欠測の 場合はDも欠測とする。 ・定性評価:検査項目A ・定量評価:検査値B、検査値C、指標D 解析2 死亡をイベントとしたKaplan-Meier曲線を描く。 開始日を薬物療法における投与開始日、 イベント日を死亡日とする。イベント未発生の 場合は2年(730日)で打ち切りとする グラフの描画にあたっては以下の通り作成する。 縦軸:イベント発生割合 横軸:50日刻み
解析結果作成工程② プログラム仕様書 統計解析計画書 解析データセット 解析1 Week1における以下の統計量を算出する。定性 評価は頻度、割合を算出し、定量評価は総数、 平均、標準偏差、最大値、最小値を算出する。 また、指標DはB+Cとし、一方が欠測の場合はD も欠測とする。 ・定性評価:検査項目A ・定量評価:検査値B、検査値C、指標D 解析2 死亡をイベントとしたKaplan-Meier曲線を描く。 開始日を薬物療法における投与開始日、 イベント日を死亡日とする。イベント未発生の 場合は2年(730日)で打ち切りとする グラフの描画にあたっては以下の通り作成する。 縦軸:イベント発生割合 横軸:50日刻み 赤文字は突合 青文字は情報元が未記載 項目A ITEM_A 項目B ITEM_B 項目C ITEM_C 項目D ITEM_D 検査項目A:ITEMA where=(Visit = "week1") 検査値B:ITEMB where=(Visit = "week1") 検査値C:ITEMC where=(Visit = "week1") ITEM_B + ITEM_C ただしどちらかが欠損の場合は欠損とする イベント起点日 EVENT_STDAT 【薬物療法】投与開始日:DRUGSTDAT イベント発生 EVENT_YN イベント発生日 EVENT_DAT イベント発生期間 EVENT_TERM 死亡の有無:DSYN 1:あり 0:なし 死亡日:DSDAT 死亡無しの場合はEVENT_STDAT+730 EVENT_DAT – EVENT_STDAT 統計解析結果 解析1 ITEM_A:はい、いいえの頻度割合 ITEM_B、ITEM_C、ITEM_D:統計量算出 解析2 proc lifetest data=【INDATA】 plots=survival(atrisk=0 to 730 by 50); time EVENT_TERM * EVENT_YN(0); run;
DB構造定義書+プロトコル ⇒ 統計解析計画書 統計解析計画書 ⇒ プログラム仕様書 発生する可能性のあるミス 対策(バリデーション) DB構造定義書+プロトコル ⇒ 統計解析計画書 統計解析計画書 ⇒ プログラム仕様書 上記資料間にて実施すべき内容が記載されていない、 もしくは誤った記載となっている 似たような名称のデータを間違えて使用する 記載内容のマッピング 元資料から作成された資料の間において内容の 突合せを行い、記載漏れ、記載誤りを確認する。 確認結果に対する有識者(データ関連担当者、 【例】 生存時間解析にあたって起点日は「薬物療法の投与開始日」 担当医師など)のレビューも重要である を使用するが、誤って似たような名称の「薬物療法後治療の 投与開始日」を使用してしまった 未確認の情報がある 【例】 イベント未発生の場合の打ち切り日 生存時間分析グラフ描画にあたっての情報 情報元(打ち合わせ記録など)の明確化 打ち合わせによる決定事項であれば別資料 として添付しておくのが望ましい
解析結果作成工程③ プログラム仕様書:解析データセット 項目A ITEM_A 項目B ITEM_B 項目C ITEM_C 項目D ITEM_D 検査項目A:ITEMA where=(Visit = "week1") 検査値B:ITEMB where=(Visit = "week1") 検査値C:ITEMC where=(Visit = "week1") ITEM_B + ITEM_C ただしどちらかが欠損の場合は欠損とする イベント起点日 EVENT_STDAT 【薬物療法】投与開始日:DRUGSTDAT イベント発生 EVENT_YN イベント発生日 EVENT_DAT イベント発生期間 EVENT_TERM 死亡の有無:DSYN 1:あり 0:なし 死亡日:DSDAT 死亡無しの場合はEVENT_STDAT+730 EVENT_DAT – EVENT_STDAT プログラム仕様書:統計解析 解析1 ITEM_A:はい、いいえの頻度割合 ITEM_B、ITEM_C、ITEM_D:統計量算出 解析2 proc lifetest data=【INDATA】 plots=survival(atrisk=0 to 730 by 50); time EVENT_TERM * EVENT_YN(0); run; 解析データセット SUBJID ITEM_A OSK001 はい OSK002 いいえ OSK003 はい OSK004 いいえ OSK005 いいえ OSK006 いいえ OSK007 はい ITEM_B ITEM_C 20 12 9 6 18 5 ITEM_D 30 26 12 5 22 6 2 50 38 21 11 24 7 SUBJID EVENT_STDAT EVENT_YN EVENT_DAT EVENT_TERM OSK001 OSK002 OSK003 OSK004 OSK005 OSK006 OSK007 2020/1/1 2020/1/1 2020/1/1 2020/1/1 2020/1/1 2020/1/1 2020/1/1 0 2021/12/31 1 2020/1/10 1 2020/1/19 0 2021/12/31 0 2021/12/31 1 2020/1/30 1 2020/2/20 730 9 18 730 730 29 50
プログラム仕様書 ⇒ 解析データセット 発生する可能性のあるミス プログラムコードミス 対策(バリデーション) ダブルプログラミングの場合 main側、sub側、それぞれが作成したSASデータ セットに対するCompareプロシージャの実行 シングルプログラミングの場合 無し・・・(解析結果にて対策) Compareプロシージャの差分観点 (この資料の末尾にそれぞれの観点結果を記載しています) 観点 異なっていた場合 備考、対策 変数の順番 問題無し データセットと仕様書の可読性が悪くなるので 仕様書通りに作成することを推奨する 余分な変数(設計書に無い変数、フ ラグ変数など) NG 仕様書以外の変数は残さない 変数の属性(長さ、フォーマット) NG 仕様書に属性に関する内容を明確に記載する ソート順 NG 仕様書にソートキーを明確に記載する
解析結果作成工程④ 解析結果 N 解析データセット SUBJID ITEM_A OSK001 はい OSK002 いいえ OSK003 はい OSK004 いいえ OSK005 いいえ OSK006 いいえ OSK007 はい 検査項目A ITEM_B ITEM_C 20 12 9 6 18 5 ITEM_D 30 26 12 5 22 6 2 検査値C 24 7 指標D SUBJID EVENT_STDAT EVENT_YN EVENT_DAT EVENT_TERM OSK001 OSK002 OSK003 OSK004 OSK005 OSK006 OSK007 2020/1/1 2020/1/1 2020/1/1 2020/1/1 2020/1/1 2020/1/1 2020/1/1 0 2021/12/31 1 2020/1/10 1 2020/1/19 0 2021/12/31 0 2021/12/31 1 2020/1/30 1 2020/2/20 検査値B 50 38 21 11 730 9 18 730 730 29 50 はい いいえ N 平均(標準偏差) 最小、最大 N 平均(標準偏差) 最小、最大 N 平均(標準偏差) 最小、最大 7 3(42.9%) 4(57.1%) 6 11.67(6.22) 5 , 20 7 14.71(11.21) 2 , 30 6 25.17(16.31) 7 , 50
解析データセット ⇒ 解析結果 発生する可能性のあるミス 対策(バリデーション) ダブルプログラミングの場合 プログラムコードミス 解析結果(帳票)の比較(WinMergeなど) (資料の末尾にWinMergeによるExcel帳票比較の方法を記載しています) シングルプログラミングの場合 1人ダブルチェック(別方法で集計する) 様々な都合などもありますが、品質面から 基本的にダブルプログラミングを推奨します
WinMergeについて(Excel帳票、画像ファイルの比較) 表の差分を明確に出来ます
WinMergeについて(Excel帳票、画像ファイルの比較) 画像ファイル(図など)も比較できます
WinMergeについて(Excel帳票、画像ファイルの比較) 比較結果(差分証跡)ファイルも残せます
シングルプログラミングの場合のバリデーション 解析結果に対して別方法の集計を実施して確認する 【例】元データに対してExcel関数やフィルタを駆使して統計量や頻度を算出する SUM 統計解析結果 EDCデータ はい 7 3(42.9%) いいえ 4(57.1%) N 6 検査値B 平均(標準偏差) 11.67(6.22) 検査値C 最小、最大 N 平均(標準偏差) 最小、最大 N 5 , 20 7 14.71(11.21) 2 , 30 6 指標D 平均(標準偏差) 25.17(16.31) 最小、最大 7 , 50 N SUBJID ITEM_A ITEM_B ITEM_C ITEM_D OSK001 はい OSK002 いいえ OSK003 はい OSK004 いいえ OSK005 いいえ OSK006 いいえ OSK007 はい 20 12 9 6 18 5 30 26 12 5 22 6 2 AVERAGE 50 38 21 11 検査項目A 24 7 STDEV MAX、MIN デメリット 複雑な統計手法を 用いた結果の確認は 困難
まとめ 解析結果は一目では正しいかどうか判断できない。解析結果の確認のためにバリデーションは重要 解析結果の誤り原因は DB構造定義書+プロトコル ⇒ 統計解析計画書 ⇒ プログラム仕様書 ⇒ 統計解析データセット ⇒ 統計解析結果 のどの工程でも発生する可能性がある。バリデーションは全工程に実施すべきである DB構造定義書+プロトコル ⇒ 統計解析計画書 ⇒ プログラム仕様書 記載内容のマッピング(資料突合)、情報元の明確化 が重要 ここで誤ると後工程でどれだけ丁寧に作業しても解析結果は誤ったものとなる プログラム仕様書 ⇒ 統計解析データセット ⇒ 統計解析結果 ・Compareプロシージャ、WinMergeなど ・シングルプログラムは比較作業が困難となる、または品質面的に非推奨
ご清聴ありがとうございました