Saltar a contenido

Investigacion: Anonimizacion de Interacciones Medicamento-Medicamento

Identificador: MTS-INV-012 Version: 1.0.0 Fecha: 2025-12-07 Autor: SpecQueen Solicitado por: Director del Proyecto Estado: Completado


1. Resumen Ejecutivo

Esta investigacion define el proceso de anonimizacion para datos de interacciones medicamento-medicamento detectadas por uso real de los usuarios, permitiendo enriquecer el catalogo de interacciones (MTS-INT-001) con patrones del mundo real.

1.1. Concepto Clave: Separacion de Identidad

PRINCIPIO FUNDAMENTAL: MedTime usaseparacion de identidad, NO generalizacion. - SI se envian: Pares de medicamentos especificos, severidad observada - NO se envian: user_id, diagnostico del usuario, efectos especificos experimentados

1.2. Valor del Enriquecimiento

Las interacciones reportadas por usuarios complementan las bases de datos oficiales:

Fuente Cobertura Actualizacion Valor
DrugBank Alta Trimestral Interacciones conocidas
RxNorm Alta Mensual Interacciones USA
Usuarios MedTime Complementaria Tiempo real Patrones de uso real

2. Tipos de Datos

2.1. Interacciones Detectadas por Sistema

El motor de interacciones (MTS-INT-001) detecta automaticamente combinaciones:

interface InteraccionDetectada {
    medicamento_a: string;  // "Metformina"
    medicamento_b: string;  // "Enalapril"
    severidad_catalogo: string;  // "MENOR" | "MODERADO" | "SERIO" | "CONTRAINDICADO"
    accion_usuario: string;  // "CONTINUO" | "OMITIO" | "CONSULTO_MEDICO"
}

2.2. Interacciones Reportadas Manualmente

Usuarios pueden reportar efectos de combinaciones no catalogadas:

interface InteraccionReportada {
    medicamento_a: string;
    medicamento_b: string;
    descripcion_efecto: string;  // Texto libre (NO se envia)
    severidad_percibida: string;  // "LEVE" | "MODERADA" | "SEVERA"
}

3. Datos que SI se Envian (Anonimizados)

3.1. Estructura de Datos

interface InteraccionAnonima {
    // Token efimero
    session_token: string;  // 32 bytes, nuevo cada sesion

    // Par de medicamentos (SI se envian especificos)
    medicamento_a: string;  // "Metformina" (nombre generico)
    medicamento_b: string;  // "Enalapril" (nombre generico)

    // Contexto (generalizado)
    severidad_observada: string;  // "LEVE-MODERADA" (agrupado)
    accion_tomada: string;  // "CONTINUO" | "MODIFICO"

    // Metadata minima
    region: string;     // "Mexico" (pais)
    periodo: string;    // "2025-Q4" (trimestre)
    duracion_uso: string;  // "< 1 mes" | "1-6 meses" | "> 6 meses"
}

3.2. Reglas de Normalizacion

Dato Original Dato Anonimizado
"Glucophage 850mg" "Metformina" (generico)
"Lisinopril 20mg" "Enalapril" (clase IECA)
Severidad "MENOR" "LEVE-MODERADA"
Severidad "SERIO" "SERIO-CONTRAINDICADO"
"Consulte a mi medico" "CONSULTO"
"Lo segui tomando" "CONTINUO"

4. Datos que NUNCA se Envian

Dato Razon
user_id, email, device_id, IP Identificadores directos
Descripcion libre del efecto Puede contener PHI
Diagnostico del usuario PHI directo
Nombre del medico PHI de tercero
Dosis exactas Puede ser identificable
Timestamp exacto Permite correlacion
Region especifica Reduce anonimato
Medicamentos marca (cuando generico disponible) Reduce ambiguedad

5. Tecnicas de Anonimizacion

5.1. Normalizacion a Generico

# PSEUDOCODIGO - Normalizacion de nombres
MARCAS_A_GENERICOS = {
    "Glucophage": "Metformina",
    "Lipitor": "Atorvastatina",
    "Norvasc": "Amlodipino",
    # ... (mapeo completo de RxNorm)
}

def normalizar_medicamento(nombre: str) -> str:
    # Primero intentar mapeo directo
    if nombre in MARCAS_A_GENERICOS:
        return MARCAS_A_GENERICOS[nombre]

    # Si ya es generico, retornar
    return nombre

5.2. Supresion por Rareza

Pares de medicamentos raros no se reportan:

UMBRAL_PAR = 500  # Minimo 500 usuarios con el mismo par

def debe_reportar_par(med_a: str, med_b: str) -> bool:
    # Ordenar para consistencia
    par = tuple(sorted([med_a, med_b]))
    freq = obtener_frecuencia_par(par)
    return freq >= UMBRAL_PAR

5.3. Agrupacion de Severidad

AGRUPACION_SEVERIDAD = {
    "MENOR": "LEVE-MODERADA",
    "MODERADO": "LEVE-MODERADA",
    "SERIO": "SERIO-CONTRAINDICADO",
    "CONTRAINDICADO": "SERIO-CONTRAINDICADO",
}

