446 Views
May 26, 25
スライド概要
SASデータセットとDataset-JSON v1.1を読み書きするマクロの使い方
SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです
日本ユーザー向け はじめてのDataset-JSON sas_dataset_jsonの使い方 2025-05-25 m_sas_to_json1_1.sas m_json1_1_to_sas.sas 森岡 裕 (イーピーエス株式会社)
プログラムの場所と,はじめに 最新のプログラムは常にgithub上に公開.MITライセンスの範囲で自由に使用ください. 随時バクフィックスしながら更新しています https://github.com/Morioka-Yutaka/sas_dataset_json/tree/main もし,不具合等あればgithub上か, お問い合わせフォームまでコメントいただければ助かります
準拠している仕様,採用しているフレームワーク,おすすめのDataset-JSON Viewer CDISC Dataset-JSON Specification 2024-12-05 (version 1.1) https://cdisc-org.github.io/DataExchange-DatasetJson/doc/dataset-json1-1.html に準拠して,Dataset-JSON SAS Dataset の変換を行うことを目指しています マクロはそれぞれ単体で機能するため,ここのマクロをダウンロードして使うことができます またSAS_PACKAGES - a SAS Packages Framework(https://github.com/yabwon/SAS_PACKAGES) のフレームワークで開発しておりSASPACからパッケージ呼び出しで使用することもできます VDE Dataset ViewerをDataset-JSONのビューワーとして紹介しています.CDISCの公式ハッカソンの優勝 ソフトウェアになります •Viewer Repository •Short Video Demonstration
① SASデータセットをDatast-JSON(version1.1)に変換する マクロごとに単体使用するケースを紹介します.SASPACによるパッケージ呼び出しは後半で % m_sas_to_json1_1 SASからJSON https://github.com/Morioka-Yutaka/sas_dataset_json/blob/main/sas_dataset_json/06_macros/m_sas_to_json1_1.sas ダウンロード
とりあえず,何かデータセットをDataset-JSON形式でだしてみる 別にSDTM/ADaMじゃなくてもDataset-JSON形式にできる %m_sas_to_json1_1(outpath =xxxxxxxx, library = sashelp, dataset = class, pretty = Y );
SASデータセット名が強制で入る SASデータセットラベルが強制で入る オブザベーション数が強制で入る データセット最終更新日時が強制で入る ※modifyステートメントやProc sqlのupdate等を使った場合,作成日と更新日は異なる 変数数が強制で入る データセット作成日時が強制で入る IG.SASデータセット名が強制で入る データセットレベルでのメタ情報①
マクロパラメーター sourceSystem_name = もしくは” sourceSystem_name”で拡張属性を付与することで 変更可能. 指定しなければSAS on &SYSSCPLが付与される. &SYSSCPLはSASの自動マクロ変数でSASの システム情報がはいる マクロパラメーター sourceSystem_version = もしくは” sourceSystem_version”で拡張属性を付与するこ とで変更可能. 指定しなければscan( &SYSVLONG,1,P)が付与される. & SYSVLONGはSASの自動マクロ 変数でSASのシステム情報がはいる マクロパラメーター fileOID = もしくは” fileOID”で拡張属性 を付与することで変更可能. 指定しなけれ ば”www.cdisc.org/StudyMSGv2/1/Define-XML_2.1.0/202411-11/データセット名”が付与される. マクロパラメーター fileOID = もしくは” fileOID”で拡張属性を付与することで変更可能. 指定しなけれ ば”DUMMY-111”が付与される. マクロパラメーター originator= もしく は”originator”で拡張属性を付与することで 変更可能.指定しなければDUMMY Corporationと入る マクロパラメーター metaDataVersionOID = もしくは” metaDataVersionOID”で拡張属性を付与することで変更可能. 指定しな ければ” MDV.MSGv2.0.SDTMIG.3.3.SDTM.1.7”が付与される. 現状,固定で1.1.0といれるようにしている データセットレベルでのメタ情報② 基本的には,デフォルト値からの変更はマクロパラメータでの指定か,拡張属性による上書きを利用
Data Typeは拡張属性dataTypeで上書き可能である Target Data Typeは拡張属性targetDataTypeで上書き可能である Lengthは拡張属性lengthで上書き可能である ※実際のlengthを属性上上書きする状況は想像しがたい Display Formatは拡張属性displayFormatで上書き可能である ※実際当たっているフォーマットを上書きする状況は想像しがたい Key Sequenceは拡張属性keySequenceで上書き可能である Item OIDはIT.データセット名.変数名で自動設定される 変数レベルのメタデータ Nameには変数名,Labelには変数ラベル,LengthにはデータセットでのLengthが入る. Display Formatにはデータセットで適用されているSASフォーマットがはいる. Datatypeについて,文字型はstring,数値型はintegerになる.ただし,拡張属性で上書き設定することを前提にしている. HOUR,TOD,TIMEがDisplay Formatになっている場合,Data Typeは自動でTimeとなり,Target Data Typeはintegerとなる DATE,DDMMYY,MMDDYY,DDMMYY, 8601DAがDisplay Formatになっている場合,Data Typeは自動でDateとなり,Target Data Type はintegerとなる DATETIME,DATEAMPM,8601DTがDisplay Formatになっている場合,Data Typeは自動でDateとなり,Target Data Typeはintegerとなる .
/*test_data*/ data adsl; attrib STUDYID label="Study Identifier" length=$20. USUBJID label="Unique Subject Identifier" length=$20. RFSTDTC label="Subject Reference Start Date/Time" length=$10. AGE label="Age" length=8. TRTSDT label="Date of First Exposure to Treatment" length=8. format=E8601DA. ; STUDYID ="XXXX-001";USUBJID="YYYY-01";RFSTDTC="2025-01-01";AGE=41;TRTSDT="01Jun2025"d;output; STUDYID ="XXXX-001";USUBJID="YYYY-02";RFSTDTC="2025-02-01";AGE=51;TRTSDT="01Feb2025"d;output; run; %m_sas_to_json1_1(outpath =XXXX,library = work,dataset = adsl,pretty = Y);
%m_sas_to_json1_1(outpath =XXXX,library = work,dataset = adsl,pretty = Y); %m_sas_to_json1_1(outpath =XXXX,library = work,dataset = adsl,pretty prettyはJSON構造を改行で見やすくするだけの機能であるため,データ転送時はNにする. 中身をテキストで見たい時のみYにする.Nにしないと容量が大きくなる.(デフォルトはY) = N);
proc datasets nolist; modify adsl; xattr add ds originator="X corp." fileOID="www.cdisc.org/StudyMSGv2/1/Define-XML_2.1.0/2024-11-11/" studyOID="XX001-001" metaDataVersionOID="MDV.MSGv2.0.SDTMIG.3.4.SDTM.2.0" sourceSystem_name="SASxxxx" sourceSystem_version="9.4xxxx" ; xattr add var STUDYID (label="Study Identifier" dataType="string" length=8 keySequence=1) USUBJID (label="Unique Subject Identifier" dataType="string" length=7 keySequence=2) RFSTDTC (label="Subject Reference Start Date/Time" dataType="date") AGE (label="Age" dataType="integer" length=2) TRTSDT (label="Date of First Exposure to Treatment" dataType="date" targetDataType="integer" displayFormat="E8601DA.") Proc datasetsの Xattr add dsでデータセットレベルの拡張属性 Xattr add varで変数レベルの拡張属性をつけると それをDataset-JSONに反映できるのが このマクロの特徴である ; ; run; quit; %m_sas_to_json1_1(outpath = XXXXX, library = WORK, dataset = adsl, pretty = Y );
拡張属性での指定が デフォルトより優先されていることが わかる
② Datast-JSON(version1.1)をSASデータセットに変換する マクロごとに単体使用するケースを紹介します.SASPACによるパッケージ呼び出しは後半で % m_json1_1_to_sas JSONからSAS https://github.com/Morioka-Yutaka/sas_dataset_json/blob/main/sas_dataset_json/06_macros/m_sas_to_json1_1.sas ダウンロード
以下にFDAのPilot Studyで実際に使用されたDataset-JSON v1.1がSDTM/ADaMともに 公開されているので,これをSASデータセットにできるかを試してみる https://github.com/cdisc-org/sdtm-adam-pilot-project/tree/master/updated-pilot-submissionpackage/900172/m5/datasets/cdiscpilot01/analysis/adam/datasets
%m_json1_1_to_sas( inpath=xxxxxx ,ds=adae) 指定はパスと拡張子前のデータセット名のみ
proc contents data=adae varnum; run; Dataset-JSON内のメタデータは拡張属性に自動的に格納されている
DataTypeが Date, Datetime, Timeであり,TargetTypeがintegerである場合, つまりADaMのADTやADTM等の場合は,Dataset-JSONで正しく属性がついていれば自動的に型変換される ただし,decimal型については,SASとRではサポートしておらず,Pythonのみであるため,Warningメッセー ジをだしたうえでbestフォーマットで読みこむ
https://github.com/yabwon/SAS_PACKAGES filename spf “ SAS_PACKAGES から落としてきたSPFフォルダのパス" ; %include spf(SPFinit.sas) ; filename packages “右上で落としてきたパッケージのzipファイル"; %loadPackage(sas_dataset_json) ; Rでいうinstall.packagesとlibraryと同じ機能で,これよって,以降パッケージ内のマクロをすべて 呼び出し可能
https://github.com/Morioka-Yutaka/sas_dataset_json/tree/main 今後は ・ndjson形式の読み書きの実装 ・define.xmlを読み込んで拡張属性を作る機能の実装 ・dataset-JSONの出来上がりに規格仕様との齟齬がないかのチェック機構 などを追加していきたい https://github.com/Morioka-Yutaka/sashash 作者の別の,パッケージ.SASでハッシュオブジェクトによるkey-data処理を簡 易に行える