Exploramos los modelos de patrones para tres tipos de datos de preferencia:
Para cada caso: - Ajuste con pattL.fit,
pattPC.fit o pattR.fit. - Interpretación de
coeficientes en escala logarítmica (λ). - Conversión a worth‑parameters
y visualización.
Cada participante califica cinco estilos musicales (1 = “me gusta
mucho” a 5 = “no me gusta nada”). Covariable: sex (1 =
hombre, 2 = mujer).
df_ratings <- prefmod::music[, c("mood","regg","rap","hvym","conr","sex")]
kable(head(df_ratings), caption="Primeras filas de music5")| mood | regg | rap | hvym | conr | sex |
|---|---|---|---|---|---|
| 1 | 5 | 5 | 5 | 4 | 1 |
| 3 | 3 | 4 | 5 | 3 | 1 |
| 1 | 4 | 4 | 4 | 3 | 2 |
| 3 | 5 | 5 | 5 | 3 | 2 |
| 3 | NA | NA | NA | 5 | 2 |
| 2 | 3 | 3 | 5 | 3 | 1 |
##
## Results of pattern model for ratings
##
## Call:
## pattL.fit(obj = df_ratings, nitems = 5, formel = ~sex)
##
## Deviance: 1851.043
## log likelihood: -6982.435
## eliminated term(s): ~sex
##
## no of iterations: 24 (Code: 1 )
##
## estimate se z p-value
## mood 0.05640 0.02573 2.192 0.0284
## regg -0.23223 0.02519 -9.219 0.0000
## rap -0.56284 0.02718 -20.708 0.0000
## hvym -0.56745 0.02732 -20.770 0.0000
## mood:sex2 0.03543 0.03440 1.030 0.3030
## regg:sex2 -0.00625 0.03332 -0.187 0.8517
## rap:sex2 0.03466 0.03425 1.012 0.3115
## hvym:sex2 -0.13737 0.03571 -3.847 0.0001
## U 0.63768 0.01235 51.634 0.0000
lam_r <- round(patt.worth(pattmus, outmat="lambda"), 3)
colnames(lam_r) <- c("male","female")
kable(lam_r, caption="Log-habilidades (λ) por sexo")| male | female | |
|---|---|---|
| mood | 0.056 | 0.092 |
| regg | -0.232 | -0.238 |
| rap | -0.563 | -0.528 |
| hvym | -0.567 | -0.705 |
| conr | 0.000 | 0.000 |
worth_r <- patt.worth(pattmus)
colnames(worth_r) <- c("male","female")
plot(worth_r, main="Preferencias Musicales por Sexo")En el modelo de calificaciones (pattL.fit), cada
parámetro λᵢ mide el log-odds de que un estilo
musical sea preferido (reciba calificaciones bajas) en comparación con
la categoría de referencia (conr).
mood = 0.056) indica que ese estilo tiene una probabilidad
mayor que 0.5 de recibir calificaciones de “gusta”.rap = −0.563) significa menor probabilidad de “gusta”
comparado con la referencia.El parámetro U = 0.638 (p < .001) nos dice que hay una fuerte tendencia de los participantes a asignar la misma calificación a varios estilos (muchos “empates” en la escala).
Las interacciones estilo:sex2 muestran cómo cambia la
preferencia en mujeres (sex2) respecto a hombres
(sex1):
hvym:sex2 = −0.137 (p < .001) significa que las
mujeres tienen aún menor propensión a “gustar” el heavy
metal que los hombres.Para cuantificar cuánto más prefiere un estilo un género sobre el otro, podemos:
# Extraer lambdas por género
lam <- patt.worth(pattmus, outmat="lambda")
colnames(lam) <- c("male","female")
# 1. Odds relativas
alpha <- exp(lam)
# 2. Odds ratio Female vs Male
or_df <- data.frame(
Style = rownames(alpha),
OR_Female_Male = round(alpha[,"female"] / alpha[,"male"], 3)
)
knitr::kable(or_df, caption="Odds Ratio (Female vs Male) por estilo")| Style | OR_Female_Male | |
|---|---|---|
| mood | mood | 1.036 |
| regg | regg | 0.994 |
| rap | rap | 1.035 |
| hvym | hvym | 0.872 |
| conr | conr | 1.000 |
# 3. Probabilidades de preferencia por género
prob_df <- data.frame(
Style = rownames(alpha),
P_male = round(alpha[,"male"] / (1 + alpha[,"male"]), 3),
P_female = round(alpha[,"female"] / (1 + alpha[,"female"]), 3)
)
knitr::kable(prob_df, caption="Probabilidad de 'gustar' por género y estilo")| Style | P_male | P_female | |
|---|---|---|---|
| mood | mood | 0.514 | 0.523 |
| regg | regg | 0.442 | 0.441 |
| rap | rap | 0.363 | 0.371 |
| hvym | hvym | 0.362 | 0.331 |
| conr | conr | 0.500 | 0.500 |
La odds ratio compara la probabilidad relativa de que mujeres prefieran un estilo musical respecto a los hombres. Una OR mayor a 1 indica mayor preferencia en mujeres; menor a 1 indica menor preferencia.
El estilo con mayor diferencia significativa es heavy metal, siendo menos preferido por las mujeres.
La probabilidad estimada de que cada género prefiera un estilo musical (i.e., le dé calificaciones bajas, indicando gusto):
| Estilo | Hombres | Mujeres |
|---|---|---|
| mood | 0.514 | 0.523 |
| regg | 0.442 | 0.441 |
| rap | 0.363 | 0.371 |
| hvym | 0.362 | 0.331 |
| conr | 0.500 | 0.500 |
El modelo log-lineal evidencia patrones de preferencia musical
similares entre géneros, con diferencia destacada en heavy
metal, donde las mujeres presentan menor afinidad. Esta
diferencia también se refleja en la interacción significativa
hvym:sex2 del modelo.
library(ggplot2)
library(tidyr)
library(dplyr)
# Reestructurar los datos para graficar
prob_long <- pivot_longer(prob_df, cols = c("P_male", "P_female"),
names_to = "Gender", values_to = "Probability") |>
mutate(Gender = ifelse(Gender == "P_male", "Hombres", "Mujeres"))
# Gráfico de barras
ggplot(prob_long, aes(x = Style, y = Probability, fill = Gender)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Probabilidad de Preferencia por Género y Estilo Musical",
x = "Estilo Musical", y = "Probabilidad de 'Gustar'") +
theme_minimal(base_size = 13) +
scale_fill_brewer(palette = "Set1") +
ylim(0, 0.5)| pc1_2 | pc1_3 | pc2_3 | pc1_4 | pc2_4 | pc3_4 | pc1_5 | pc2_5 | pc3_5 | pc4_5 | sex |
|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 2 | 2 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
| 2 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 1 |
| 0 | 0 | 2 | 2 | 2 | 2 | 0 | 0 | 0 | 0 | 1 |
| 2 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 2 | 2 |
| 1 | 2 | 2 | 2 | 2 | 0 | 2 | 2 | 2 | 2 | 1 |
pattemo <- pattPC.fit(
df_pc,
nitems = 5,
formel = ~ sex,
obj.names = c("enjoyment","pride","anger","anxiety","boredom")
)
print(pattemo)##
## Results of pattern model for paired comparison
##
## Call:
## pattPC.fit(obj = df_pc, nitems = 5, formel = ~sex, obj.names = c("enjoyment",
## "pride", "anger", "anxiety", "boredom"))
##
## Deviance: 1128.128
## log likelihood: -994.0773
## eliminated term(s): ~sex
##
## no of iterations: 20 (Code: 1 )
##
## estimate se z p-value
## enjoyment -0.03143 0.10237 -0.307 0.7588
## pride 0.27615 0.10435 2.646 0.0081
## anger 0.14168 0.10278 1.379 0.1679
## anxiety -0.28450 0.10502 -2.709 0.0067
## enjoyment:sex2 0.15310 0.13377 1.145 0.2522
## pride:sex2 0.46263 0.13917 3.324 0.0009
## anger:sex2 0.28106 0.13468 2.087 0.0369
## anxiety:sex2 0.61195 0.13605 4.498 0.0000
## U -1.44182 0.10070 -14.318 0.0000
lam_pc <- round(patt.worth(pattemo, outmat="lambda"), 3)
colnames(lam_pc) <- c("male","female")
kable(lam_pc, caption="Log-habilidades (λ) por sexo")| male | female | |
|---|---|---|
| enjoyment | -0.031 | 0.122 |
| pride | 0.276 | 0.739 |
| anger | 0.142 | 0.423 |
| anxiety | -0.285 | 0.327 |
| boredom | 0.000 | 0.000 |
worth_pc <- patt.worth(pattemo)
colnames(worth_pc) <- c("male","female")
plot(worth_pc, main="Emociones de Logro por Sexo")0: la primera emoción fue más dominante.2: la segunda emoción fue más dominante.1: no hubo decisión (empate).pattPC.fitLas mujeres tienden a reportar con más frecuencia emociones activas y negativas como ansiedad
| price | exterior | brand | tech.equip | country | interior | age |
|---|---|---|---|---|---|---|
| 3 | 2 | 5 | 6 | 4 | 1 | 1 |
| 4 | 1 | 5 | 2 | 6 | 3 | 3 |
| 6 | 3 | 2 | 5 | 4 | 1 | 2 |
| 1 | 4 | 2 | 3 | 6 | 5 | 3 |
| NA | 2 | 4 | NA | 3 | 1 | 2 |
| NA | 2 | 4 | 3 | NA | 1 | 1 |
##
## Results of pattern model for rankings
##
## Call:
## pattR.fit(obj = carconf1, nitems = 6, formel = ~age)
##
## Deviance: 1772.935
## log likelihood: -2642.14
## eliminated term(s): ~age
##
## no of iterations: 38 (Code: 1 )
##
## estimate se z p-value
## price -0.11658 0.02949 -3.953 0.0001
## exterior 0.03656 0.02948 1.240 0.2150
## brand 0.02036 0.02930 0.695 0.4871
## tech.equip -0.04360 0.02906 -1.500 0.1336
## country -0.26050 0.03255 -8.003 0.0000
## price:age2 0.07488 0.04499 1.664 0.0961
## exterior:age2 0.01337 0.04521 0.296 0.7672
## brand:age2 -0.02031 0.04476 -0.454 0.6498
## tech.equip:age2 0.03947 0.04469 0.883 0.3772
## country:age2 0.09782 0.04837 2.022 0.0432
## price:age3 0.12133 0.04629 2.621 0.0088
## exterior:age3 0.04558 0.04653 0.979 0.3276
## brand:age3 0.02727 0.04595 0.593 0.5532
## tech.equip:age3 0.15565 0.04670 3.333 0.0009
## country:age3 0.06621 0.05138 1.289 0.1974
lam_car <- round(patt.worth(pattcar, outmat="lambda"), 3)
colnames(lam_car) <- c("17-29","30-49","50+")
kable(lam_car, caption="Log-habilidades (λ) por grupo de edad")| 17-29 | 30-49 | 50+ | |
|---|---|---|---|
| price | -0.117 | -0.042 | 0.005 |
| exterior | 0.037 | 0.050 | 0.082 |
| brand | 0.020 | 0.000 | 0.048 |
| tech.equip | -0.044 | -0.004 | 0.112 |
| country | -0.261 | -0.163 | -0.194 |
| interior | 0.000 | 0.000 | 0.000 |
worth_car <- patt.worth(pattcar)
colnames(worth_car) <- c("17-29","30-49","50+")
plot(worth_car, main="Calificaciones de Automóvil por Edad")interior es la referencia.exterior y brand tienen valores positivos:
son ligeramente más importantes que el interior.country y price tienen coeficientes
negativos: son menos importantes.country = -0.261 (p < .001) es la característica
menos valorada.country y el
price, aunque no todos los cambios son significativos.tech.equip (λ = 0.112) y price.A medida que las personas envejecen: - Aumenta la importancia del precio y la tecnología. - Disminuye el foco en el país de origen. - El diseño interior se mantiene estable como punto de referencia.
# Odds relativos (alpha)
alpha_car <- exp(lam_car)
# Calcular probabilidades
prob_car <- round(alpha_car / (1 + alpha_car), 3)
# Mostrar tabla
prob_df <- as.data.frame(prob_car)
prob_df$Style <- rownames(prob_car)
prob_df <- prob_df[, c("Style", "17-29", "30-49", "50+")]
knitr::kable(prob_df, caption = "Probabilidad de preferencia por grupo de edad")| Style | 17-29 | 30-49 | 50+ | |
|---|---|---|---|---|
| price | price | 0.471 | 0.490 | 0.501 |
| exterior | exterior | 0.509 | 0.512 | 0.520 |
| brand | brand | 0.505 | 0.500 | 0.512 |
| tech.equip | tech.equip | 0.489 | 0.499 | 0.528 |
| country | country | 0.435 | 0.459 | 0.452 |
| interior | interior | 0.500 | 0.500 | 0.500 |
library(tidyr)
library(dplyr)
library(ggplot2)
# Transformar para graficar
prob_long <- pivot_longer(prob_df, cols = c("17-29", "30-49", "50+"),
names_to = "Edad", values_to = "Probabilidad")
# Gráfico de barras
ggplot(prob_long, aes(x = Style, y = Probabilidad, fill = Edad)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Probabilidad de Preferencia por Característica del Automóvil",
x = "Característica", y = "Probabilidad estimada") +
theme_minimal(base_size = 13) +
scale_fill_brewer(palette = "Set2")