The Nameless City

何故か製薬やSAS関連のブログ、の予定。

<del>なんか聞きたければ、聞いて下さい。</del>用事無くても書き込んでええんやで。

トランスエンコーディングのページにPVが集まるので、なんか探られてるなーと思ってますが。


こちらで聞いて頂く分には、分かる範囲で特に明確な期限ないですが、回答しますので(質問・回答は公表しますので、不幸が起こらない形で問い合わせていただければ)、適当に掲示板使って下さい。このエントリのとか。
あと、何もなくても書いておいてもらうと。

データ加工序論(あんまわかってない人向け・治験でデータ加工やってる人向け)

データセット・変数・オブザベーションの概念を理解しよう。

他言語でなんとなく学習している人は、テーブルやデータフレームというもので置き換えて認識しよう。
f:id:houyhnhm:20210609173231p:plain

検査のデータを利用するのに、こういうテーブルを用いて管理・整理する。

  • 大きなひとかたまりの枠を一般的にはテーブルと呼称する。
  • 薄い緑色のところの下に続くのを一般的にはフィールドと呼称する。
  • 薄い青色のところは一般的にはあまり呼称されないが、こちらの下方向をレコードと呼称する。

表でいうところの表がテーブル、列がフィールド、行がレコードである。


ただし、表とは違い、列の意味と行の意味は異なる。
列の方法の指定は、原則としてフィールドの名前でアクセスする。
行の方向の指定は、原則として単に順序をもってアクセスするだけ、必要があれば行番号でアクセスする。
しかし、基本的にデータを取り出す際には、行の単位で取り出す。
f:id:houyhnhm:20210609182544p:plain


で、今までは、SAS特有の用語を使っていなかったが、以下のように用語を読み替えて貰えばいい。

テーブル データセット
フィールド 変数
レコード オブザベーション


ちなみに、レコード単位のデータを、通常のプログラム言語のオブジェクトとマッピングするのをORMという。ただ、SASの場合にはORMをイメージする事は少ないと思う。オブジェクトで考えると以下のような感じ。全て上と下は1:多の関係である。
f:id:houyhnhm:20210609183744p:plain

治験ではデータをなぜ加工しなければいけないのか。

治験で入力する単位で生成されるデータと、最終的なデータに求められるものの、ギャップを埋める為である。

RCTの場合、治験の入力時点では、どの薬剤を投与されたかのデータはなく、別にある割付テーブルを用いて被験者事に実薬かプラセボかが後で分かる事がある。
また、現場で採血したものの、ラボで溶血が認められた時にはそのデータは考慮が必要になる。


生データは、個人別であるし、実際に検査を行った日時等を記載するのだが、人によって治験が始められる日が異なる事もあり、また投与開始日からの相対日数を用いての分析を行う為、生データから比較とか統計とか出来る相対的なデータに加工する事が必要になる。

テーブルの正規化を考えよう

SDTMやADaMはあんまり正規は関係がないのだが、データ間の関係性を考える事は大事である。
例えば、臨床検査の検査項目に関する変数はSDTMではLBTEST/LBTESTCDの2つがある。もうひとつ、臨床検査項目を大きく区別するのにLBCATを利用する事も多いだろう。
その際に、臨床検査のTerminologyから引っ張ってくる訳だが、LBTESTが決まればLBTESTCDは自動的に決まる(逆もまた真)構造がある。簡単に言えば、冗長な変数がある。
LBTESTが決まれば、SIに変換した場合の単位も決まってくる。

という事で、LB関連のまとめテーブル(臨床検査基準値表)を予め作っておくと変換しやすくなる。

こはちょっと愚痴だが、こういう事を考えるのが設計なのだが、今SDTMとかADaMの設計ではなぜか個々でマッピングしたり変換の方法を考えたりするのが設計と思われがちである。
ドメインのリレーションシップを記述していない設計とか設計書としては問題があるのだが。。。。。。慣習によって省かれている事が多い。多いんだが、実のところその関係性、結構分かってない人多いんだよな。

プログラムはパターンの記述でしかない事を理解しよう。

ついつい検証方法をダブルプログラミングに頼ってしまっている現状がある為、個々人のバリエーションを維持しつつ品質を担保しようと考えがちなのだが、まず、この発想や思考パターンはかなり製薬独特な文化であり、本来はパターンも抑えた上で、結果が正しくなるかをテストしてプログラムの品質を担保する。
結果が正しい事が一番大事である。


