5.2 Modelos Log‑Lineales de Preferencia

Exploramos los modelos de patrones para tres tipos de datos de preferencia:

  1. Calificaciones (ratings)
  2. Comparaciones pareadas (paired comparisons)
  3. Rankings parciales (partial rankings)

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.


5.2.1 Modelo de Patrones para Calificaciones

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")
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
pattmus <- pattL.fit(
  df_ratings,
  nitems = 5,
  formel = ~ sex
)
print(pattmus)
## 
## 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")
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")

Interpretación Detallada de Resultados (Rating Patterns)

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).

  • Un λ positivo (por ejemplo, mood = 0.056) indica que ese estilo tiene una probabilidad mayor que 0.5 de recibir calificaciones de “gusta”.
  • Un λ negativo (por ejemplo, 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.

Contraste de Preferencias entre Géneros

Para cuantificar cuánto más prefiere un estilo un género sobre el otro, podemos:

  1. Convertir λᵢ a odds relativas:
    \[ \alpha_{i,g} = e^{\lambda_{i,g}} \]
  2. Calcular la odds ratio entre mujeres (“female”) y hombres (“male”):
    \[ \text{OR}_i = \frac{\alpha_{i,\text{female}}}{\alpha_{i,\text{male}}} \]
  3. O bien, convertir directamente a probabilidades de “gusta” para cada género:
    \[ P_{i,g} = \frac{\alpha_{i,g}}{1 + \alpha_{i,g}} \]

Código para calcularlo en R

# 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")
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")
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

Interpretación de Resultados por Género y Estilo Musical

1. Odds Ratio (Mujeres vs Hombres)

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.

  • mood (easy listening): OR = 1.036 → Ligeramente más preferido por mujeres.
  • regg (reggae): OR = 0.994 → Preferencia prácticamente igual.
  • rap: OR = 1.035 → Ligeramente más preferido por mujeres.
  • hvym (heavy metal): OR = 0.872 → Notablemente menos preferido por mujeres.
  • conr (rock contemporáneo): OR = 1.000 (referencia).

El estilo con mayor diferencia significativa es heavy metal, siendo menos preferido por las mujeres.


2. Probabilidad Estimada de Preferencia

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
  • mood es el estilo más preferido por ambos géneros.
  • hvym es el estilo menos preferido por las mujeres.
  • Las diferencias por género son pequeñas, salvo en heavy metal.

✅ Conclusión General

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)


5.2.2 Modelo de Patrones para Comparaciones Pareadas

data("learnemo")
df_pc <- learnemo
kable(head(df_pc), caption="Primeras filas de learnemo")
Primeras filas de learnemo
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")
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")

Interpretación del Modelo de Comparaciones Pareadas

Significado de los valores en la base

  • 0: la primera emoción fue más dominante.
  • 2: la segunda emoción fue más dominante.
  • 1: no hubo decisión (empate).

Resultados del modelo pattPC.fit

  • Boredom es la emoción de referencia (λ = 0).
  • Pride (λ = 0.276) y anger (λ = 0.142) son más dominantes que boredom en hombres, aunque anger no es significativo.
  • Anxiety (λ = -0.285) es menos dominante que boredom en hombres.
  • El parámetro U = -1.441 sugiere que los participantes en general evitaron empates, es decir, mostraron decisiones claras entre emociones.

Diferencias por género (interacciones significativas)

  • Pride:sex2 = 0.463 (p < .001) → Las mujeres valoran más el orgullo que los hombres.
  • Anxiety:sex2 = 0.612 (p < .001) → Las mujeres reportan mucha más ansiedad.
  • Anger:sex2 = 0.281 (p < .05) → Las mujeres también presentan más ira.
  • Enjoyment:sex2 = 0.153 (n.s.) → No hay diferencia clara en disfrute.

Conclusión

Las mujeres tienden a reportar con más frecuencia emociones activas y negativas como ansiedad


5.2.3 Modelo de Patrones para Rankings Parciales

carconf1 <- carconf[, c(1:6, 8)]
kable(head(carconf1), caption="Primeras filas de carconf1")
Primeras filas de carconf1
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
pattcar <- pattR.fit(
  carconf1,
  nitems = 6,
  formel = ~ age
)
print(pattcar)
## 
## 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")
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")

🧾 Interpretación del Modelo de Rankings Parciales

Preferencias Generales (grupo de 17-29 años)

  • 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.

Cambios según edad

  • Grupo 30-49 años:
    • Prefieren un poco más el country y el price, aunque no todos los cambios son significativos.
  • Grupo 50+ años:
    • Se observa un aumento significativo en la preferencia por tech.equip (λ = 0.112) y price.
    • Se reduce la diferencia con el interior, sugiriendo que los mayores valoran más la funcionalidad (tecnología y precio).

Conclusión

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")
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")