# كيفية تطبيع البيانات الطبية

> البرنامج التعليمي: تحويل البيانات الطبية من مصادر متعددة إلى شكل واحد قابل للمقارنة — بحث LOINC، وحدات UCUM، تواريخ ISO، نطاقات مرجعية، لا تكرارات عند إعادة المحاولة، والتحقق مقابل ملف تعريف المختبر الأوروبي.

Source: https://developers.anpheros.com/ar/guides/normalize-medical-data

**يعني تطبيع البيانات الطبية تحويل القيم التي تصل بأشكال متعددة إلى شكل واحد قابل للمقارنة: نفس الرمز لنفس الاختبار، نفس نظام الوحدات، تواريخ بتنسيق واحد، كل قيمة مع نطاقها المرجعي ومصدرها، وعدم وجود تكرارات.** يوضح هذا البرنامج التعليمي كيفية القيام بذلك قبل وصول البيانات إلى سجل HL7 FHIR R4: البحث عن رموز LOINC و ATC، واستخدام وحدات UCUM، ورفض التواريخ الغامضة، والاحتفاظ بالنطاقات، وتجنب التكرارات عند إعادة المحاولة، والتحقق من النتيجة مقابل ملف تعريف المختبر الأوروبي. كل استجابة معروضة تأتي من Anpheros API.

## لماذا هذا مهم

يمكن أن تصلك نتيجة HbA1c نفسها بصيغ مختلفة مثل "HbA1c 6,4 %" أو "Hemoglobina glicozilata: 6.4" أو "Glycated haemoglobin 46 mmol/mol" أو رمز مختبري لا يفهمه سوى مختبر واحد. حتى تصبح هذه كلها رمزًا واحدًا بوحدة واحدة:

- يظهر الرسم البياني لـ HbA1c للمريض بمرور الوقت ثلاثة خطوط غير مترابطة؛
- يتجاهل التنبيه الخاص بـ "HbA1c أعلى من 6.5 %" قيمتين؛
- يرى نموذج الذكاء الاصطناعي أربع حقائق بدلاً من اتجاه واحد؛
- لا يمكن لنظام آخر يتلقى السجل تفسيره.

يجب أن تتم عملية التطبيع عند نقطة دخول البيانات إلى السجل، مرة واحدة، وليس في كل تطبيق يقرأها لاحقًا.

## ما هي القيمة المُطَبَّعة (Normalized Value)

| جزء | الشكل المُطَبَّع | مثال |
|---|---|---|
| ما تم قياسه | رمز من نظام قياسي | LOINC `4548-4` (HbA1c)، RxNorm `6809` (metformin)، ICD-10 `E11` (type 2 diabetes) |
| القيمة | رقم، أو نص فقط عندما لا تكون النتيجة رقمية | `6.4` |
| الوحدة | UCUM | `%`، `mg/dL`، `mm[Hg]`، `kg` |
| متى | تاريخ ووقت بتنسيق ISO 8601، مع المنطقة الزمنية عندما يكون الوقت مهمًا | `2026-10-01T07:30:00Z` |
| النطاق الطبيعي | الحد الأدنى والأقصى، بنفس الوحدة | `4.0`–`5.6` |
| المصدر | من أنتجها ومن أي نظام | `import` من `labx` |
| الهوية | شيء يجعل التكرار قابلاً للتعرف عليه | مفتاح idempotency أو معرف المصدر |