正しい結果を産むプログラムの書き方が様々な人で書いた時でも一致する事は結構望ましい状態であったりもする。
また、ダブルプログラミングの結果が一致する事が、プログラムの完成につながらないという事も考えてほしい。


今、加工プログラムを一データセットにつき一本で書く事が標準的になってしまっているのだが、それは本来正しいあり方ではない事にも留意してほしい。
正しい動作を担保されたライブラリを再利用しつつ実装しないと、品質は個人の力量頼みになってしまう。
そういう意味では、今のSASプログラムの作りだと、単体テストすらマトモに実装するのが難しい、ってのはまああるんだが。。。。。。
テストデータ生成ツールくらいはあらまほしき事かな。

小数点第何桁というのをround丸め用数値とformatの桁数で考える場合

他人のマクロのバグ取りはつらい。

roundの丸め用の数値と、put等で利用するformatの桁数には違いがある。

というのは、結構面倒臭いのだが、

format
w.d
round
10**(-d)

という関係なのであるよと。ただし、d>=0の整数。

data _NULL_ ;
  a=123.4567891234 ;
  do d=-2 to 8 ;
    format="12."||strip(put(d,12.0)) ;
    b=strip(putn(a,format)) ;
    rnum=10**(-d) ;
    c=round(a,rnum) ;
    put "*** format/round ***" "(digit:" d ")" b "/" c ; 
  end ;
run ;
*** format/round ***(digit:-2 )123 /100
*** format/round ***(digit:-1 )123 /120
*** format/round ***(digit:0 )123 /123
*** format/round ***(digit:1 )123.5 /123.5
*** format/round ***(digit:2 )123.46 /123.46
*** format/round ***(digit:3 )123.457 /123.457
*** format/round ***(digit:4 )123.4568 /123.4568
*** format/round ***(digit:5 )123.45679 /123.45679
*** format/round ***(digit:6 )123.456789 /123.456789
*** format/round ***(digit:7 )123.4567891 /123.4567891
*** format/round ***(digit:8 )123.45678912 /123.45678912

なお、putnは、フォーマットとして設定するところを、変数の値とする事が可能な関数。SQLプロシージャとかでわりと活躍してたのだけど、最近はput関数がSQLプロシージャに対応してしまったのであんまり見かけないかも。

注意事項

ROUND関数

そもそもROUND関数に限界があるという事。

通常、ROUND(argument, rounding-unit)は、結果の有効桁数が9以下で、次のいずれかの条件が該当する場合、10進算術演算で期待される結果を生成します。

  • 丸め単位が整数である。
  • 丸め単位が1e-15以上の10のべき乗である。(丸め単位が1よりも小さい場合、ROUNDは、丸め単位の逆数が10のべき乗との違いが最下位から第3または第4ビッドまでであれば、丸め単位を10のべき乗として扱います)。

1-0進算術演算で期待される結果が小数第4位以下である。

なので、案外使える有効桁数は少ない。

SASでも整数については、問題なく計算される(2進数表示でもそこはちゃんと2進数で絶対に表現可能なので)為、正確を期すならば整数化して処理した後に~という方法も有り得る。
が、まあ人生時間を節約した方がいいとは思う。

データ加工のTipsを作ろうかと思いました。

データ加工の話なのですが、そもそもテーブル(Rとかだとデータベクトル)の意味からちゃんと理解しつつ、データ変換のTips集を作ろうかと思ってます。


新人さんを見ていて思ったのですが。
アルゴリズム思考がまあまだ怪しいのに、「治験やってたらわかるっしょ」みたいなデータ構造の説明・理解が不十分なところがあって、なおかつSASの独特の癖もある為、レベルが低いうちにはなかなか難しいところがあると思います。
また、CDISC SDTM/ADaMの理解となると、色々な取り決めが多数出てくるところもあって、いきなり初学者にぶっこむのは難しいだろうというところもあります。


私個人は、多分センスはない方ですが、昔は今と違い、定時内とか時間の限られた状況で作業していた事があまりなく、アホみたいに勉強していたのもありまして(いわゆる教育資料以外に、辞書を読んでいる)、どうにかして人を助けんとなあと思っています。
自分でもう考えるところのないプログラムをダラダラ組むのはやりたくない・・・・・・・

ローカルのフォルダ内define.xmlをGoogle Chrome等で見る方法

現在モダンブラウザでは、ローカルファイルをブラウザで開くのはセキュリティの観点から容認してません。
が、ブラウザをオプション「--allow-file-access-from-files」付きで起動する事により、define.xmlをブラウザで見る事が出来ます。