def agrupar_severidad(severidad: str) -> str:
    return AGRUPACION_SEVERIDAD.get(severidad, "DESCONOCIDA")

6. Umbrales de Seguridad

6.1. K-Anonymity por Par

Tipo de Par Umbral k Accion si k < umbral
Medicamentos comunes >= 500 Reportar
Medicamentos especializados >= 1000 Reportar si >= 1000
Medicamentos sensibles (VIH, cancer) INFINITO NUNCA reportar

6.2. Medicamentos Sensibles

Pares que incluyan estos medicamentos NUNCA se reportan:

Categoria Ejemplos Razon
Antirretrovirales Tenofovir, Efavirenz Revela VIH
Quimioterapicos Imatinib, Trastuzumab Revela cancer
Psiquiatricos especificos Clozapina, Litio Revela condicion mental severa
Inmunosupresores Ciclosporina, Tacrolimus Revela transplante

7. Flujo de Anonimizacion

DISPOSITIVO                              SERVIDOR
+---------------------------+            +---------------------------+
| Sistema detecta par:      |            |                           |
| Metformina + Enalapril    |            |                           |
| Severidad: MODERADO       |            |                           |
| Usuario: Continuo         |            |                           |
+------------+--------------+            |                           |
             |                           |                           |
             v                           |                           |
+---------------------------+            |                           |
| ANONIMIZADOR LOCAL        |            |                           |
|                           |            |                           |
| 1. Normalizar a genericos |            |                           |
|    (ya son genericos)     |            |                           |
|                           |            |                           |
| 2. Verificar sensibilidad |            |                           |
|    ¿Algun med sensible?   |            |                           |
|    NO → Continuar         |            |                           |
|                           |            |                           |
| 3. Verificar k-anonymity  |            |                           |
|    ¿Par >= 500 usuarios?  |            |                           |
|    SI → Continuar         |            |                           |
|                           |            |                           |
| 4. Agrupar severidad      |            |                           |
|    MODERADO → LEVE-MOD    |            |                           |
|                           |            |                           |
| 5. Generalizar metadata   |            |                           |
|    Region → Mexico        |            |                           |
|    Periodo → 2025-Q4      |            |                           |
+------------+--------------+            |                           |
             |                           |                           |
             v                           v                           |
+---------------------------+     +---------------------------+      |
| PAQUETE ANONIMO           |---->| SERVIDOR RECIBE           |      |
|                           |     |                           |      |
| session_token: abc123...  |     | Puede agregar:            |      |
| med_a: "Metformina"       |     | "500+ usuarios usan       |      |
| med_b: "Enalapril"        |     |  Metformina + Enalapril   |      |
| severidad: "LEVE-MOD"     |     |  sin problemas severos"   |      |
| accion: "CONTINUO"        |     |                           |      |
| region: "Mexico"          |     | NO sabe:                  |      |
| periodo: "2025-Q4"        |     | - Usuarios especificos    |      |
+---------------------------+     | - Efectos exactos         |      |
                                  | - Dosis                   |      |
                                  +---------------------------+      |

8. Casos de Uso del Enriquecimiento

8.1. Descubrir Interacciones Nuevas

ESCENARIO: Par no catalogado

1. Sistema detecta par "Medicamento A + Medicamento B"
2. No hay interaccion en catalogo
3. 1000+ usuarios reportan efectos similares
4. Sistema sugiere nueva interaccion para validacion
5. Equipo medico revisa y agrega a catalogo

8.2. Validar Severidad Real

ESCENARIO: Severidad en catalogo vs realidad

Catalogo dice: Metformina + Alcohol = SERIO
Usuarios reportan: 80% continuan sin problema

→ Enriquecimiento sugiere revisar severidad

8.3. Patrones Regionales

ESCENARIO: Diferencias por region

Mexico: Combinacion X usada por 5000 usuarios
Brasil: Combinacion X usada por 200 usuarios

→ Identificar diferencias en practicas de prescripcion

9. Validacion y Auditoria

9.1. Pruebas de Re-identificacion

def test_reidentificacion_interacciones(datos, conocimiento_auxiliar):
    """
    Umbral: < 0.1% tasa de exito
    """
    tasa = calcular_tasa_exito(datos, conocimiento_auxiliar)
    assert tasa < 0.001

9.2. Auditorias

Tipo Frecuencia Foco
Automatizada Diaria Verificar umbrales k
Interna Mensual Revisar pares reportados
Externa Trimestral Validacion de anonimizacion

10. Cumplimiento Regulatorio

10.1. Mapeo a Regulaciones

Regulacion Requisito Cumplimiento
LFPDPPP Disociacion Normalizacion + supresion
HIPAA De-identification Eliminacion identificadores
LGPD Anonimizacao Datos no vinculables

11. Referencias

11.1. Documentos MedTime

11.2. Fuentes de Interacciones

  • DrugBank API
  • RxNorm Interactions
  • COFEPRIS Base de Interacciones

Documento generado por SpecQueen - "Tus interacciones seran anonimizadas... par por par."