Datos de salud que funcionan
Los datos de alta calidad son la columna vertebral de una atención sanitaria digital eficaz, pero capturar esos datos y extraer conclusiones de ellos está lejos de ser sencillo. Muchas organizaciones sanitarias siguen lidiando con registros fragmentados, entradas de pacientes inconsistentes y flujos de trabajo manuales que consumen tiempo, obstaculizando la toma de decisiones y ralentizando la prestación de la atención. Aquí es donde entran en juego Aidbox Forms y SQL on FHIR. Estas potentes herramientas transforman la manera en que los equipos de atención recopilan y trabajan con los datos.
Aidbox Forms permite crear formularios digitales estructurados que utilizan códigos SNOMED CT o LOINC para estandarizar la entrada, automatizar cálculos como el IMC y garantizar la calidad e interoperabilidad de los datos, eliminando los errores habituales en la entrada en papel. Una vez recopilados, SQL on FHIR convierte los complejos recursos FHIR en tablas consultables, facilitando a los equipos sanitarios el análisis y la visualización de datos sin necesidad de navegar por estructuras anidadas. Juntas, estas herramientas optimizan los flujos de trabajo, reducen la carga de trabajo manual y liberan a los equipos de atención para que puedan dedicarse a lo que más importa: prestar una atención mejor.
En este artículo, le guiaremos por el proceso completo mediante un ejemplo real: el Formulario de Evaluación de Riesgos, diseñado para recopilar métricas de estilo de vida como el estado tabáquico, el consumo de alcohol, la actividad física y los hábitos alimentarios. El formulario completo puede encontrarse en la Galería de Formularios de Aidbox. Para mayor simplicidad, nos centraremos en un subconjunto de este formulario que cubre el estado tabáquico y el IMC.

