Capítulo 6 Introducción a sdcMicro
6.1 Introducción
El paquete R
sdcMicro
Templ, Kowarik, and Meindl (2015) sirve para evaluar y anonimizar conjuntos de microdatos confidenciales, facilita el manejo de métodos SDC mediante una implementación de clase S4 orientada a objetos. Incluye todos los métodos populares de perturbación y riesgo de divulgación. El paquete realiza un nuevo cálculo automático de recuentos de frecuencia, medidas de riesgo individuales y globales, pérdida de información y estadísticas de utilidad de datos después de cada paso de anonimización. Todos los métodos están altamente optimizados en términos de costos computacionales para poder trabajar con grandes conjuntos de datos. Los profesionales también pueden utilizar fácilmente las funciones de generación de informes que resumen el proceso de anonimización. Describimos el paquete y demostramos su funcionalidad con un complejo conjunto de datos de prueba procedente de encuestas de hogares, que ha sido distribuido por la Red Internacional de Encuestas de Hogares.
Para más información ver https://cran.r-project.org/web/packages/sdcMicro/sdcMicro.pdf
6.2 Instalación de R
, sdcMicro
y otros paquetes
Esta guía se basa en el paquete de software sdcMicro
, que es un paquete adicional para el lenguaje de programación estadístico R
. Tanto R
como sdcMicro
, así como otros paquetes de R
, están disponibles gratuitamente en el sitio web de CRAN (Comprehensive R Archive Network) para Linux, Mac y Windows (http://cran.r-project.org ). Este sitio web también ofrece descripciones de paquetes. Además de la versión estándar de R
, existe una interfaz de usuario más fácil de usar para R
: RStudio. RStudio también está disponible gratuitamente para Linux, Mac y Windows (http://www.rstudio.com ). El paquete sdcMicro
tiene dependencia de otros paquetes R
que deben instalarse en su computadora antes de usar sdcMicro
. Se instalarán automáticamente al instalar sdcMicro
. Para algunas funcionalidades, usamos otros paquetes (como foreign
para leer datos y algunos paquetes gráficos). Si es así, esto se indica en la sección correspondiente de esta guía. R
, RStudio, el paquete sdcMicro
y sus dependencias y otros paquetes tienen actualizaciones periódicas. Se recomienda encarecidamente comprobar periódicamente si hay actualizaciones: esto requiere instalar una nueva versión para una actualización de R
; con el comando update.packages()
o usando las opciones de menú en R
o RStudio se pueden actualizar los paquetes instalados.
Al iniciar R
o RStudio, es necesario especificar cada vez qué paquetes se están utilizando cargándolos. Esta carga de paquetes se puede realizar con la función library()
o require()
. Ambas opciones se ilustran en el Bloque 6.1.
Bloque 6.1 Cargando paquetes requeridos
library(sdcMicro) # cargando paquete sdcMicro
require(sdcMicro) # cargando paquete sdcMicro
Todos los paquetes y funciones están documentados. La forma más fácil de acceder a la documentación de una función específica es usar la ayuda integrada, que generalmente brinda una descripción general de los parámetros de las funciones, así como algunos ejemplos. La ayuda de una función específica se puede llamar con un signo de interrogación seguido del nombre de la función sin ningún argumento. El Bloque 6.2 muestra cómo llamar al archivo de ayuda para la función microaggregation()
del paquete sdcMicro
3. La página de descarga de cada paquete en el sitio web de CRAN también proporciona un manual de referencia con una descripción completa de las funciones del paquete.
Bloque 6.2 Visualización de ayuda para funciones
# ayuda para la función microagregación ?microaggregation
Cuando se encuentran problemas o errores en el paquete sdcMicro
, se pueden publicar comentarios o sugerencias para los desarrolladores de sdcMicro
en su GitHub (https://github.com/sdcTools/sdcMicro/issues).
6.3 Leer funciones en R
El primer paso en el proceso SDC cuando se usa sdcMicro
es leer los datos en R
y crear un marco de datos4 R
es compatible con la mayoría de los formatos de datos estadísticos y proporciona funciones de lectura para la mayoría de los tipos de datos. Para esas funciones de lectura, a veces es necesario instalar paquetes adicionales y sus dependencias en R
. En la Tabla 6.1 se proporciona una descripción general de los formatos de datos, las funciones y los paquetes que contienen estas funciones . Estas funciones también están disponibles como escritura (por ejemplo, write_dta()
) para guardar los datos anónimos en el formato requerido 5.
Tipo/software | Extensión | Paquete | Función |
---|---|---|---|
SPSS | .sav |
haven
|
read_sav()
|
STATA (v.5-14) | .dta |
haven
|
read_dta()
|
SAS | .sas7bdat |
haven
|
read_sas()
|
Excel | .csv |
utils (paquete base)
|
read_csv()
|
Excel | .xls/.xlsx |
readxl
|
read_xlsx()
|
La mayoría de estas funciones tienen opciones que especifican cómo manejar los valores faltantes y las variables con niveles de factor y etiquetas de valor. El Bloque 6.3, el Bloque 6.4 y el Bloque 6.5 proporcionan código de ejemplo para leer un archivo STATA (.dta), un archivo de valores separados por ; (.csv) y un archivo SPSS (.sav), respectivamente.
Bloque 6.3 Lectura en un archivo STATA
setwd("../Capacitación/GitHub") # directorio de trabajo
= "data.dta" # nombre del archivo
fname library(haven) # carga el paquete requerido para la función de lectura/escritura
# para archivos STATA
<- read_dta(fname)
file # lee los datos en el marco de datos tbl llamado file
Bloque 6.4 Lectura en un archivo csv
setwd("../Capacitación/GitHub") # directorio
# de
# trabajo
= "data.csv" # nombre del archivo
fname <- read.csv(fname, header = TRUE, sep = ";", dec = ".")
file # lee los datos hacia un dataframe llamado file,
# la primera línea contiene los nombres de las variables,
# campos son separados con comas, posiciones decimales se indican con ‘;’
Bloque 6.5 Lectura en un archivo SPSS
setwd("../Capacitación/GitHub") # directorio
# de
# trabajo
= "data.sav" # nombre del archivo
fname library(haven) # carga paquete requerido para la función lectura/escritura
# para archivos SPSS
<- read_sav(fname)
file # lee los datos hacia un dataframe llamado file
El tamaño máximo de datos en R
está técnicamente restringido. El tamaño máximo depende de la versión R
(32 o 64 bits) y del sistema operativo. Algunos métodos SDC requieren largos tiempos de cálculo para grandes conjuntos de datos (consulte la Sección Tiempo de cómputo).
6.4 Valores faltantes
La forma estándar en que los valores faltantes se representan en R
es mediante el símbolo NA
, que es diferente a los valores imposibles, como la división por cero o el logaritmo de un número negativo, que se representan con el símbolo NaN
. El valor NA
se usa tanto para variables numéricas como categóricas6. Los valores suprimidos por la rutina localSuppression()
también se reemplazan por el símbolo NA
. Algunos conjuntos de datos y software estadístico pueden usar diferentes valores para los valores faltantes, como ‘999’ o cadenas. Es posible incluir argumentos en las funciones de lectura para especificar cómo se deben tratar los valores faltantes en el conjunto de datos y recodificar automáticamente los valores faltantes a NA
. Por ejemplo, la función read.table()
tiene el argumento na.strings
, que reemplaza las cadenas especificadas con valores NA
.
Los valores faltantes también se pueden recodificar después de leer los datos en R
. Esto puede ser necesario si hay varios códigos de valores perdidos diferentes en los datos, códigos de valores perdidos diferentes para diferentes variables o la función de lectura para el tipo de datos no permite especificar los códigos de valores perdidos. Al preparar los datos, es importante volver a codificar cualquier valor faltante que no esté codificado como NA
a NA
en R
antes de iniciar el proceso de anonimización para garantizar la medición correcta del riesgo (por ejemplo, k-anonimato), así como para asegurar que muchos de los métodos se aplican correctamente a los datos. El Bloque 6.6 muestra cómo recodificar el valor ‘99’ a NA
para la variable “TOILET”.
Bloque 6.6 Recodificación de valores perdidos a NA
'TOILET'] == 99,'TOILET'] <- NA
file[file[,# Recodificar el código de valor faltante 99 a NA para la variable TOILET
6.5 Clases en R
Todos los objetos en R
son de una clase específica, como un número entero, un carácter, una matriz, un factor o un marco de datos. La clase de un objeto es un atributo que hereda de la clase base, haciéndolo miembro e instancia de esta clase. Para averiguar la clase de un objeto, se puede utilizar la función class()
. Las funciones en R
pueden requerir objetos o argumentos de ciertas clases o funciones que pueden tener una funcionalidad diferente según la clase del argumento. Algunos ejemplos son las funciones de escritura que requieren marcos de datos y la mayoría de las funciones en el paquete sdcMicro
que requieren marcos de datos u objetos sdcMicro
. La funcionalidad de las funciones en el paquete sdcMicro
difiere para marcos de datos y objetos sdcMicro
. Es fácil cambiar el atributo de clase de un objeto con funciones que comienzan con “as.”, seguido del nombre de la clase (por ejemplo, as.factor()
, as.matrix()
, as.data.frame()
). El Bloque 6.7 muestra cómo verificar la clase de un objeto y cambiar la clase a “data.frame”. Antes de cambiar el atributo de clase del objeto “file”, estaba en la clase “matrix”. Una clase importante definida y utilizada en el paquete sdcMicro
es la clase denominada sdcMicroObj
. Esta clase se describe en la siguiente sección.
Bloque 6.7 Cambiando la clase de un objeto en R
# Averiguar la clase del objeto 'file'
class(file)
"matrix"
# Cambiar la clase al marco de datos (data frame)
<- as.data.frame(file)
file
# Comprobando la clase del resultado (file)
"data.frame"
6.6 Objetos de la clase sdcMicroObj
El paquete sdcMicro
se basa en objetos 7 de la clase sdcMicroObj
, una clase especialmente definida para el paquete sdcMicro
. Cada componente de esta clase tiene una estructura determinada con elementos que contienen información sobre el proceso de anonimización (consulte la Tabla 6.2 para obtener una descripción de todos los elementos o propiedades (slots, en inglés)). Antes de evaluar el riesgo y la utilidad y aplicar métodos SDC, se recomienda crear un objeto de clase sdcMicro
. Todos los ejemplos de esta guía se basan en estos objetos. La función utilizada para crear un objeto sdcMicro
es createSdcObj()
. La mayoría de las funciones en el paquete sdcMicro
, como microaggregation()
o localSuppression()
, usan automáticamente la información requerida (por ejemplo, identificadores indirectos, pesos de muestra) del objeto sdcMicro
si se aplica a un objeto de clase sdcMicro
.
Los argumentos de la función createSdcObj()
permiten especificar el archivo de datos original y categorizar las variables en este archivo de datos antes del inicio del proceso de anonimización.
En el Bloque 6.8, mostramos todos los argumentos de la función createSdcObj()
, y primero definimos vectores con los nombres de las diferentes variables. Esta práctica brinda una mejor visión general y luego permite cambios rápidos en las opciones de variables si es necesario. Elegimos los identificadores indirectos categóricos (keyVars); las variables vinculadas a los identificadores indirectos categóricos que necesitan el mismo patrón de supresión (ghostVars, consulte la sección Supresión local); los identificadores indirectos numéricos (numVars); las variables seleccionadas para aplicar PRAM (pramVars); una variable con pesos muestrales (weightVar); el identificador de agrupación (hhId, por ejemplo, un identificador de hogar, consulte la sección Riesgo jerárquico (o del hogar)); una variable que especifica los estratos (strataVar) y las variables sensibles especificadas para el cálculo de l-diversity (sensibleVar, consulte la sección l-diversity).
La mayoría de los métodos SDC en el paquete sdcMicro
se aplican automáticamente dentro de los estratos, si se especifica el argumento ‘strataVar’.
Los ejemplos son la supresión local y PRAM. No se deben especificar todas las variables, por ejemplo, si no hay una estructura jerárquica (hogar), se puede omitir el argumento ‘hhId’. Los nombres de las variables corresponden a los nombres de las variables en el marco de datos que contiene los microdatos a anonimizar. La selección de variables es importante para las medidas de riesgo que se calculan automáticamente. Además, varios métodos se aplican por defecto a todas las variables de un tipo, por ejemplo, microagregación a todas las variables clave 8. Después de seleccionar estas variables, podemos crear el objeto sdcMicro. Para obtener un resumen del objeto, es suficiente escribir el nombre del objeto.
Bloque 6.8 Seleccionando variables y creando un objeto de clase sdcMicroObj
para el proceso SDC en R
# Seleccionar variables para crear objeto sdcMicro
# Selección de variables categóricas
<- c('URBRUR', 'REGION', 'HHSIZE')
selectedKeyVars
# Variables clave continuas
<- c('TANHHEXP', 'INCTOTGROSSHH')
selectedNumVar
# PRAM variables
<- c('ROOF', 'TOILET', 'WATER', 'ELECTCON',
selectedPramVars 'FUELCOOK', 'OWNMOTORCYCLE', 'CAR', 'TV', 'LIVESTOCK')
# Peso del hogar
<- c('WGTPOP')
selectedWeightVar
# Creando el objeto sdcMicro con las variables asignadas
<- createSdcObj(dat = file,
sdcInitial keyVars = selectedKeyVars,
numVar = selectedNumVar,
weightVar = selectedWeightVar,
pramVars = selectedPramVars)
# Resumen del objeto
sdcInitial
## ---------------------------------------------------------------------------
La Tabla 6.2 presenta los nombres de los elementos y sus respectivos contenidos. Los nombres de los elementos se pueden listar usando la función slotNames()
, que se ilustra en el Bloque 6.9. Algunos espacios se llenan solo después de aplicar ciertos métodos, por ejemplo, evaluar una medida de riesgo específica. Se puede acceder a ciertos elementos de los objetos mediante funciones de acceso (por ejemplo, extractManipData
para extraer los datos anónimos) o funciones de impresión (por ejemplo, print()
) con los argumentos apropiados. También se puede acceder directamente al contenido de un espacio con el operador ‘@’ y el nombre del espacio. Esto se ilustra para el elemento o atributo de riesgo en el Bloque 6.9. Esta funcionalidad puede ser práctica para guardar resultados intermedios y comparar los resultados de diferentes métodos. Además, para cambios manuales en los datos durante el proceso SDC, como cambiar códigos de valores faltantes o recodificación manual, es útil el acceso directo de los datos en los elementos o propiedades con los datos manipulados (es decir, nombres de elemento que comienzan con ‘manip’). Dentro de cada elemento generalmente hay varios elementos. Sus nombres se pueden mostrar con la función names()
y se puede acceder a ellos con el operador ‘$’. Esto se muestra para el elemento con el riesgo individual en el elemento de riesgo.
Bloque 6.9 Visualización de nombres de elementos o propiedades y acceso a elementos o propiedades de un objeto S4
# Lista de todos los slots de objeto sdcMicro
slotNames(sdcInitial)
# Accediendo al slot de riesgos
@risk
sdcInitial
# Lista de nombres dentro del slot de riesgo
names(sdcInitial@risk)
## [1] "global" "individual" "numeric"
# Dos formas de acceder al riesgo individual dentro del slot de riesgo
@risk$individual
sdcInitialget.sdcMicroObj(sdcInitial, "risk")$individual
Nombre de elemento | Contenido |
---|---|
origData
|
datos originales como se especifica en el argumento dat de la función createSdcObj() .
|
keyVars
|
índices de columnas en origData con variables clave categóricas especificadas.
|
pramVars
|
índices de columnas en origData con variables PRAM especificadas.
|
numVars
|
índices de columnas en origData con variables clave numéricas especificadas.
|
ghostVars
|
índices de columnas en origData con ghostVars especificados.
|
weightVar
|
índices de columnas en origData con variable de peso especificada.
|
hhId
|
índices de columnas en origData con variable de clúster especificada.
|
strataVar
|
índices de columnas en origData con variable de estratos especificada.
|
sensibleVar
|
índices de columnas en origData con variables sensibles especificadas para l-diversity.
|
manipKeyVars
|
variables clave categóricas manipuladas después de aplicar métodos SDC (ver elemento keyVars ).
|
manipPramVars
|
variables PRAM manipuladas después de aplicar PRAM (ver elemento pramVars ).
|
manipNumVar
|
variables clave numéricas manipuladas después de aplicar métodos SDC (ver elemento numVars ).
|
manipGhostVars
|
variables fantasma manipuladas (ver elemento ghostVars ).
|
manipStrataVar
|
variables de estratos manipulados (ver elemento strataVar ).
|
originalRisk
|
medidas de riesgo globales e individuales antes de la anonimización. |
risk
|
medidas de riesgo global e individual después de la aplicación de métodos SDC. |
utility
|
medidas de utilidad (il1 y eigen). |
pram
|
detalles sobre PRAM después de aplicar PRAM. |
localSuppression
|
número de supresión por variable después de la supresión local. |
options
|
opciones especificadas. |
additionalResults
|
resultados adicionales. |
set
|
lista de elemento actualmente en uso (para uso interno). |
prev
|
información para deshacer un paso con la función undo() .
|
deletedVars
|
variables eliminadas (identificadores directos). |
Hay dos opciones para guardar los resultados después de aplicar los métodos SDC:
- Sobrescribir el objeto
sdcMicro
existente, o - creando un nuevo objeto
sdcMicro
. El objeto original no se modificará y se puede utilizar para comparar resultados. Esto es especialmente útil para comparar varios métodos y seleccionar la mejor opción.
En ambos casos, el resultado de cualquier función debe reasignarse a un objeto con el operador ‘<-’. Ambos métodos se ilustran en el Bloque 6.10.
Bloque 6.10 Guardado de resultados de la aplicación de métodos SDC
# Aplicar supresión local y reasignar los resultados al mismo objeto sdcMicro
<- localSuppression(sdcInitial)
sdcInitial
# Aplicar supresión local y asignar los resultados a un nuevo objeto sdcMicro
<- localSuppression(sdcInitial) sdc1
Si los resultados se reasignan al mismo objeto sdcMicro, es posible deshacer el último paso del proceso SDC. Esto es útil al cambiar los parámetros. Sin embargo, los resultados del último paso se pierden después de deshacer ese paso.
La función undolast()
se puede usar para retroceder solo un paso, no varios. El resultado también debe ser reasignado al mismo objeto. Esto se ilustra en el Bloque 6.11.
Bloque 6.11 Deshacer último paso en proceso SDC
# Deshacer el último paso en el proceso SDC
<- undolast(sdcInitial) sdcInitial
6.7 Estructura del hogar
Si los datos tienen una estructura jerárquica y algunas variables se miden en el nivel jerárquico más alto y otras en el nivel más bajo, el proceso SDC debe adaptarse en consecuencia (véanse también la sección Riesgo jerárquico (o del hogar)). Un ejemplo común en los datos de encuestas sociales son los conjuntos de datos con una estructura de hogar. Las variables que se miden a nivel del hogar son, por ejemplo, los ingresos del hogar, el tipo de vivienda y la región. Las variables medidas a nivel individual son, por ejemplo, la edad, el nivel educativo y el estado civil. Algunas variables se miden a nivel individual, no obstante, son las mismas para todos los miembros del hogar en casi todos los hogares. Estas variables deben ser tratadas como medidas a nivel de hogar desde la perspectiva del SDC. Un ejemplo es la variable religión para algunos países.
El proceso SDC debe dividirse en dos etapas en los casos en que los datos tengan una estructura de hogar. Primero, las variables en el nivel superior (hogar) deben anonimizarse; posteriormente, las variables de nivel superior tratadas deben fusionarse con las variables individuales y anonimizarse conjuntamente. En esta sección, explicamos cómo extraer variables del hogar de un archivo y fusionarlas con las variables de niveles individuales después del tratamiento en R. Ilustramos este proceso con un ejemplo de variables a nivel individual y del hogar.
Estos pasos se ilustran en el Bloque 6.12. Requerimos una identificación individual y una identificación familiar en el conjunto de datos; si faltan, deben generarse. La identificación individual debe ser única para cada individuo en el conjunto de datos y la identificación del hogar debe ser única para todos los hogares. El primer paso es extraer las variables del hogar y guardarlas en un nuevo marco de datos. Especificamos las variables que se miden a nivel del hogar en el vector de cadena “HHVars” y restamos solo estas variables del conjunto de datos. Este marco de datos tendrá para cada hogar el mismo número de entradas que miembros del hogar (por ejemplo, si un hogar tiene cuatro miembros, este hogar aparecerá cuatro veces en el archivo). A continuación, aplicamos la función unique()
para seleccionar solo un registro por hogar. Este argumento de la función unique()
es la identificación del hogar, que es la misma para todos los miembros del hogar,
Bloque 6.12 Crear un archivo a nivel de hogar con registros únicos (eliminar duplicados) 9
# Crear subconjunto de archivo con solo variables medidas a nivel de hogar
<- c('IDH', selectedKeyVars, selectedPramVars, selectedNumVar, selectedWeightVar)
HHVars <- file[,HHVars]
fileHH
# Elimine las filas duplicadas en función de la identificación del hogar /
# solo cada hogar una vez en el fileHH
<- unique(fileHH, by = c('HID'))
fileHH
# Dimensiones del fileHH (número de hogares)
dim(fileHH)
Después de anonimizar las variables del hogar con base en el marco de datos “fileHH”, recombinamos las variables del hogar anonimizadas con las variables originales, que se miden a nivel individual. Podemos extraer las variables de nivel individual del conjunto de datos original usando “INDVars”, un vector de cadena con los nombres de las variables de nivel individual. Para extraer los datos anonimizados del objeto sdcMicro, podemos usar la función extractManipData()
del paquete sdcMicro
. A continuación, fusionamos los datos usando la función merge()
. El argumento ‘by’ en la función merge()
especifica la variable utilizada para la combinación; en este caso, la identificación del hogar, que tiene el mismo nombre de variable en ambos conjuntos de datos. Todas las demás variables deben tener nombres diferentes en ambos conjuntos de datos. Estos pasos se ilustran en Bloque 6.13.
Bloque 6.13 Fusión de variables anonimizadas a nivel de hogar con variables a nivel individual
# Crea objeto sdcMicro inicial para variables de nivel de hogar
<- createSdcObj(dat = fileHH, keyVars = selectedKeyVars,
sdcHH pramVars = selectedPramVars, weightVar = selectedWeightVar,
numVars = selectedNumVar)
<- length(fileHH[,1]) # número de hogares
numHH
# Extrae variables de nivel de hogar manipuladas del objeto SDC
<- extractManipData(sdcHH)
HHmanip
# Selecciona variables (nivel individual)
= c('GENDER', 'REL', 'MARITAL','AGEYRS',
selectedKeyVarsIND 'EDUCY', 'INDUSTRY1') # lista de variables clave seleccionadas
# Peso de la muestra (WGTHH, pesos individuales)
= c('WGTHH')
selectedWeightVarIND
# ID hogar
= c('IDH')
selectedHouseholdID
# Todas las variables individuales
<- c(selectedKeyVarsIND)
INDVars
# Recombinando los datos HH anonimizados y las variables a nivel individual
<- c("IDH", "IDP", selectedKeyVarsIND, "WGTHH") # IDH y todas las variantes no HH
indVars <- file[indVars] # subset de file sin HHVars
fileInd <- merge(HHmanip, fileInd, by.x = c('IDH'))
fileCombined <- fileCombined[order(fileCombined[,'IDH'], fileCombined[,'IDP']),]
fileCombined
dim(fileCombined)
# Objeto SDC con solo las variables a nivel IND
<- createSdcObj(dat = fileCombined, keyVars = c(selectedKeyVarsIND),
sdcCombined weightVar = selectedWeightVarIND, hhId = selectedHouseholdID)
# Objeto SDC con ambos niveles de variables, a HH y IND
<- createSdcObj(dat = fileCombined,
sdcCombinedAll keyVars = c(selectedKeyVarsIND, selectedKeyVars ),
weightVar = selectedWeightVarIND,
hhId = selectedHouseholdID)
sdcCombinedAll
El archivo fileCombined se utiliza para el proceso SDC con todo el conjunto de datos. En el estudio de casos de la sección Caso de estudio se ilustra cómo tratar los datos con la estructura del hogar.
El tamaño de un hogar también puede ser un identificador indirecto, incluso si el tamaño del hogar no está incluido en el conjunto de datos como variable. Con el fin de evaluar el riesgo de divulgación, podría ser necesario crear dicha variable mediante un recuento de los miembros de cada hogar. El Bloque 6.14 muestra cómo generar la variable de tamaño de hogar, con valores para cada individuo en función de la identificación del hogar (IDH). Se muestran dos casos: 1) el archivo ordenado por IDH y 2) el archivo no ordenado.
Bloque 6.14 Generando la variable tamaño del hogar
# Ordenado por IDH
$hhsize <- rep(unname(table(file$IDH)), unname(table(file$IDH)))
file
# Desordenado
$hhsize <- rep(diff(c(1, 1 + which(diff(file$IDH) != 0), length(file$IDH) + 1)),
filediff(c(1, 1 + which(diff(file$IDH) != 0), length(file$IDH) + 1)))
En algunos casos, el orden de las personas dentro de los hogares puede proporcionar información que podría conducir a la reidentificación.
Un ejemplo es la información sobre la relación con el jefe de hogar. En muchos países, el primer miembro del hogar es el cabeza de familia, el segundo es la pareja del cabeza de familia y los siguientes son los hijos. Por lo tanto, el número de línea dentro del hogar podría correlacionarse bien con una variable que contiene información sobre la relación con el jefe de hogar. Una forma de evitar esta divulgación involuntaria de información es cambiar el orden de los individuos dentro de cada hogar al azar. El Bloque 6.15 ilustra una manera de hacer esto en R.
Bloque 6.15 Cambiando el orden de los individuos dentro de los hogares
# Cargando datos anonimizados
<-readRDS("dataAnon.RDS")
dataAnon
# Lista de tamaños de hogar por hogar
<- diff(c(1, 1 + which(diff(dataAnon$IDH) != 0), length(dataAnon$IDH) + 1))
hhsize
# Números de línea asignados al azar dentro de cada hogar
set.seed(123)
$INDID <- unlist(lapply(hhsize,
dataAnonfunction(n){sample(1:n, n, replace = FALSE,
prob = rep(1/n, n))}))
# Ordene el archivo por IDH y INDID aleatorio (número de línea)
<- dataAnon[order(dataAnon$IDH, dataAnon$INDID),] dataAnon
6.8 Tiempo de cómputo
Algunos métodos SDC pueden tardar mucho tiempo en evaluarse en términos de cómputo. Por ejemplo, la supresión local con la función localSuppression()
del paquete sdcMicro
en R
puede tardar días en ejecutarse en grandes conjuntos de datos de más de 30.000 personas que tienen muchos identificadores indirectos categóricos. El uso de la función groupVars()
, por ejemplo, no es computacionalmente intensivo, pero aún puede llevar mucho tiempo si el conjunto de datos es grande y las medidas de riesgo deben volver a calcularse.
Nuestra experiencia revela que el tiempo de cómputo es una función de los siguientes factores: el método SDC aplicado; tamaño de los datos, es decir, número de observaciones, número de variables y número de categorías o niveles de factores de cada variable categórica; complejidad de los datos (por ejemplo, el número de diferentes combinaciones de valores de identificadores indirectos en los datos); así como las especificaciones de la computadora (procesador, la memoria RAM y los medios de almacenamiento).
El uso de la paralelización puede mejorar el rendimiento incluso en una sola computadora con un procesador con múltiples núcleos. R
no utiliza múltiples núcleos a menos que se le indique que lo haga. La paralelización permite que los trabajos/escenarios 10 en los conjuntos de datos puedan procesarse simultáneamente a través de la asignación eficiente de tareas a diferentes procesadores. Sin paralelización, dependiendo del servidor/computadora, solo se usa un núcleo cuando se ejecutan los trabajos secuencialmente. Ejecutar el programa de anonimización sin paralelización conduce a un tiempo de ejecución significativamente mayor. Sin embargo, tenga en cuenta que la paralelización en sí misma también provoca una sobrecarga. Por lo tanto, una suma de los tiempos que lleva ejecutar cada tarea en paralelo no equivale necesariamente al tiempo que puede llevar ejecutarlas secuencialmente. Sin embargo, el hecho de que la RAM se comparta podría reducir ligeramente las ganancias de la paralelización 11.
6.9 Errores comunes
En esta sección, presentamos algunos errores comunes y sus causas, que pueden encontrarse al usar el paquete sdcMicro
en R
para la anonimización de microdatos:
La clase de una determinada variable no es aceptada por la función, por ejemplo, una variable categórica de clase numérica debe recodificarse primero a la clase requerida (por ejemplo, factor o data.frame). En la sección Clases en
R
se muestra cómo hacerlo.Después de realizar cambios manualmente en las variables, el riesgo no cambió, ya que no se actualiza automáticamente y debe volver a calcularse manualmente mediante la función
calcRisks()
.
Referencias
A menudo, también es útil buscar ayuda en Internet sobre funciones específicas en
R
. Hay muchos foros donde los usuarios deR
discuten los problemas que encuentran. Un sitio particularmente útil es stackoverflow.com↩︎Un marco de datos es una clase de objeto en
R
, que es similar a una tabla o matriz de datos↩︎No todas las funciones son compatibles con todas las versiones del paquete de software respectivo. Nos referimos a los archivos de ayuda de las funciones de lectura y escritura para más información.↩︎
Esto es independientemente de la clase de la variable en
R
. Consulte la sección Clases enR
para obtener más información sobre las clases enR
.↩︎La clase
sdcMicroObj
tiene objetos S4, que tienen elementos o atributos y permiten la programación orientada a objetos.↩︎A menos que se especifique lo contrario en los argumentos de la función.↩︎
Se recomienda verificar que el objeto fileHH tenga después de la aplicación de la función
unique()
la cantidad de filas esperadas (ej.: N° de viviendas encuestadas) y que no haya valores perdidos no esperados.↩︎Aquí, un escenario se refiere a una combinación de métodos SDC y sus parámetros.↩︎
El siguiente sitio web proporciona una descripción general de los paquetes y soluciones de paralelización en
R
: http://cran.r-project.org/web/views/HighPerformanceComputing.html. ↩︎