基本原則はシンプルな方がよい。

例えば「タスクはAからBを作る作業という事にしておくと、名称も楽に決めやすい」とか。
一見複雑に見える作業も、タスクに色を変につけるからややこしいのであって。


業務分析する際に、ワークフローを考える場合、「最小限のインプット」「作成物ごとのタスク」というのを意識するとよい。
例え人が関係していたとしても、実際のバイネームの人ではなく、役割を意識し、代替可能な形で記載するべきである。
CSVなどの検証作業であっても、それは別タスクとして考えた方がよく、作業の品質を高める為に「ルールブック」が必要である。


SOPが概略化している現状、規制当局要件を満たす為に、作り込まないSOPが出回ってしまっているが、実際業務をこなす上で必要なワークフローは明確に記述した方がよく、記載されていない業務を効率化する!とか言っても、書かれてないんだから指標を作る事が無理である。


って、システムの電子化の話でも散々言われているけども、正論が通ってたら会社は業績は上がるものなのよね。


逆に、無理矢理形式揃えても負荷が上がるだけなんだよなあ。
官公庁の行政改革とか、ヤバい匂いしかない。ただの便利ツール導入にしかなってない。

SASのドキュメントの調べ方(英語なのは諦めて)

support.sas.com
support.sas.comに行けば大抵はあるよ、という話で終了

そんだけだと少しさみしいので足すと。

support.sas.comのあるきかた

製品のマニュアルは「documentation」
SASのHELPは一応全てのパラメータを説明はしてくれています。exampleもあります。ただ、一部、「中でどういう製品が組み合わさってるのか知ってないとたどりつけない」かもですが。なお、このHELPの内容は最新版に更新されています。そして、製品のヘルプにも同じ内容が含まれています。なお、日本語翻訳は間に合ってないという事なのですが、製品のヘルプの方が積極的に翻訳されていて、また、SAS Foundation+それへの組み込みの製品よりも、各ソリューション製品の方が翻訳が進んでいるという印象です。余談ですが、SAS社のヘルプ翻訳は、文章単位で翻訳文が一致するので、日英辞書ネタにするには結構便利だったりします。
技術的情報(高度な~)は「technical paper」
プログラム込みでテクニック解説してくれてるPDFが結構沢山あります。ピッタリの解決方法も出てたりするのですが、粒度が色々なのでいきなりチェックするのは難しいかもです。
カテゴリ単位での技術情報は「forcus area」
技術的関心事がある場合には、ある程度網羅的に拾えるので便利です。最近見たら「tip sheet」が出てました。他だとチートシートとか言われるやつですね。ただ、昔結構RTF周りのドキュメントへのリンクとかもあった記憶があるんだけど中身変わってそうだなあ・・・・・
SAS Note
とにかくノウハウ含めてぶっこまれてるのでサルベージに使います。Problem Noteは、「バグってのが確定した話」しか載らないのですが、他Exampleも含めて結構なボリュームがあります。ただ、正直古いものもぜーんぶあり検索も時間かかるので使い勝手はよくないんですよねえ・・・・

有効桁数で丸めた上で文字列に変換するマクロや自作関数とか

マクロ

自作マクロ故に担保はしない。
使う前に適当にテストしてほしい。
なお、指摘受け付ける。
著作権については、好きにしていいよ。

使い方

%mround_digit :
[出力先の文字変数]=%mround_digit([元データになる数値変数], [有効桁数]) ;

[有効桁数]は1以上の整数。

マクロ中身

%macro mround_digit(var, digit) ;
ifc(
        &var.=0
        ,ifc(&digit=1,"0","0." || strip(repeat("0",&digit.-2))),
        strip(putn(
            round(
                 &var. 
                ,10 ** 
                    ifn(
                        int(log10(abs( &var.)))>=0
                        ,int(log10(abs( &var.)))-&digit.+1
                        ,int(log10(abs( &var.)))-&digit.
                    )
            )
            ,'12.'
                || strip(putn(
                    ifn(
                        ifn(
                            int(log10(abs( &var.)))>=0
                            ,int(log10(abs( &var.)))-&digit.+1
                            ,int(log10(abs( &var.)))-&digit.
                        ) >0
                        ,0
                        ,- ifn(
                            int(log10(abs( &var.)))>=0
                            ,int(log10(abs( &var.)))-&digit.+1
                            ,int(log10(abs( &var.)))-&digit.
                        )
                        )
                    ,'12.0'
                ))
        ))
    ) 
