Tengo 15 variables nominales (no ordenadas), y todas ellas tienen más de 2 categorías. He utilizado la V de Cramer para obtener una matriz de correlación. Ahora quiero crear variables nominales correlacionadas mediante las distribuciones marginales y la matriz de correlación. La mayoría de las respuestas que he visto se basan en la correlación de Pearson, o en el uso del método de la cópula asumiendo distribuciones normales u otras. Pero el coeficiente de Pearson no se puede utilizar aquí ya que todas las variables son nominales, y no creo que pueda utilizar el supuesto de distribución normal. ¿Existe una solución más general?
Respuesta
¿Demasiados anuncios?No sé cómo usarías la de Cramer $V$ para hacer esto. Supongo que hay alguna forma elegante de generar esos datos, pero no la conozco. Lo que sí puedo hacer es darte un método sencillo de retroceso.
Si puede estipular la probabilidad conjunta de cada combinación de niveles de sus variables categóricas (es decir, la probabilidad de que una observación caiga en la combinación de nivel $i$ de la variable 1, nivel $j$ de la variable 2, nivel $k$ de la variable 3, etc., para todos los niveles de todas las variables), puede simplemente extraer variantes aleatorias de un uniforme estándar y comparar ese valor con el conjunto ordenado de probabilidades para determinar en qué celda debe estar. Tenga en cuenta que si quiere crearlas individualmente a mano, podría llevarle un tiempo: por ejemplo, con quince variables con tres niveles cada una, eso es $3^{15} = 14,\!348,\!907$ probabilidades individuales que habría que especificar. Si tienes un conjunto de datos cuyas proporciones quieres que sirvan de plantilla para las probabilidades, puedes escribir un código sencillo que lo haga por ti. En cualquier caso, eso equivale a haber especificado exactamente la estructura correlacional de la población.
Para demostrarlo, considere una situación más sencilla con sólo dos variables categóricas con tres niveles cada una. Aquí creo una simulación sencilla (codificada en R):
##### Here are the joint probabilities I want to use:
# y
# x A B C
# a 0.13 0.18 0.11
# b 0.02 0.11 0.11
# c 0.18 0.05 0.11
##### here they are in a single row vector:
probs = c(0.13, 0.18, 0.11, 0.02, 0.11, 0.11, 0.18, 0.05, 0.11)
cum.probs = c(0, cumsum(probs)) # notice I put a 0 at the beginning
cum.probs
# [1] 0.00 0.13 0.31 0.42 0.44 0.55 0.66 0.84 0.89 1.00
set.seed(8982) # this makes the example exactly reproducible
vals = runif(500) # generate 500 random values / probabilities
##### cut the random uniform values into cell categories:
cats = cut(vals, breaks=cum.probs,
labels=c("aA","aB","aC","bA","bB","bC", "cA", "cB", "cC"))
low = substr(cats, start=1, stop=1) # extract the 1st letter
up = substr(cats, start=2, stop=2) # extract the 2nd letter
##### these are the observed counts:
table(low, up)
# up
# low A B C
# a 68 98 54
# b 7 47 67
# c 77 25 57
##### this is a reasonable match to the population pattern specified:
prop.table(table(low, up))
# up
# low A B C
# a 0.136 0.196 0.108
# b 0.014 0.094 0.134
# c 0.154 0.050 0.114
Ahora bien, ¿qué pasaría si tuvieras datos y quisieras utilizar esas proporciones en lugar de especificar más de 14 millones de combinaciones a mano? Entonces sólo tienes que obtener las proporciones de tu conjunto de datos y ponerlas en un único vector. Por ejemplo, así:
props = as.vector(t(prop.table(table(low, up))))
props
# [1] 0.136 0.196 0.108 0.014 0.094 0.134 0.154 0.050 0.114