تم إدراج نظام الترميز الذي يتوافق مع كل نوع مورد في [أنظمة ترميز FHIR](https://developers.anpheros.com/ar/guides/fhir-code-systems).

## الخطوة 1: البحث عن الرمز

ابحث في مصطلحات المنصة بالاسم الإنجليزي أو الروماني، أو بالاختصار:

```bash
curl "https://platform.anpheros.com/v1/terminology/loinc?q=hba1c" -H "Authorization: Bearer $KEY"
curl "https://platform.anpheros.com/v1/terminology/loinc?q=hemoglobina%20glicozilata" -H "Authorization: Bearer $KEY"
```

كلاهما يعيد نفس المفهوم:

```json
{"data": [{"system": "http://loinc.org", "code": "4548-4", "display": "Hemoglobin A1c/Hemoglobin.total in Blood",
           "display_ro": "Hemoglobină glicozilată (HbA1c)", "category": "laboratory", "unit": "%"}], "total": 1}
```

بالنسبة للأدوية، [Anpheros Search](https://developers.anpheros.com/ar/guides/anpheros-search) يبحث عن المادة بالاسم أو العلامة التجارية ويعطي رمز مكون RxNorm الخاص بها وأرقام منتجات EMA:

```bash
curl "https://platform.anpheros.com/v1/search?q=metformin&type=treatment" -H "Authorization: Bearer $KEY"
```

حقل `unit` هو الوحدة التي يتوقعها LOINC لهذا الاختبار. استخدمه للتحقق مما تلقيته. قم ببناء التعيين من أسماء كل مصدر الخاصة به إلى الرموز مرة واحدة، لكل مصدر، واحتفظ به في تكاملك. لا تخمن وقت الكتابة: عندما يكون الاسم غامضًا ولا يوجد شيء في المصدر يوضحه، اتركه غير معين واطلب من المصدر. [كيفية استيراد نتائج المختبر إلى سجل FHIR](https://developers.anpheros.com/ar/guides/import-lab-results-fhir) يوضح كيف يتم الاحتفاظ بالواسمات المختبرية غير المعينة والإبلاغ عنها.

## الخطوة 2: الكتابة باستخدام الرموز والوحدات والنطاقات

```bash
curl -X POST "https://platform.anpheros.com/v1/patients/$PID/observations" -H "Authorization: Bearer $KEY" \
     -H "Content-Type: application/json" -H "Idempotency-Key: lab-77-hba1c" -d '{
  "code": "4548-4", "category": "laboratory",
  "value": 6.4, "unit": "%", "effective_at": "2026-10-01T07:30:00Z",
  "reference_range": {"low": 4.0, "high": 5.6},
  "author_type": "import"
}'
```

```json
{"id": "3296315c-…", "code": "4548-4", "system": "http://loinc.org", "display": "Hemoglobin A1c/Hemoglobin.total in Blood",
 "category": "laboratory", "effective_at": "2026-10-01T07:30:00Z", "value": 6.4, "unit": "%",
 "reference_range": {"low": 4.0, "high": 5.6}, "status": "final", "fhir": "Observation/3296315c-…"}
```

عندما ترسل الرمز فقط، تقوم المنصة بملء اسم LOINC القياسي، على واجهة برمجة تطبيقات REST وعلى واجهة برمجة تطبيقات FHIR (`/fhir/R4`) على حد سواء، بحيث تقرأ كل تطبيق نفس الشيء `display`. يتم الاحتفاظ بالـ `display` الذي ترسله بنفسك كما هو.

احتفظ بالصياغة الأصلية أيضًا. بالنسبة لتقرير معملي، يحمل الـ `code.text` في FHIR Observation اسم المختبر ("Hemoglobina glicozilata (HbA1c)") بجوار ترميز LOINC. لا يزال المريض يتعرف على تقريره الورقي، ولا يُفقد شيء إذا تم التشكيك في الربط في أي وقت.

## الخطوة 3: الوحدات

استخدم رموز UCUM: `mg/dL`، `mmol/L`، `%`، `mm[Hg]`، `kg`، `cm`، `/min`، `Cel`. قاعدتان تمنعان معظم الأخطاء:

- **لا تقم بالتحويل بصمت.** إذا أبلغ المختبر عن الجلوكوز بوحدة `mmol/L` وكان تطبيقك يعرضه بوحدة `mg/dL`، فقم بتخزين ما قاسه المختبر وقم بالتحويل عند عرضه. تظل القيمة المخزنة قابلة للتتبع إلى التقرير.
- **تحقق من الوحدة مقابل الرمز.** رموز LOINC محددة: HbA1c بوحدة `%` هو `4548-4`، بينما HbA1c بوحدة `mmol/mol` هو رمز LOINC مختلف. القيمة التي لا تتطابق وحدتها مع الوحدة المتوقعة للرمز هي خطأ في الربط، وليست مشكلة تحويل.

لا يقوم Anpheros بتحويل الوحدات لك؛ بل يقوم بتخزين الوحدة التي ترسلها.

## الخطوة 4: التواريخ

قم بتحويل التواريخ إلى تنسيق ISO 8601 قبل الكتابة، باستخدام التنسيق المعروف للمصدر. `01.10.2026` هو 1 أكتوبر في رومانيا والعديد من الدول الأوروبية، ولكن `10/01/2026` هو 1 أكتوبر فقط في الولايات المتحدة. ترفض واجهة برمجة التطبيقات (API) أي شيء ليس بتنسيق ISO، بدلاً من التخمين:

```json
{"error": {"type": "invalid", "message": "Input should be a valid datetime or date, invalid character in year (at effective_at)", "field": "effective_at"}}
```

موصل المختبر هو الاستثناء: فهو يقبل `DD.MM.YYYY` و `DD/MM/YYYY` لأنه يعرف أنه يقرأ تقريرًا أوروبيًا.

بالنسبة للقياسات التي يكون فيها وقت اليوم مهمًا (ضغط الدم، الجلوكوز، جرعات الأدوية)، أرسل الوقت مع منطقته الزمنية. قراءة في الساعة 23:30 في بوخارست تكون في اليوم السابق بتوقيت UTC، ويتوقع المريض أن تكون في اليوم الذي أخذها فيه.

## الخطوة 5: لا تكرارات

تنشأ التكرارات من إعادة المحاولة، ومن إرسال نفس التقرير مرتين، ومن وصول نفس القيمة عبر مسارين.

- **إعادة المحاولة:** أرسل `Idempotency-Key` يحدد القيمة في المصدر، على سبيل المثال معرف التقرير والاختبار. إرسال نفس الطلب مرة أخرى بنفس المفتاح يعيد الاستجابة الأولى ولا يخزن شيئًا جديدًا. تضيف حزم SDK واحدة إلى كل عملية إنشاء.
- **نفس التقرير مرتين:** يبني موصل المختبر معرفًا ثابتًا لكل صف من التقرير، والرمز، والتاريخ، والقيمة، ويتجاوز الصفوف التي تم استيرادها بالفعل.
- **مساران:** قم بتخزين المعرف الخاص بنظام المصدر مع `X-Anpheros-Origin-Id` (أو في `identifier` على موارد FHIR)، وابحث عنه قبل كتابة القيم التي يمكن أن تعود عبر مسار آخر.

## الخطوة 6: التحقق مقابل ملف تعريف

بالنسبة لنتائج المختبر، اسأل المنصة عن كيفية قياس مورد ما مقابل ملف تعريف تقرير مختبر HL7 Europe قبل الاعتماد عليه:

```bash
curl -X POST "https://platform.anpheros.com/fhir/R4/Observation/\$validate?profile=eu-lab" -H "Authorization: Bearer $KEY" \
     -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Observation", "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "laboratory"}]}],
  "code": {"text": "HbA1c"}, "subject": {"reference": "Patient/'$PID'"},
  "valueQuantity": {"value": 6.4, "unit": "%"}
}'
```

هذه النتيجة غير المعيارية تحصل على قائمة دقيقة:

```json
{"resourceType": "OperationOutcome", "issue": [
  {"severity": "error", "code": "invalid", "diagnostics": "Observation.code must carry a LOINC coding.", "expression": ["Observation.code"]},
  {"severity": "error", "code": "required", "diagnostics": "Observation.effective[x] is required.", "expression": ["Observation.effective"]},
  {"severity": "warning", "code": "business-rule", "diagnostics": "valueQuantity should carry a UCUM system and code.", "expression": ["Observation.valueQuantity"]},
  {"severity": "warning", "code": "informational", "diagnostics": "No referenceRange: interpretation will need the laboratory's ranges.", "expression": ["Observation.referenceRange"]},
  {"severity": "information", "code": "informational", "diagnostics": "No performer (laboratory) recorded.", "expression": ["Observation.performer"]},
  {"severity": "information", "code": "informational", "diagnostics": "No issued time (when the laboratory released the result).", "expression": ["Observation.issued"]}]}
```

تتوافق كل مشكلة مع إحدى الخطوات المذكورة أعلاه. قم بتشغيل `$validate` في اختبارات التكامل الخاصة بك، مع عينات حقيقية من كل مصدر.

## الخطوة 7: الحفاظ على المصدر

يغير التطبيع كيفية كتابة القيمة، وليس مصدرها أبدًا. أرسل `author_type` (`device`، `import`، `practitioner`، `patient`) و `X-Anpheros-Source-System` مع كل عملية كتابة. هذا ما يسمح للطبيب أو المدقق أو نموذج الذكاء الاصطناعي بالتمييز بين نتيجة مختبر وقيمة تم إدخالها في المنزل. انظر [شرح مصدر البيانات الطبية](https://developers.anpheros.com/ar/guides/medical-data-provenance).

## قائمة التحقق

- [ ] كل مصدر لديه تعيين من أسمائه إلى LOINC / ATC / ICD-10، محفوظ في تكاملك
- [ ] تبقى الأسماء الغامضة غير مُعيّنة ويتم الإبلاغ عنها، ولا يتم تخمينها أبدًا
- [ ] وحدات UCUM، مطابقة للرمز؛ لا يوجد تحويل صامت
- [ ] تواريخ ISO 8601، مع مناطق زمنية حيث يكون الوقت مهمًا
- [ ] نطاقات مرجعية محفوظة مع قيم المختبر
- [ ] تمت المحافظة على الصياغة الأصلية (`code.text`)
- [ ] مفاتيح التكرار أو معرفات المصدر عند كل كتابة
- [ ] `author_type` ونظام المصدر عند كل كتابة
- [ ] `$validate` في اختبارات نتائج المختبر

## أسئلة متكررة

### ما هو تطبيع البيانات الطبية؟
تحويل البيانات الصحية من مصادر مختلفة إلى شكل قياسي واحد: رموز مشتركة (LOINC للاختبارات والقياسات، ICD-10 للتشخيصات، ATC للأدوية)، وحدات UCUM، تواريخ ISO، نطاقات مرجعية، ومصدر مسجل، بحيث يمكن مقارنة القيم من أنظمة مختلفة ودمجها وتبادلها.

### هل يجب عليّ تحويل جميع القيم إلى وحدة واحدة؟
قم بتخزين الوحدة التي قاس بها المصدر، طالما أنها وحدة UCUM صالحة تتطابق مع الرمز، وقم بالتحويل عند العرض أو التحليل. هذا يحافظ على تتبع كل قيمة مخزنة إلى تقريرها الأصلي.

### هل يمكن أن يكون التطبيع تلقائيًا بالكامل؟
في الغالب. يمكن تعيين الرموز في المصدر، والأسماء المعروفة، والوحدات ذات التنسيق الجيد تلقائيًا. الأسماء الغامضة والرموز المحلية غير المعروفة تحتاج إلى قرار بشري مرة واحدة لكل مصدر، وبعد ذلك يكون التعيين تلقائيًا.

## مواضيع ذات صلة

- [أنظمة أكواد FHIR](https://developers.anpheros.com/ar/guides/fhir-code-systems)
- [كيفية استيراد نتائج المختبر إلى سجل FHIR](https://developers.anpheros.com/ar/guides/import-lab-results-fhir)
- [شرح مصدر البيانات الطبية](https://developers.anpheros.com/ar/guides/medical-data-provenance)
- [قابلية التشغيل البيني للبيانات الصحية](https://developers.anpheros.com/ar/guides/interoperability)
- [واجهة برمجة تطبيقات البيانات الطبية](https://developers.anpheros.com/ar/guides/medical-data-api)