%mend mround_digit ;

data TEST ;
    input a best12. ;
cards ;
1.10122
112.222
3332001
-1.10122
-112.222
-3332001
0.002455
0
1
10
1515151
115.151
;
run ;

data RESULT ;
    set TEST ;
    attrib b c d e f length=$200. ;
    b=%mround_digit(a,1) ;
    c=%mround_digit(a,2) ;
    d=%mround_digit(a,3) ;
    e=%mround_digit(a,4) ;
    f=%mround_digit(a,8) ;
run ;

proc print data=RESULT ;
    format a best12. ;
quit ;

結果

                                    SAS システム                 2020年 9月29日 火曜日 16時05分24秒   5

Obs               a    b           c           d           e                f

  1         1.10122    1           1.1         1.10        1.101       1.1012200
  2         112.222    100         110         112         112.2       112.22200
  3         3332001    3000000     3300000     3330000     3332000     3332001.0
  4        -1.10122    -1          -1.1        -1.10       -1.101      -1.1012200
  5        -112.222    -100        -110        -112        -112.2      -112.22200
  6        -3332001    -3000000    -3300000    -3330000    -3332000    -3332001.0
  7        0.002455    0.002       0.0025      0.00246     0.002455    0.0024550000
  8               0    0           0.0         0.00        0.000       0.0000000
  9               1    1           1.0         1.00        1.000       1.0000000
 10              10    10          10          10.0        10.00       10.000000
 11         1515151    2000000     1500000     1520000     1515000     1515151.0
 12         115.151    100         120         115         115.2       115.15100

余談

マクロ化しなくてもいいのだが、いわゆるワンライナー
マクロもかなりマニアックで、通常の関数のように書ける形にした為に、セミコロンを中で使ってなかったりするし、変数に格納した方が分かりやすいところもあえてコピペだし、関数もifc/ifn/putn/repeatはあんまり使われていないとは思われる。難しい関数ではないのだけど。
ワンライナーがゆえに、0とかに対応するところでは、ログに「関数の引数が無効」とか「欠損値を含んだ計算により~」とか沢山出て来る。そこは諦めてほしい。
普通のステートメントで分岐させると出さなくて済むようにはなるんだが、ワンライナーの魅力はあるからなあ。

FCMPで関数自作

普通のプログラム言語のように関数が作れるのだが、便利と言えば便利だが、デバッグライトが分からんのでどう作るかが悩みの一つ。
もうひとつは、あまりにもあっさり自作出来るのだが、標準関数とパッと見分けつかないので困るなというところか。
なお、関数を使うのに、システムオプションでCMPLIBを設定する必要がある。

作り方

proc fcmp outlib=work.funcs.math ;
    function round_digit(var, digit) $ varchar(32767) ;
        attrib str length=varchar(32767) ;
        str=" " ;
        if var=0 then do ;
            if digit=1 then do ;
                str="0" ;
            end ;
            else do ;
                str="0." || strip(repeat("0",digit-2)) ;
            end ;
        end ;
        else do ;
            attrib mult rd rd2 var2 length=8 ;
            attrib fmt length=varchar(32767) ;
            mult=int(log10(abs( var))) ;
            if mult >= 0 then do ;
                rd = mult - digit + 1 ;
            end ;
            else do ;
                rd = mult - digit ;
            end ;
            if rd > 0 then rd2 = 0 ;
            else rd2 = - rd ;
            var2 = round(var,10**rd) ;
            fmt = '12.' || strip(put(rd2,12.0)) ;
            str = strip(putn(var2,fmt)) ;
        end ;

        return(str);
    endsub;
quit ;

options cmplib=work.funcs;

data TEST ;
    input a best12. ;
cards ;
1.10122
112.222
3332001
-1.10122
-112.222
-3332001
0.002455
0
1
10
1515151
115.151
;
run ;

data RESULT ;
    set TEST ;
    attrib b c d e f length=$200. ;
    b=round_digit(a,1) ;
    c=round_digit(a,2) ;
    d=round_digit(a,3) ;
    e=round_digit(a,4) ;
    f=round_digit(a,8) ;
run ;

proc print data=RESULT ;
    format a best12. ;
quit ;

結果

                                    SAS システム                 2020年 9月29日 火曜日 19時14分00秒  25

