ZIP読み込みの際のZIP内ファイル名

論文読んで実行していただいた方からのご指摘で,ダイレクトにzipを読み込む際に
各レコードがzip内からのどのレコードから来たかの識別で,filenameオプションで取得できるとか書いてしまったのですが,それはzip名を取得する方法でした…
Direct Zip Readingのオプションの説明が正しくないです
それもよく使うのでごっちゃになってしまってました… 恥ずかしい

うぅ… 本当すみません.せめてスライドだけでも差し替えができないかは問い合わせてみますしかし,こういったご指摘は大変ありがたいです

とりあえず正しい方法だけ 

a.csvとb.csvがあって





それをzというzipファイルに格納した場合

FILENAME indata ZIP "xxxx\z.zip" member="*";

data sample;

length fname zipname memname csvname $200.;

memname = ' ';

INFILE indata dlm="," filename=fname memvar=memname end=done ;

do while(^done);

 input a b;

 zipname=fname;

 csvname=memname;

 output;

end;

run;



ちょっとmemvarオプションがわかりにくいのですが,ブランクにするとzip内の全部の
ファイルが読み込み対象となり,読み込み開始時点でファイルの名前が入ります
zip内の全ファイルの走査が終わるまでinputを繰り返すという作業のためendとの併用で
ループになります


あぁ…,後輩には散々,見返せとか検証しろとか言っておいて,自分の論文でこれとは酷い

2変量データに対しての3D Raincloud plot(未完成版)

絶対SASでやらない方がいい気がする
3Dグラフの機能については,もうサポートする気がないって宣言してるレベルで無理.
たぶん,ヒートマップとかもそうですけど,2次元に上手く落とし込めるでしょ?みたいな主張なのかなぁ
SG系での3次元プロットの機能が旧GPLOT系より悪くなってるんだからどうしようもない

ただ,無理ゲーには挑みたくなるのが,魔界塔士の時代からの人のサガなので…

SAS社のサイトに載ってた適当なテストデータから

data wk1;

 seed = 15678;

 do i = 1 to 1000;

  z1 = rannor(seed);

  z2 = rannor(seed);

  z3 = rannor(seed);

  x = 3*z1 + z2;

  y = 3*z1 + z3;

  output;

 end;

 drop seed;

run;

2変量に対しての確率密度もKDEで問題なく計算できます
あとの流れは通常のRain cloudと一緒なんですけど
proc G3Dが一種類のプロットしか描けずに,組み合わせができないので 雲の部分をSURFACE(面プロット)で
描くのを諦めて,雨と同じ散布図の集合で表現するしかない… そうすると空を雨が覆ってしまうので
truncateの有無にかかわらず,確率密度関数が極小のところは消してしまうとスッキリ(いいのか?しらん)

proc kde data=wk1 ; 

   bivar x y/ out=kde; 

run;

data wk2;

set wk1(in=wk) kde(in=kde);

if wk then do;

density2=0.1+ranuni(777)*0.01;

end;

if kde then do;
          x=value1;

         y=value2;

     if density>10**-5 then density2=density+0.13;

else delete;

end;

keep x y density2;

run;

proc g3d data=wk2;

 scatter x*y=density2 /shape="balloon" size=0.5 noneedle;

run;



















Z軸に意味ないから軸けしたいけどGPLOTのAXISステートメントがZ軸に効かんという謎制約….NOAXISは3軸とも消すか消さないかを選択できるという,野性的すぎる大胆な仕様…
あとは,これだと,1変量の時の箱髭にあたる,位置の指標がないので
2変量用箱ひげ図的な用途で箱と同じくTukeyさまが編み出したBAGPLOTとかを配置してみたいけど,マイナー過ぎてSASに実装されてない(JMPにはあるのに…)
手で実装するにはしんどいし,実装できたとして,このG3Dに組み込む術は多分ANNOTATEしかない…

ビニング①

デジタルバイオマーカーの話するときに,入れそびれたネタを少し.
ビニング(binning)という処理があります
例えば,1~100までのデータがある時,1-10,11-20,21-30...のようにカテゴライズして数えあげてヒストグラム書いたりしますね
これは連続量を離散化してるわけですが,ヒストグラムは元のデータの特徴をつかむ時に使われるように,データの持つ特徴を損なわないまま階層化して,見通しをよくしているともいえます.1-10のような区間・階層を「ビン」といいます
また1000個のデータを10個のビンにはめると,データ量は一気に圧縮されます
また,良くも悪くも,外れ値や区間内のバラつきをビンは飲み込んでくれます

こういった性質から機械学習の前処理などでも用いられる手法です

さてSASの話

data test;

   length id 8;

   call streaminit("1234");

   do id=1 to 500;

      val=rand("normal",10,5);

      output;

   end;

   do id=501 to 1000;

      val=rand("normal",25,4);

      output;

   end;

run;



こういったデータあったとします.
分布としては以下の感じ















SASにおけるビニングは porc HPBINで実施します

ods output mapping=bin;
proc hpbin data=test numbin=10  bucket   ;
   input val;
 run;

numbinでビンの数を指定します. 

バケットビニング(デフォルト)

デフォルトなのでbucketはつけなくても同じ


















<0.4096..のビンには11データ
0.4096~4.517…のビンには56データというように ビニングがおきます
ビニングの結果はデータセット化もできます

バケットビニングとは
最大値ー最小値をビン数でわって出した値を,最小値から足して区切っていく方法です
ビン化イメージとしては














こんな感じ,ビン幅は等間隔ですね

次はQUANTILEビニング,ビン数の分だけ分位点つくるタイプです

proc hpbin data=test numbin=10 quantile   ;
   input val;
 run;



















分位点なので,境界値ぴったりとかはおいておいて,基本度数と比率はビン間で等しくなりますが,代わりにビン幅が不均等になり
データが疎のところは広く,密のところはせまくなります














あとはウィンザライズドビニング

proc hpbin data=test output=out numbin=10  winsor winsorrate=0.05   ;
   input val;
 run;

これはウィンザライズド平均を使う方法で,ウィンザライズド平均というのはトリム平均っぽいやつで,トリムが両端をカットするのに対して,ウィンザライズド平均は,端に当たらない値で,極致をLOCF上書きしちゃうイメージ
0 ,51, 52, 53 ,100というデータなら 51,51,52,53,53にして平均とる感じ
winsoerateで両端をどこまでとるか(なん%分までか)を定義

































あとはPSEUDO-QUANTILEってのも利用できますが,QUANTILEの結果に似ます
今回は割愛.

さて,次は,ビン化の性能評価とかを考えていきましょう だいぶ先になるかもだけど