Skip to contents

Ejecuta todas las métricas instanciadas de un modelo_calidad. Cada fila es una medida reutilizable y conserva el identificador y la fecha de la corrida.

Usage

medir(
  modelo,
  datos,
  id_medicion = NULL,
  fecha = Sys.time(),
  aplicabilidad = NULL,
  proteger_datos_personales = TRUE,
  columnas_personales = character(),
  validadores_personales = NULL
)

Arguments

modelo

Primer argumento. Objeto operativo creado por modelo(); reúne las métricas instanciadas que se van a ejecutar. No es el objeto perfil que devuelve perfilar() ni el marco conceptual de marco_calidad().

datos

Segundo argumento. Data frame para una sola entidad o lista con nombre de data frames para varias entidades. Es la tabla que se mide, no un perfil ni un modelo.

Con una lista, tienen que estar las tablas de todas las entidades que el modelo mide; si falta alguna se rechaza antes de medir, nombrando todas las que faltan y cuáles se recibieron. Una tabla que el modelo no pide se ignora: no hace falta que la lista coincida exactamente con las entidades, sólo que no falte ninguna.

id_medicion

Identificador de corrida. Si se omite, se genera uno. Cada medida lleva un id_medida que lo antepone a su métrica instanciada y la numera dentro de ella —M-NoNulo@t.x-000001—: una corrida armada por partes con el mismo id_medicion y unida con rbind() no repite identificadores, y la misma métrica medida dos veces en la corrida sí, que es lo que evaluar() y historico_calidad() rechazan.

fecha

Fecha y hora de la corrida. Se guarda en UTC; un texto —"2026-03-01" o "2026-03-01 09:30:00"— se lee en UTC, no en el huso de la sesión, así que la misma llamada registra el mismo instante en cualquier máquina.

aplicabilidad

Lista con nombre por columna, donde cada elemento es una fórmula que dice en qué filas esa columna corresponde —por ejemplo list(marca_auto = ~ tiene_auto == "Si")—. Las filas fuera de ese universo salen de la medición en vez de contarse como ausencia. Una métrica de varias columnas se mide donde corresponden todas. Las medidas citan la fila de la tabla original —fila y objeto_medible—, no su posición en el universo.

Es la misma declaración que recibe perfilar(), y hace falta porque una métrica de completitud sobre una columna condicionada mide lo que no corresponde: con universo de 300 filas sobre 1.000 y 30 vacías de verdad, sin declararlo da 0,270 y declarándolo 0,900. El histórico y la deriva consumen mediciones, así que heredan el número que salga de acá.

Sin declaración toda la tabla aplica y el resultado es el de siempre.

proteger_datos_personales

Si se enmascaran los candidatos de proximidad que corresponden a columnas personales. Por omisión TRUE. También gobierna lo que escribe un método propio: si alguna tabla recibida tiene columnas personales, su etiqueta objeto se reemplaza por la canónica del paquete (tabla$columna[fila]), y los valores de esas columnas se enmascaran en el motivo de una métrica no_medible. La protección alcanza a lo que medir() recibe: un valor que un método trae de otro lado —una tabla que no se le pasó a medir()— no se puede reconocer, y publicarlo es responsabilidad de quien escribe el método.

columnas_personales

Columnas que traen datos personales, declaradas con la misma forma que acepta perfilar(): nombres de columna, o un vector con nombre donde el nombre es la columna y el valor es el tipo. Se protegen aunque el léxico por omisión no las reconozca —un nombre propio de la organización, un identificador interno—. Sólo tiene efecto con proteger_datos_personales = TRUE.

validadores_personales

Pack o lista nombrada de funciones de validación, con la misma forma que acepta perfilar(). Sin esto, la medición usa el léxico por omisión.

Value