Obs               a    b           c           d           e                f

  1         1.10122    1           1.1         1.10        1.101       1.1012200
  2         112.222    100         110         112         112.2       112.22200
  3         3332001    3000000     3300000     3330000     3332000     3332001.0
  4        -1.10122    -1          -1.1        -1.10       -1.101      -1.1012200
  5        -112.222    -100        -110        -112        -112.2      -112.22200
  6        -3332001    -3000000    -3300000    -3330000    -3332000    -3332001.0
  7        0.002455    0.002       0.0025      0.00246     0.002455    0.0024550000
  8               0    0           0.0         0.00        0.000       0.0000000
  9               1    1           1.0         1.00        1.000       1.0000000
 10              10    10          10          10.0        10.00       10.000000
 11         1515151    2000000     1500000     1520000     1515000     1515151.0
 12         115.151    100         120         115         115.2       115.15100

悩ましいなあ

先に書いたが、FCMP関数で作ってしまうと、普通の関数みたいに見えすぎるのがアレ。
そして、FCMPプロシージャの使い方をまだ探り探りやってる(ヘルプにもあんまり載ってない)ところもあって、自信がない。
文字変数の定義これでいいのかも分からん(パッと見文法見つけられてない)。
マクロの方が何やってるかはまだ分かりやすいかもなあ。

ただ、この手の文法は、今後のSASを考えると増えていくとは思う。ただ、マルチスレッドプログラミングとかやる機会は治験ではなさそうだし、世間的にもそういうのを意識してコーディングしていくというのも需要ないだろうし。うーん。

追記

log10を使わずにE表記使っての対応が可能なのに気づいたが、今更なのでいいや。やってることはlog10と変わらないし。

SASのライセンスとは別に、モジュールにライフサイクル終了があったりするよという話。

タイトル通り。
この期限が来ると、モジュールが動かなくなります。
support.sas.com


よくSASのバージョンをどう管理しどう更新していくのかという話がありますが、Enterprise Guideとかを使いゆるくやってる場合には、おとなしくアップデートに流されていくのが吉です。
多分バージョンアップの仕方も含めて、Computer System Validationで考えておけば十分じゃないかと。カテゴリ3ですよねGAMPの。
ただ、正直ここ、Windowsだとメンテナンスバージョン違いでの維持が一つの筐体で行う事が出来ないので、Linuxに出来るといいよね。Dockerとかもそろそろ。この辺りのギャップを多少は埋めやすくなるはずー。

最近のExcelだと、インストールのされ方が変わっているので、ちゃんとドライバ入っているか確認しなおした方がいいよーという話。

最近のOffice製品は、インストールの仕方が変わっていて、C2R形式になっている。
この場合、Excel周りのドライバがインストールされなかったりするので注意が必要だ。

ACEドライバ入ってないんじゃないかね?

Access ODBC ドライバーまたは OLEDB プロバイダーを Office クイック実行の外部で使用することはできません | Microsoft Docs

ちょっと前にMSDNブログでも出てたと思うんだが、C2R形式だと、他のアプリとの関係性をあんまり壊さずにインストール出来る反面、今までのようにセットで入っていたドライバが別途入れなければいけない。特に他のアプリで利用する場合に影響がある。

Spotfireとか。SASとか。

え、グローバルIP持ってんの?

あまり気にしていなかったけど、IPアドレスグローバルIP振られてるわ色々。
https://ja.wikipedia.org/wiki/IPアドレス#プライベートIPアドレス

クラス 範囲 サブネットマスク アドレス数
クラスA 10.0.0.0 - 10.255.255.255 255.0.0.0 16,777,216 (16,777,216 × 1 subnet)
クラスB × 16 172.16.0.0 - 172.31.255.255 255.240.0.0 1,048,576 (65,536 × 16 subnet)
クラスC × 256 192.168.0.0 - 192.168.255.255 255.255.0.0 65,536 (256 × 256 subnet)


ここの範囲にない場合には、グローバルIPだと(基本的には)。もちろん、社外からアクセス出来るかというと、LANの入り口でブロックはされてんだけどさ。
昔の会社はクラスAのプライベートIPアドレス使われてて、当然ながらグローバルIPを振るのは別途という感じだった。SSL-VPNも、192.168.0.xが振られるタイプで、それに合わせて家のサブネットマスク変更した記憶がある。
うーん、いやー、マジでかー。

Pinnacle 21 Community 3.0.2は認証つきProxyを通らないらしい。

www.pinnacle21.com

