散布図行列 というか複合パネルのグラフ

 SASユーザー総会2023で「SASによる散布図行列の実装」っていう素晴らしい発表があって
https://sas-user2023.ywstat.jp/download.html?n=36&key=ensdaeeadcsr

それが呼び水となって
SASブログの方で
「SASで散布図行列を作図する -layout latticeの仕様について-」
https://superman-jp.hatenablog.com/entry/SAS-GTL-scatterplotmatrix



「新しい散布図行列の作成法Ⅰ」
https://sasonediver.blog.fc2.com/blog-entry-531.html

があがって,なんなの,今はプロットマトリクス作るのがブームなの笑
ってことで,ちょっと,ついでにオマケ情報で 違う作り方を
SAS Oneブログさんの方の「新しい散布図行列の作成法Ⅰ」とおんなじで,とりまSGで作ってそれを貼り合わせてもいいんじゃない?って時に Python呼び込んでも全然ありと思うのですが,私はRWIが楽と思ってます
ほんと楽で…

もうプロットの部分は皆さんがやってるので,特に言いたいことはないので,合成法だけ
















👆これをつかって3*3のプロットマトリクスにしてみますね

options printerpath=png nodate nonumber  papersize=('15cm' ,'15cm')  ;

ods printer file='XXX\TEST.png' nogtitle dpi=500;

title;

data _NULL_;

dcl odsout ob();

  ob.layout_gridded( columns:3, rows:3 );

  ob.region();

  ob.image( file: "XXX\PharmaSUG.png" );

  ob.region();

  ob.image( file: "XXX\PharmaSUG.png" );

  ob.region();

  ob.image( file: "XXX\PharmaSUG.png" );

  ob.region();

  ob.image( file: "XXX\PharmaSUG.png" );

  ob.region();

  ob.image( file: "XXX\PharmaSUG.png" );

  ob.region();

  ob.image( file: "XXX\PharmaSUG.png" );

  ob.region();

  ob.image( file: "XXX\PharmaSUG.png" );

  ob.region();

  ob.image( file: "XXX\PharmaSUG.png" );

  ob.region();

  ob.image( file: "XXX\PharmaSUG.png" );

run;

ods printer close;




















ob.layout_gridded( columns:3, rows:3 ); 
👆ここでマトリクス構造を指定したら
あとは

  ob.region();

  ob.image( file: "XXX\PharmaSUG.png" );

で順番に画像ファイルを指定するだけ

チョー簡単

Dataset-JSONとかの話②

読み込みとかだと こんな感じか? まだまだ これから検証してかないとですが 


%macro imp_json(inpath=XXXX,ds=);

filename js "&inpath\&ds..json" encoding="utf-8";

libname in json fileref=js ;

proc copy in = in out = work ;

run ;

libname in clear ;

filename js clear;


data _null_;

set Itemgroupdata_ig_&ds.;

call symputx("name",name);

call symputx("label",label);

run;

 


data _null_;

set Ig_&ds._items end=eof;

 call symputx( cats("rename",ordinal_items), cats("element",ordinal_items)||"="|| name );

 call symputx( cats("label",ordinal_items), cats("element",ordinal_items)||"='"|| cats(label,"'") );


 if ^missing(displayFormat) then do;

  call symputx( cats("format",ordinal_items), cats("element",ordinal_items)||" "|| cats(displayFormat,"") );

 end;

 else do;

  call symputx( cats("format",ordinal_items),"");

 end;


 if eof then call symputx("last_ordinal_items",ordinal_items);

run;

options mprint;


%macro create;

data &name(label="&label" drop=ordinal_IG_&ds ordinal_itemData ITEMGROUPDATASEQ);

 set Ig_&ds._itemdata;

 rename

 %do i = 1 %to &last_ordinal_items;

  &&rename&i

 %end;

 ;

  label

 %do i = 1 %to &last_ordinal_items;

  &&label&i

 %end;

 ;

 format

 %do i = 1 %to &last_ordinal_items;

  &&format&i

 %end;

 ;



 ;

 run;

 %mend create;


 %create;


%mend imp_json; 


Dataset-JSONとかの話

医薬業界で,主に臨床試験データの標準形式のCDISCに絡んだ話. xptに代わる次世代のデータフォーマットとして提案されてる中にJSON形式のファイルもあって Dataset-JSONとかって提案されてます
https://www.cdisc.org/dataset-json
👆これのspecificationのところで 例示がされてます

例えばSASでどう作るかって話で,

見る感じ,定義情報をいろいろ持たせるので,そこはdefineから持ってくるなり,他の与え方をするなりがいるんですが,それ以前に SASでJSONファイルって作れるのって人が多いと思うので,そこだけ

data DM (label="Demographics");

attrib

STUDYID label="Study Identifier " length= $5000.

DOMAIN label="Domain Abbreviation " length= $200.

USUBJID label="Unique Subject Identifier " length= $200.

AGE label="Age " length= 8.

;

STUDYID="MyStudy";USUBJID="001";DOMAIN="DM";AGE=56;output;

STUDYID="MyStudy";USUBJID="002";DOMAIN="DM";AGE=26;output;

run;


data DM_1;

attrib ITEMGROUPDATASEQ label="Record identifier" length=8.;

 set DM;

 ITEMGROUPDATASEQ=_N_;

 run;

 proc sort data=DM_1;

  by STUDYID USUBJID;

run;

ods noresults;

ods output Position=Position;

ods output Sortedby=Sortedby;

proc contents data=DM_1 varnum ;

run;


data dataset_item;

length OID name label type displayFormat $200.;

set Position;

call missing(of displayFormat);

if Variable = "ITEMGROUPDATASEQ" then OID=Variable;

else OID = cats("IT.",Variable);

name=Variable;

if ^missing(displayFormat) then do;

displayFormat=format;

end;

if Type in ("数値") then type="integer";

else type="string";

keep OID name label type displayFormat;

run;


ここまでは適当な下準備なので,いいとして.
今回いいたいのは Proc JSONをつかって
writeステートメントで構造や値を直に作成でき
exportで任意のデータセットの内容を変換してJSONファイルの中に含めれるよって点.
以下は,とりあえず試してみただけで,精査してないのと items作る部分は,本来データセットの情報を取り出してつくるのではなく,定義情報から付与すべきのように思うのでそのまま使ったりしないでくださいね.あくまでproc JSONを紹介したいだけなので

proc json out = "XXXXX\dm.json" pretty;

 write open object ;


   write values "creationDateTime"  "2023-03-22T11:53:27";

   write values  "datasetJSONVersion"  "1.0.0";

   write values  "fileOID"  "www.sponsor.org.project123.final";

   write values  "asOfDateTime"  "2023-02-15T10:23:15";

   write values  "originator"  "Sponsor SASYAMA";

   write values  "sourceSystem"  "SAS 9.4";

   write values  "sourceSystemVersion"  "M7";



write values "clinicalData";

write open object;


  write values "studyOID"  "xxx";

  write values  "metaDataVersionOID"  "xxx";

  write values  "metaDataRef"  "https://metadata.location.org/api.link";


  write values "itemGroupData";

  write open object;


write values "IG.DM";

     write open object;

write values "records" 2 ;

write values "name" "DM" ;

write values "label" "Demographics" ;


write values "items" ;/* attribute array */

write open array;

     export dataset_item /   nosastags;

  write close;


write values "itemData" ;/* record array */

write open array;

      export DM_1 / nokeys  nosastags;

  write close;

write close;


  write close;

  write close;

 write close;

run ;