変数型について調べてみる

SDS-XMLのTyped Data実装と、Define.XML内の変数型宣言と、ODMの仕様に関するメモ。
Define.XMLの変数型宣言
Define.XMLでは変数型が宣言される。具体的にはVariable Levelの変数型とValue Level Metadataである。Value Level Metadataは、特定の条件下で適用される変数定義。これは無視しておこう。以下、Variable Level変数に注目して話を進める。
Define.XMLでは、様々な変数型を用意している(下表)。XPTファイルでは、文字型と数値型しかサポートされていないのと比べると、非常にリッチである。というか、XPTがショボすぎる。
(Define.XML 2.0.0より引用)

20140228a.jpg

20140228b.jpg

ここで最後のNoteに注目しておこう。『日付・時刻の型は収集データの予定された変数型を表す。実データ値の解釈ではない』とある。これは、CRF上の入力欄に合わせなさい…と理解するとよいだろう。

すなわち、
有害事象発現日 _ _ _ _ – _ _ – _ _
となっていれば、それは日付型である。

現疾患診断日 _ _ _ _ – _ _
となっていれば、それは部分日付型である。

もちろん、実際に収集されたデータの一部が欠ける場合がある。これは誰しもが知っているし、十分に予想できる。ある有害事象の発現日は2013年12月??日(深夜未明のため日付が特定できなかった)…ということがあるかもしれない。しかし、それでも有害事象発現日の変数型は「日付型」であって、「部分日付型」ではない。なぜならば、計画された変数型は年月日の全てを含んでいるからである。計画された変数型はCRF上に実装されている。それは、想定される実データの変数型ではない。もちろん、得られた実データの変数型でもない。


SDS-XML(Typed)の変数宣言
最近、ドラフトのスペックが公開されたSDS-XMLには変数型を含めた実装がある。例えば、こんな具合だ。

20140228c.jpg

ItemData[データ型名]というエレメントを用いて、データの型を指定する。データ型名はODMで定義されたものであれば何でもいい。ちなみにDefine.XMLで定義されているデータ型より、数がずっと多い。

ここで、実データと矛盾するエレメントを宣言すると、エラーになる。例えば、こんな記述はエラーになる。実データは日付型ではなく、部分日付型だからだ(※)。この機能は面白い。実データの型チェックができる。できれば、桁数などもチェックできるとよいのだが、その機能は実装されていない。

<ItemDataDate ItemOID="IT.AE.AESTDTC">2003-05</ItemDataDate>

また、Define.XMLの宣言と実データのデータ型が矛盾していてもエラーになる。といっても、このチェックにはある程度の緩さが存在しているはずだ。Define.XMLでテキストと宣言した変数に数値データ(IntegerやFloat)が格納されても合法だろうし、日付型と宣言した変数に部分日付型が格納されても問題ないだろう。しかし、Integerと宣言した変数にString型データが存在するとエラーになるはずだ(※)。

※実際に試してみたいのだが、SDS-XMLのドラフトパッケージにはスキーマファイルが含まれてない。当サークルはテストできていない。情報をお持ちの方がいれば、この記事にコメントしていただけると幸いです。


ODM定義
SDS-XMLもDefine.XMLもODMをベースにしている。つまり、ODMで定義されている変数型をカバーしている。そこで、ODM 1.3.2の変数定義を覗いてみよう。幸いなことに、ODMで定義されたフォーマット名がXML Schemaデータ型のどれに該当するのか明記されている。

例えば、float型と宣言された変数はxs:decimal型に相当する。つまり10進数である(浮動小数ではない。xs:floatであれば、単精度32ビット浮動小数になる)。このため、次の例は問題なく処理される。おそらく上で推測したロジックがサポートされているだろう。

Define.XML→float型
SDS-XML →Integer型 (Define.XMLのfloatに基づき10進数として変換できる)

ODMのFormat Name(XML Schema Datatype)
 integer (xs:integer)
 positiveInteger (xs:positiveInteger)
 nonNegativeInteger  (xs:nonNegativeInteger)
 float (xs:decimal)
 date (xs:date)
 time (xs:time)
 datetime (xs:dateTime)
 text (xs:string)
 oid (xs:string)
 oidref (xs:string)
 ID (xs:ID)
 IDREF (xs:IDREF)
 subjectKey (xs:string)
 repeatKey (xs:string)
 name (xs:string)
 sasName (xs:string)
 sasFormat (xs:string)
 fileName (xs:anyURI)
 languageTag (xs:language)
 string (xs:string)
 boolean (xs:boolean)
 double (xs:string)
 hexBinary (xs:hexBinary)
 base64Binary (xs:base64Binary)
 hexFloat (xs:hexBinary)
 base64Float (xs:base64Binary)
 partialDate (xs:date)
 partialTime (xs:time)
 partialDatetime (xs:dateTime)
 intervalDatetime (xs:string)
 durationDatetime (xs:duration)
 incompleteDatetime (xs:string)
 incompleteDate (xs:string)
 incompleteTime (xs:string)
 URI (xs:anyURI)
2014-03-03(Mon)
 

コメントの投稿

非公開コメント

型チェックの導入は(より不正データが混入する可能性が高いCDASHデータでやるべきものじゃないか、とはちょっと思うものの) よい方向性だと思うのですが、1.676E+2みたいな指数表記が、ItemDataIntegerはxs:integerなので-?digit+だからエラーになるという詰めが甘いところがありますよね。。。
あと、ItemData[Type]のTypeと、ItemDefのDataType属性を、それぞれのItemOIDとOIDを照合してきちんと整合性チェックする、という実装はけっこう重いんじゃないかと心配してしまいます。もうちょっときれいな解決法がないかなぁ。。
XPTからの変換ツールはあるけれど、それが吐くSDS-XMLはODM的に不正だし、実際に動くバリデータはまだないし、という状況はけっこう先行き不透明ですね。
2014-03-06 23:32 | mokjpn | URL   [ 編集 ]

宣言された変数型と入手したデータの型の一致性確認……という意味では非常に甘い仕様ですね(笑)

SDS-XMLはFDAへの申請フォーマットと位置づけられています。暗黙的にOpenCDISC等でデータセットを事前にバリデートしておくのが前提だと、当サークルは推察しています。型チェックは本質的に不要なのだけれど、とりあえず搭載してみた…よーに思えます。

ODMとして不正なのはシャレになりませんが、US中心で作成すればその程度の品質が出来上がるのは必至だと思います。RDF/OWLに人気が集まっているので、早くにODMをねじ込もうとした弊害でしょうか…
2014-03-09 08:17 | TKD+SMZ | URL   [ 編集 ]

プロフィール

TKD + SMZ

Author:TKD + SMZ
ガレージキット組み立て中級者
子育て初心者

2007年に友人の薦めでガレージキット組み立てを開始。その面白さに目覚める(w

2011年にお付き合いのあった原型師さんに薦められて、原型製作を開始。ワンフェスに参加しています。2017年から、活動を一時休止しております

ブログの大まかな内容についてはカテゴリーの「総合案内」をご覧下さい

カウンタ
ブログ内検索
月別アーカイブ