Proxy Aware - configuration
In trying to eliminate the internet connection error report we've been working with our network teams. It has been determined that the application is not proxy aware (ie the traffic cannot be pushed to the proxy server to gain access to the required aws hosted services). The traffic is treated as a normal traffic and the site is blocked based on the site. Unfortunately for larger organizations there is not a manageable solution to allow this type of traffic on normal internet gateways and this must be managed by connecting via a proxy server. Can you provide instructions or an eta for an application update to allow P21 Community become proxy aware.

アプリケーションがProxy対応してないってさ。


Electron使っているから、VS CODEみたいな事は出来るはずとは思うけど、案外社内からの認証つきProxyに対応していない事はある。
Atom EditorはProxy SettingはあらかじめユーザIDとパスワードを設定させる方式だった。流石に同じElectronでもMS Teamsとかはプロキシには対応がっちりしているけどね。


あまりピンと来ない人に経緯含め説明。
現在、大抵の会社では、HTTP通信にプロキシサーバを介する想定だ。また、社内のDNSサーバは外部のDNSサーバを見ておらず(無論逆も)、外部のサーバにはそのプロキシを無視して外部の通信は出来ないようになっている。このプロキシの利用は、認証が必要である。


今、プロキシ等のネットワーク設定に関しては、どのブラウザでもWindowsの設定となるネットワーク関係のものを使って通信している。どの、というと言い過ぎか。Firefoxはたしか個別に設定する事が出来る。
ただ、本来は、アプリケーション毎に設定するようなものだったんだよねプロキシ設定って。その設定を見て、ブラウザがリクエストをプロキシに投げてプロキシが外部サーバと通信して返すという流れ。そんな設定を個々にするのが面倒およびトラブルの元でもあるので、OSの設定に近付けられているというのが本当のところ。
なお、通信とされるもののなんでもがプロキシを通るという訳ではない。アプリケーションがそれを見ない場合には、DNSサーバにどこのIPかを問い合わせてIPを取得して、そのIPに対して通信を行うんだが、DNSサーバが「そんな名前知らない」で返すとかが普通。


で。
アプリのアップデーターと呼ばれるものは(アプリ本体とは別のものになる)、アップデートがあったかどうかを外部と通信して、あれば通知ダイアログを出して、OKが押されればアプリを止めて、対象のアプリの最新版を一旦ダウンロードして、元ファイル削除&ダウンロードファイルの移動をして、アレだったらアプリを起動する。
このアップデーターの通信は、最近はほぼhttps経由だ。なんだけど、Proxy設定を見に行かないアプリもあるんだわなこれが。


対応方法は、リバースプロキシ設定するとかがあるんだが、そこまですると大変なのと、じゃあ誰の認証使うのさという話が発生するので、どうしたもんかねえとは。

今のうちにやっておきたい事

SpotfireのR使うやり方を一通りやっておきたいなあ。

Spotfireのテーブル→R→Spotfireのテーブルみたいな事は出来るとは思うので、Rの帳票がそのまんま使えなくても描画はどうにかなると思うし(特殊な作図を要するもの以外は)、早いことやっときたいなあと。
信頼曲線とカプランマイヤーが引ければ結構いける気がする。


あと、Rのbiostat関連をSpotfireに突っ込めたら、わりと色々使える気がする。

SASデータセット加工用ETLツールの基礎構築とか。

色々みんなどうテンプレ化するか考えているのだけど、SDTMはそろそろ変数のメタ定義もはっきりしてきたのでこれはしときたい。
んだけど、次のやつとどっちが先に考えておいた方がいいかちょっと考える。

SDTMの実体のモデル構築

どうにもSDTMのデータの持ち方が非効率な気がしている。
連長圧縮だけでもだいぶ圧縮されるデータで、STUDYIDが一体どれだけ無駄に容量食ってるか考えるとなあ。

  • 使い回されるデータが多い
  • Pinnacleのチェックでも無駄にかかってる

なんか考えるとちょっとなあ・・・・・・Study Data Tabulation Modelなのだから、実際のEntityとは違うので、どうにかならんかなと思っている。
I/Oの問題もあるが、SASだとViewがイマイチ。SDTMのファイル転送のタイミングでも発生するんだが、結局、フォルダ→ライブラリの定義が相対的には出来ないので持ち運びに苦労しちゃうんだよねえ。

社内の自己評価の度に思う事。

職務経歴書を書くのは楽しいが、社内評価の度にコミュニケーションとか問われるのが、性格に全くあってないので面倒だなあ。


そんなアッパー系の人種じゃないしなあ。