Data frame S3 de clase medicion, con una fila por objeto medido. Los booleanos se almacenan como 0 y 1 en la columna común resultado. orientacion conserva si un valor alto expresa conformidad, si un valor alto expresa defecto o si esa lectura no aplica. Algunas métricas que trabajan con un vocabulario o un alcance parcial agregan un atributo alcance_metricas con sus conteos y límites. Si una métrica no puede medirse, no crea filas ni ceros: deja el motivo y cómo resolverlo en el atributo cobertura_metricas, con un estado que distingue tres causas: sin_valores cuando su universo no tiene valores, contrato_incompleto cuando su contrato no trae un campo que necesita, y no_medible cuando su método falló sobre estos datos —una columna sin dos valores para ErrorEstandar, un atributo que la tabla no trae, una regla que devuelve NA—, devolvió una salida que no cumple el contrato de metodo, o no devolvió ninguna medida sobre un universo que sí tiene valores. Cuando el método falló, el motivo conserva su mensaje, con los valores de las columnas personales enmascarados si proteger_datos_personales = TRUE, y medir() avisa: la falla ya no se lleva la medición de las demás métricas, pero tampoco queda muda. Y cuando sí pudo medirse pero sobre menos elementos de los que hay en su universo aplicable —una métrica por celda no mide la celda vacía, que no produce medida ni cuenta como incumplimiento—, el atributo alcance_medidas publica cuántos midió de cuántos, con su unidad: sin ese número, el agregado de tres celdas de cuatro no se distingue del de cuatro. Viaja al tablero, se imprime con la medición y se publica en el informe. También conserva configuracion_modelo y configuracion_aplicabilidad, descripciones de la política usada para que una deriva posterior pueda distinguir modelo de datos. Si el modelo declara un marco, la medición conserva tambien marco_calidad; la configuracion del modelo registra su nombre, sus pares dimension-factor y el tipo_resultado de cada metrica.

Esa descripcion es insensible al orden de la declaracion: declarar las mismas metricas, o los mismos pares del marco, en otro orden no cambia el modelo, porque un modelo es un conjunto de instrumentos y un marco un conjunto de pares. El orden de los atributos de una instancia sí es parte del modelo, porque el metodo recibe las columnas en ese orden. Y el metodo de medicion entra en la descripcion solo si lo declaro quien llama: el metodo por omision de una metrica es del paquete y su identidad ya viaja en el nombre de la metrica, de modo que un cambio interno de lupa no se lee como un cambio del modelo del usuario.

Examples

nucleo <- metricas_nucleo()
especifica <- especializar(nucleo$NoNulo, nombre_especifico = "NoNuloEdad")
instancia <- instanciar(especifica, "personas", "edad")
medir(modelo(instancia), data.frame(edad = c(20, NA, 35)))
#>                                                              id_medida
#> 1 medicion-20261002T092359.946884-7626-NoNuloEdad@personas.edad-000001
#> 2 medicion-20261002T092359.946884-7626-NoNuloEdad@personas.edad-000002
#> 3 medicion-20261002T092359.946884-7626-NoNuloEdad@personas.edad-000003
#>                            id_medicion               fecha metrica
#> 1 medicion-20261002T092359.946884-7626 2026-10-02 09:23:59  NoNulo
#> 2 medicion-20261002T092359.946884-7626 2026-10-02 09:23:59  NoNulo
#> 3 medicion-20261002T092359.946884-7626 2026-10-02 09:23:59  NoNulo
#>   metrica_especifica      metrica_instanciada   dimension   factor orientacion
#> 1         NoNuloEdad NoNuloEdad@personas.edad Completitud Densidad conformidad
#> 2         NoNuloEdad NoNuloEdad@personas.edad Completitud Densidad conformidad
#> 3         NoNuloEdad NoNuloEdad@personas.edad Completitud Densidad conformidad
#>        granularidad tipo_resultado  entidad atributo fila   objeto_medible
#> 1 instanciaAtributo       booleano personas     edad    1 personas$edad[1]
#> 2 instanciaAtributo       booleano personas     edad    2 personas$edad[2]
#> 3 instanciaAtributo       booleano personas     edad    3 personas$edad[3]
#>   resultado agregacion
#> 1         1       <NA>
#> 2         0       <NA>
#> 3         1       <NA>