1. Recopilación de datos con FHIR SDC
Antes de que pueda realizarse un análisis significativo, es necesario recopilar los datos de forma estructurada y coherente, y ahí es donde entra en juego FHIR Structured Data Capture (SDC). En FHIR, los formularios se crean como recursos Questionnaire, y los formularios completados se guardan como recursos QuestionnaireResponse. En otras palabras, los datos están estructurados y estandarizados de forma que resulta fácil compartirlos, comprenderlos y reutilizarlos en distintos sistemas sanitarios, un factor crucial para la atención coordinada y el análisis a escala del sistema. FHIR SDC también ofrece funcionalidades avanzadas, entre ellas:
- Campos autocompletados con datos existentes del paciente para reducir entradas redundantes
- Cálculos automatizados, como el IMC a partir de la altura y el peso, o la edad a partir de la fecha de nacimiento
- Controles y lógica avanzados para guiar a los usuarios a través de formularios complejos de forma intuitiva.
Veamos esto en acción creando un formulario digital con Aidbox Form Builder. Nuestro ejemplo se centrará en capturar algunas métricas clave de estilo de vida: estado tabáquico, altura y peso, con el IMC calculado automáticamente. A continuación, así es como se verá el recurso Questionnaire:
{
"resourceType": "Questionnaire",
"id": "health-metrics",
"title": "Health Metrics",
"status": "active",
"item": [
{
"linkId": "smoking-status",
"text": "What is your smoking status?",
"type": "choice",
"answerOption": [
{"valueCoding": {"code": "266919005", "display": "Never smoked", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "449868002", "display": "Current smoker", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "8517006", "display": "Former smoker", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "266927001", "display": "Passive smoker", "system": "http://snomed.info/sct"}}
]
},
{
"linkId": "height",
"text": "What is your height (in cm)?",
"type": "decimal"
},
{
"linkId": "weight",
"text": "What is your weight (in kg)?",
"type": "decimal"
},
{
"linkId": "bmi",
"text": "Body Mass Index (calculated)",
"type": "decimal",
"readOnly": true,
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-calculatedExpression",
"valueExpression": {
"language": "text/fhirpath",
"expression": "weight / ((height / 100) * (height / 100))"
}
}
]
}
]
}
Este formulario estandariza las entradas clave de estilo de vida:
- El estado tabáquico está codificado con SNOMED CT, garantizando la coherencia semántica.
- La altura y el peso se registran en unidades métricas.
- El IMC se calcula al momento mediante una expresión FHIRPath, mejorando la eficiencia y reduciendo los errores manuales.
Al aprovechar FHIR SDC y herramientas como Aidbox Form Builder, los equipos sanitarios pueden recopilar datos de alta calidad e interoperables.
2. Estructuración de datos para el análisis
Recopilar datos es solo el primer paso: el verdadero valor surge cuando esos datos se estructuran para su análisis y reutilización. En FHIR, los formularios completados se almacenan como recursos QuestionnaireResponse. Este formato funciona bien para capturar lo que un paciente envió, vinculado directamente a las preguntas del formulario. Sin embargo, por sí solo, a menudo resulta insuficiente para las necesidades sanitarias del mundo real.
He aquí el motivo.
Un QuestionnaireResponse almacena datos en bruto estrechamente acoplados a la estructura original del formulario. Por ejemplo, puede capturar que un paciente es «fumador activo» o que tiene un IMC calculado, pero para recuperar esa información más adelante, los sistemas necesitan comprender el diseño específico del formulario. Esto dificulta enormemente la consulta entre pacientes o el intercambio de datos con otros sistemas. Además, QuestionnaireResponse no está diseñado para soportar flujos de trabajo clínicos como la visualización de tendencias a lo largo del tiempo, la cumplimentación de historiales de pacientes o la activación de la ayuda a la decisión clínica.
Para resolver esto, las respuestas clave pueden extraerse y convertirse en recursos FHIR estructurados, como Observation. Aquí es donde Aidbox Forms aporta un valor significativo.
Cuando se activa la extracción, Aidbox Forms transforma las respuestas seleccionadas en Observations independientes y reutilizables.
Por ejemplo:
- Un estado tabáquico de «fumador activo» se convierte en una Observation codificada con LOINC 72166-2 (Estado tabáquico) y SNOMED CT para el valor de la respuesta.
- El IMC calculado se extrae utilizando LOINC 39156-5, y la altura y el peso pueden gestionarse de forma similar con códigos estándar.
Esta separación ofrece ventajas clave:
- Interoperabilidad: Las Observations se alinean con perfiles FHIR ampliamente utilizados como US Core, por lo que otros sistemas pueden interpretarlas sin necesidad del formulario original.
- Flexibilidad: Las Observations discretas pueden consultarse de forma independiente, por ejemplo, para encontrar todos los pacientes con un IMC superior a 30, sin necesidad de navegar por las estructuras QuestionnaireResponse.
- Uso contextual: Las Observations pueden vincularse a pacientes, encuentros o marcas de tiempo, lo que permite el seguimiento longitudinal o la toma de decisiones clínicas.
- Múltiples fuentes: Los datos pueden provenir de distintas fuentes: cuestionarios, dispositivos wearables o HCE. La extracción en Observations los estandariza en un formato común, permitiendo una integración y un análisis fluidos independientemente del origen.
Con Aidbox Form Builder, es fácil especificar qué respuestas deben extraerse. Simplemente se configuran los elementos del formulario para incluir la extensión observationExtract. Aquí está el mismo cuestionario health-metrics de la Sección 1, ahora con la extracción configurada para «smoking-status» y «bmi»:
{
"resourceType": "Questionnaire",
"id": "health-metrics",
"title": "Health Metrics",
"status": "active",
"item": [
{
"linkId": "smoking-status",
"text": "What is your smoking status?",
"type": "choice",
"answerOption": [
{"valueCoding": {"code": "266919005", "display": "Never smoked", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "449868002", "display": "Current smoker", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "8517006", "display": "Former smoker", "system": "http://snomed.info/sct"}},
{"valueCoding": {"code": "266927001", "display": "Passive smoker", "system": "http://snomed.info/sct"}}
],
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/sdc-questionnaire-observationExtract",
"valueBoolean": true
},
{
"url": "http://hl7.org/fhir/StructureDefinition/sdc-questionnaire-observationExtract-code",
"valueCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "72166-2", "display": "Tobacco smoking status"}]}
}
]
},
{
"linkId": "height",
"text": "What is your height (in cm)?",
"type": "decimal"
},
{
"linkId": "weight",
"text": "What is your weight (in kg)?",
"type": "decimal"
},
{
"linkId": "bmi",
"text": "Body Mass Index (calculated)",
"type": "decimal",
"readOnly": true,
"extension": [
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-calculatedExpression",
"valueExpression": {
"language": "text/fhirpath",
"expression": "weight / ((height / 100) * (height / 100))"
}
},
{
"url": "http://hl7.org/fhir/StructureDefinition/sdc-questionnaire-observationExtract",
"valueBoolean": true
},
{
"url": "http://hl7.org/fhir/StructureDefinition/questionnaire-observationLinkPeriod",
"valueDuration": {"value": 0, "unit": "days", "system": "http://unitsofmeasure.org"}
},
{
"url": "http://hl7.org/fhir/StructureDefinition/sdc-questionnaire-observationExtract-code",
"valueCodeableConcept": {"coding": [{"system": "http://loinc.org", "code": "39156-5", "display": "Body Mass Index"}]}
}
]
}
]
}
Supongamos que un paciente envía:
- Estado tabáquico: «Fumador activo»
- Altura: 170 cm
- Peso: 70 kg
- IMC: (calculado como 24,22)
El QuestionnaireResponse resultante tendría el siguiente aspecto (simplificado):
{
"resourceType": "QuestionnaireResponse",
"questionnaire": "Questionnaire/health-metrics",
"status": "completed",
"subject": {"reference": "Patient/123"},
"item": [
{
"linkId": "smoking-status",
"answer": [{"valueCoding": {"code": "449868002", "display": "Current smoker", "system": "http://snomed.info/sct"}}]
},
{"linkId": "height", "answer": [{"valueDecimal": 170}]},
{"linkId": "weight", "answer": [{"valueDecimal": 70}]},
{"linkId": "bmi", "answer": [{"valueDecimal": 24.22}]}
]
}
Gracias a la extensión observationExtract, Aidbox Forms generará automáticamente estos recursos Observation para los elementos marcados:
Observation de Estado Tabáquico:
{
"resourceType": "Observation",
"status": "final",
"code": {"coding": [{"system": "http://loinc.org", "code": "72166-2", "display": "Tobacco smoking status"}]},
"subject": {"reference": "Patient/123"},
"valueCodeableConcept": {"coding": [{"system": "http://snomed.info/sct", "code": "449868002", "display": "Current smoker"}]}
}
Observation de IMC:
{
"resourceType": "Observation",
"status": "final",
"code": {"coding": [{"system": "http://loinc.org", "code": "39156-5", "display": "Body Mass Index"}]},
"subject": {"reference": "Patient/123"},
"valueQuantity": {"value": 24.22, "unit": "kg/m2", "system": "http://unitsofmeasure.org"}
}
Aidbox Forms automatiza esta extracción, mapeando las respuestas a un formato fácilmente consultable, de modo que los equipos sanitarios no pierdan tiempo en la preparación manual de datos. La altura y el peso permanecen en el QuestionnaireResponse en este caso, porque no se configuraron para su extracción, pero esto puede cambiarse fácilmente añadiendo las mismas extensiones, lo que facilita su recuperación y el intercambio entre sistemas.
3. Creación de ViewDefinitions para el análisis con SQL on FHIR
El análisis de datos de salud debería ser intuitivo. SQL on FHIR permite consultar recursos FHIR utilizando la sintaxis SQL familiar, por ejemplo, para contar fumadores o rastrear tendencias de IMC. Pero existe un desafío: los datos FHIR, como las Observations, se almacenan en un formato anidado y jerárquico que no resulta naturalmente adecuado para las herramientas SQL estándar. Ahí es donde las ViewDefinitions, una funcionalidad del conjunto de herramientas de Health Samurai, se vuelven imprescindibles.
Sin ViewDefinitions, consultar recursos FHIR directamente implica navegar por estructuras JSON profundamente anidadas. Una Observation típica incluye arrays de codificaciones, referencias a otros recursos y tipos de datos embebidos. Por ejemplo, intentar encontrar todas las entradas de «fumador activo» requeriría analizar cada campo valueCodeableConcept.coding, lo cual es tedioso y propenso a errores si se utiliza SQL plano. Las ViewDefinitions resuelven esto aplanando los datos FHIR en una vista tabular, haciéndolos funcionar como una tabla de base de datos tradicional.
He aquí por qué las ViewDefinitions son valiosas:
- Simplificación: Transforman los datos FHIR anidados en filas y columnas, de modo que puede consultarlos con SQL sencillo en lugar de herramientas específicas de FHIR o scripts personalizados.
- Personalización: Usted define exactamente qué campos, como el ID del paciente o el valor del IMC, son relevantes para su análisis, filtrando el ruido.
- Eficiencia: Las vistas predefinidas ahorran tiempo, permitiendo a los equipos ejecutar consultas coherentes sin reconstruir lógica compleja cada vez.
Por ejemplo, aquí hay una ViewDefinition para las observaciones de estado tabáquico:
{
"name": "observation_smoking_view",
"resource": "observation",
"select": [
{
"column": [
{
"name": "observation_id",
"path": "getResourceKey()"
},
{
"name": "code",
"path": "value.ofType(CodeableConcept).coding.first().code"
},
{
"name": "display",
"path": "value.ofType(CodeableConcept).coding.first().display"
},
{
"name": "qr_id",
"path": "derivedFrom.first().getReferenceKey()"
}
]
}
],
"where": [
{
"path": "code.coding.where(code = '365981007').exists()"
}
],
"status": "active",
"id": "observation_smoking_view",
"resourceType": "ViewDefinition"
}
Y aquí hay una para las observaciones de IMC:
{
"name": "observation_bmi_view",
"resource": "observation",
"select": [
{
"column": [
{
"name": "observation_id",
"path": "getResourceKey()"
},
{
"name": "bmi",
"path": "value.ofType(Quantity).value",
"type": "decimal"
},
{
"name": "qr_id",
"path": "derivedFrom.first().getReferenceKey()"
}
]
}
],
"where": [
{
"path": "code.coding.where(code = '60621009').exists()"
}
],
"status": "active",
"id": "observation_bmi_view",
"resourceType": "ViewDefinition"
}
Estas vistas transforman las complejas estructuras FHIR en tablas limpias listas para el análisis. La SmokingStatusView extrae los ID de pacientes y el estado tabáquico (LOINC 72166-2), mientras que la BMIView extrae los valores de IMC (LOINC 39156-5) con sus unidades. Podría consultarlas de la siguiente manera:
Tabaquismo:
SELECT * FROM SmokingStatusView
IMC:
SELECT * FROM BMIView
Cada consulta devuelve un conjunto de datos plano y estructurado que ya resulta cómodo para trabajar:
Salida de BMIView:
| gen-obs-bmi-1 | 24.064332204316088 | gen-qr-1 |
|---|---|---|
| gen-obs-bmi-10 | 23.320073211330087 | gen-qr-10 |
| gen-obs-bmi-100 | 30.760773314666764 | gen-qr-100 |
| gen-obs-bmi-1000 | 24.825445454831456 | gen-qr-1000 |
| gen-obs-bmi-10000 | 27.455811393648887 | gen-qr-10000 |
«SELECT * FROM BMIView»
Salida de SmokingStatusView:
| gen-obs-smoking-1 | 77176002 | Smoker | gen-qr-1 |
|---|---|---|---|
| gen-obs-smoking-10 | 266919005 | Never smoked tobacco | gen-qr-10 |
| gen-obs-smoking-100 | 77176002 | Smoker | gen-qr-100 |
| gen-obs-smoking-1000 | 266919005 | Never smoked tobacco | gen-qr-1000 |
| gen-obs-smoking-10000 | 160617001 | Stopped smoking | gen-qr-10000 |
«SELECT * FROM SmokingStatusView»
4. Visualización de datos con Metabase y ViewDefinitions
La visualización de datos es donde realmente emergen los conocimientos. Al integrar SQL on FHIR con herramientas como Metabase, una herramienta de visualización de código abierto, puede transformar consultas en bruto en gráficos y paneles de control dinámicos, sin depender de hojas de cálculo manuales. Las ViewDefinitions, como se mostró en la Sección 3, actúan como puente entre las complejas estructuras FHIR y el análisis basado en SQL. Transforman los datos sanitarios anidados en vistas tabulares limpias que herramientas de visualización como Metabase pueden consumir fácilmente. Veamos dos ejemplos prácticos utilizando los datos de estado tabáquico e IMC que hemos recopilado anteriormente.
Tendencias de tabaquismo por género


