2018年12月26日 星期三

HL7 FHIR 資料型態篇 - Complex Types - 數值類

有了之前的經驗,後面講解就容易多了。
==========
首先我們要知道,Primitive Type中跟數值有關的主要是interger與decimal。我們要思考的是,那數值的東西還有哪些變化呢?其實,可以從數學與物理的角度來思考。這篇就來討論這個問題。(這一塊,R3跟R4有明顯差異)

Money

在R4這個被獨立拉出來了。
NameFlagsCard.TypeDescription & Constraints
.. MoneyΣNElementAn amount of economic utility in some recognized currency Elements defined in Ancestors: idextension
... valueΣ0..1decimalNumerical value (with implicit precision)
... currencyΣ0..1codeISO 4217 Currency Code
CurrencyCode (Required)
還好,沒什麼特殊性。多少錢就放在value,Type是decimal,沒什麼意外。因為是貨幣,當然要帶幣別,說他的Type是code,也很正確。既然是code,那接著要問要去參考哪個Value-Set,這兒是CurrencyCode。(再跑一次,加深印象)
資料集的定義有了,那內容值呢?就是去看Expansion那節。
還好,都是來自urn:iso:std:iso:4217這個編碼系統。放心TWD,也有在裡面。
接著要來看Money的原生家庭。

Quantity

NameFlagsCard.TypeDescription & Constraints
.. QuantityΣINElementA measured or measurable amount
+ Rule: If a code for the unit is present, the system SHALL also be present
Elements defined in Ancestors: idextension
... valueΣ0..1decimalNumerical value (with implicit precision)
... comparator?!Σ0..1code< | <= | >= | > - how to understand the value
QuantityComparator (Required)
... unitΣ0..1stringUnit representation
... systemΣI0..1uriSystem that defines coded unit form
... codeΣ0..1codeCoded form of the unit
就Type而言,沒什麼驚奇的地方。到時有些欄位的用意得說明一下。首先我們看到一條規則。當unit Element有出現時,那system Element也必須同時出現。(搶先報:unit是人看的,systme與code是給電腦看的)

  • Quantity.value:decimal [0..1]

這跟Money的概念是一樣,實際放數值的地方。

  • Quantity.comparator:code [0..1]

你可以想像這個是value的prefix。根據QuantityComparator這個Value-Set所規定,只有四種內容值可以使用。

CodeDisplayDefinition
<Less thanThe actual value is less than the given value.
<=Less or Equal toThe actual value is less than or equal to the given value.
>=Greater or Equal toThe actual value is greater than or equal to the given value.
>Greater thanThe actual value is greater than the given value.

  • Quantity.unit:string [0..1]

這是這個數值的單位名稱。Type用string,那可以推想他是用來給人看的。

  • Quantity.system:uri [0..1]

有負責維護單位的編碼系統。這邊建議是UCUM (大概只有外國人願意幹這麼基礎性的工作。國內,就算我有心,也沒有機會)。當然也可以用SNOMED CT(真的是無所不包)。當你編碼系統用ISO 4127,那就表示簡化到Money這個Type。

  • Quantity.code:code [0..1]

這不用解釋了吧。就看你採用哪個編碼系統對這個單位所給予的編碼內容,很繞口!?那就看下一張圖吧。雖然unit是放"unit/kg",code要放"415785005"。


==========
曾經跟一個年輕小伙子開會,講到關於血糖在LOINC中還有分飯後幾小時。他說,這個根本不需要.balabala。我也沒給他好臉色,直接說我不認同,我們都不是醫檢師,請尊重專業。
也許是吧,台灣一向不尊重專業。國外嚴謹的態度,我們恐怕一時半載是趕不上的啦。
還是得繼續講下去。
==========
到這兒,得插播一下。有些Type,不算Type(哈~這些都是我自己的體會,如有亂講請包涵),稱之為Profile層級的Type。之前Money也是,後被獨立出來,所以,Profile層級的Type,也許有一天發現常用且重要,就被提升為正式的Type。
這類的東東,衍生自Quantity特多。接著就來看看。

  • MoneyQuantity
他就是Money的複雜型/Quantity的簡化型。

記得他不是Type,只是想用Quantity來表達Money。什麼時候使用呢?例如比率(Ratio),原本分子分母的定義是要用Quantity,可是現在是貨幣(Money)時,那要怎麼處理。Quantity最起碼Code中要放value。至於system要放的話,那一定是urn:iso:std:iso:4217。
其他的還有下列,請自行參考文件。

  • SimpleQuantity (少comparator)
  • Distance
  • Age
  • Count
  • Duration
=========

Range


NameFlagsCard.TypeDescription & Constraints
.. RangeΣINElementSet of values bounded by low and high
+ Rule: If present, low SHALL have a lower value than high
Elements defined in Ancestors: idextension
... lowΣ0..1SimpleQuantityLow limit
... highΣ0..1SimpleQuantityHigh limit
很直覺,低直與高值。但有個限制條件就是low要比high小。

Ratio

NameFlagsCard.TypeDescription & Constraints
.. RatioΣINElementA ratio of two Quantity values - a numerator and a denominator
+ Rule: Numerator and denominator SHALL both be present, or both are absent. If both are absent, there SHALL be some extension present
Elements defined in Ancestors: idextension
... numeratorΣ0..1QuantityNumerator value
... denominatorΣ0..1QuantityDenominator value
這個也很直覺,分子與分母。但有個限制條件,numerator與denominator必須同時出現,或同時不存在。

SampledData

NameFlagsCard.TypeDescription & Constraints
.. SampledDataTUElementA series of measurements taken by a device
Elements defined in Ancestors: idextension
... originΣ1..1SimpleQuantityZero value and units
... periodΣ1..1decimalNumber of milliseconds between samples
... factorΣ0..1decimalMultiply data by this before adding to origin
... lowerLimitΣ0..1decimalLower limit of detection
... upperLimitΣ0..1decimalUpper limit of detection
... dimensionsΣ1..1positiveIntNumber of sample points at each time point
... data0..1stringDecimal values with spaces, or "E" | "U" | "L"
這是用來當作取樣資料用,像ECG或EKG設備所產出的資料,就適合用這個Type來存放。注意,他還在TU階段,只有Observation Resource有用到他。

  • SampledData.origin:SimpleQuantity [1..1]

這是設定原點值,以及取樣資料的單位。

  • SampledData.period:decimal [1..1]

取樣時間長度(多久取樣一次)。以毫秒為單位。

  • SampledData.factor:decimal [0..1]

校正因子。(採樣數據要放回原點座標時要調整)

  • SampledData.lowerLimit:decimal [0..1]

採樣資料的下限值。

  • SampledData.upperLimit:decimal [0..1]

採樣資料的上限值。

  • SampledData.dimensions:positiveInt [1..1]

採樣數。在同一時間點下,採集多少筆資料。

  • SampledData.data:string [0..1]

原始數據資料。每一個數據由空白區隔。若有不正常者可標注為"E"(錯誤),"L"(低於下限值),"U"(高於上限值)。

==========
跟數值有關的Type大概介紹到此了。
有些可能還是需要到應用面時,才更有感覺。
這就是為何我急著要把所有Type講完。


沒有留言:

張貼留言