Nオブザベーション先の値を取得する話②条件付き先読み

例えば

data temp;

ID=1;time=input("10MAR20:07:51:00",datetime.);val=9;output;

ID=1;time=input("10MAR20:07:52:00",datetime.);val=8;output;

ID=1;time=input("10MAR20:07:53:00",datetime.);val=10;output;

ID=1;time=input("10MAR20:07:54:00",datetime.);val=11;output;

ID=1;time=input("10MAR20:07:55:00",datetime.);val=13;output;

ID=1;time=input("10MAR20:07:56:00",datetime.);val=9;output;

ID=1;time=input("10MAR20:07:57:00",datetime.);val=9;output;

ID=1;time=input("10MAR20:07:58:00",datetime.);val=8;output;

ID=1;time=input("10MAR20:07:59:00",datetime.);val=7;output;

ID=1;time=input("10MAR20:08:00:00",datetime.);val=6;output;

ID=1;time=input("10MAR20:08:01:00",datetime.);val=5;output;

ID=1;time=input("10MAR20:08:02:00",datetime.);val=4;output;

ID=1;time=input("10MAR20:08:03:00",datetime.);val=10;output;

ID=1;time=input("10MAR20:08:04:00",datetime.);val=11;output;

ID=2;time=input("10MAR20:07:51:00",datetime.);val=8;output;

ID=2;time=input("10MAR20:07:52:00",datetime.);val=9;output;

ID=2;time=input("10MAR20:07:53:00",datetime.);val=8;output;

ID=2;time=input("10MAR20:07:54:00",datetime.);val=9;output;

ID=2;time=input("10MAR20:07:55:00",datetime.);val=9;output;

ID=2;time=input("10MAR20:07:56:00",datetime.);val=8;output;

ID=2;time=input("10MAR20:07:57:00",datetime.);val=12;output;

ID=2;time=input("10MAR20:07:58:00",datetime.);val=12;output;

ID=2;time=input("10MAR20:07:59:00",datetime.);val=14;output;

ID=2;time=input("10MAR20:08:00:00",datetime.);val=8;output;

ID=2;time=input("10MAR20:08:01:00",datetime.);val=15;output;

ID=2;time=input("10MAR20:08:02:00",datetime.);val=13;output;

ID=2;time=input("10MAR20:08:03:00",datetime.);val=10;output;

ID=2;time=input("10MAR20:08:04:00",datetime.);val=10;output;

format time datetime.;

run;




















こんな感じに,1分刻みに値が記録されたデータがあったとします
で例えば値が10未満のものにフラグをたてるとかなら

if val < 10 then FL="Y";

でOKです

ところが難しいのが,
10未満の値が観測されてから後5分以内に10以上の値が観測されなかった場合のみ,その時点にYをたてて.といわれたらどうしましょう?

簡単なのはデータのソート順をひっくり返して後ろからみるとかなのですが
今回,仮の前提としてデータが巨大で,安易にひっくり返しソートがうてないという状況としてみましょう

そうなるとSASの1obsよんで1obs出力する方法だと先読みしにくいのですね
完全に1分刻みが確定してるなら前回の方法で5obs先までみればいいのですが
色々な要因で測定メッシュが確定しない場合もあるかもしれません(というかよくあります…)

そうなるとちゃんと時間と条件を加味して先読みしたいと.
そういう時にハッシュオブジェクトが活きてくるんですね

必要最低限な変数に絞って自己参照していけばいいので

data wk1;
set temp;
if _N_=1 then do;
call missing(of _time _val);
    declare hash h1(dataset:"temp(rename=(time=_time val=_val))",multidata:"yes",hashexp:16);
        h1.definekey("ID");
        h1.definedata("_time","_val");
        h1.definedone();
    end;
if val < 10 then FL="Y";
 do while ( h1.do_over()=0 );
      if 0<_time-time<=300 then do;
            if _val>=10 then call missing(FL);
      end;
 end;
drop _val _time;
run;

じゃっかん無駄のある処理(自分より前のデータからもいちいちスタートしてる)ですが
とりあえず単純化した例を示したかったのです

















multidataでIDでkey重複した状態でハッシュオブジェクトを定義しておいて
do_overメソッドで同IDのデータを総なめして,5分以内にアンチ条件に合致するレコードがあればフラグをおると.
そうすると結果的に5分間条件持続の確認されたものにフラグがたつと(正確にはレコード終わりの終了5分前のところからは5分間確認できてなくてもフラグがたつ)

なんか臨床の分野でもePROやデバイスが増えたり,time to eventのパラメータ条件も昔よりちょっと複雑になった気がしてて,最近この手の処理を書く機会が増えたなーって印象です

0 件のコメント:

コメントを投稿