Un sencillo gráfico de barras puede mostrar cómo difieren los hábitos tabáquicos entre géneros, revelando, por ejemplo, que un mayor porcentaje de hombres declara ser fumador activo. Visualizaciones como esta facilitan la identificación de patrones a nivel poblacional y orientan las intervenciones específicas.
Panel de control de salud general
Un panel de control que combine múltiples métricas, como la distribución del IMC, el estado tabáquico y el consumo de alcohol, puede proporcionar una visión general del estado de salud de la población de un vistazo. Estas vistas ayudan a los clínicos y analistas a identificar rápidamente riesgos y tendencias sin necesidad de consultar datos en bruto.
Para que esto funcione en la práctica:
- El Formulario de Evaluación de Riesgos debe estar configurado para extraer datos en recursos Observation.
- Las ViewDefinitions convierten entonces estos datos en tablas planas consultables con SQL.
- Metabase se conecta a la interfaz SQL on FHIR y visualiza el resultado.
Este formulario, con campos codificados y extracción de datos configurada, está disponible para descargar desde la Galería de Formularios.
También proporcionamos un Notebook público en cada instancia de Aidbox con orientación paso a paso sobre la creación de ViewDefinitions adaptadas a este formulario.
Conclusión
Aidbox Forms y SQL on FHIR optimizan todo el recorrido de los datos sanitarios, desde la recopilación estructurada hasta la visualización significativa. Construidas sobre estándares FHIR y diseñadas para facilitar su uso, ayudan a las organizaciones sanitarias a superar la complejidad y centrarse en lo que importa: una mejor atención a través de mejores conocimientos. Ya sea que esté recopilando métricas de estilo de vida, creando paneles de control o realizando análisis de salud poblacional, Aidbox le proporciona las herramientas para avanzar con rapidez, mantener el cumplimiento normativo y prestar una atención mejor.
¿Desea ver cómo encaja en su flujo de trabajo? Explore Aidbox Forms en aidbox.app.





