La prueba de Kruskal-Wallis no es apropiada en este caso, porque se trata de un diseño que tiene una estructura similar a la de un análisis de varianza unidireccional (ANOVA). Además, aunque fuera apropiado, no aborda realmente los problemas teóricos de la distribución de estos datos mejor de lo que cabría esperar de un ANOVA.
Los modelos lineales pueden considerarse como una aproximación de primer orden al fenómeno subyacente que se está midiendo. Desde un punto de vista pragmático, una pregunta primordial es: "¿En qué medida el modelo se ajusta a los datos?". Las pruebas de significación estadística son razonablemente robustas bajo algunas desviaciones de los supuestos subyacentes.
En este caso, podría haber un problema si las respuestas a algunas de las hipótesis estuvieran correlacionadas negativamente. Al promediar (o sumar) las respuestas de cada sujeto, se asume implícitamente que todos miden lo mismo. Esto es muy razonable en este caso, pero merece la pena comprobarlo.
Un modelo lineal le dará más beneficios en términos de poder modelar con precisión su diseño, cuantificar las cosas y cortar los resultados. Por tanto, si un modelo lineal es una aproximación razonable, yo lo utilizaría. Hay otros métodos de modelización que podrían utilizarse aquí; sería reconfortante ver que coinciden con el modelo lineal elegido.
Estos son algunos de los enfoques que podría utilizar en R
. En primer lugar, voy a configurar algunos datos falsos totalmente al azar.
# Make up some data.
set.seed(123)
Relationship <- c("married", "single", "divorced", "dating", "widowed", "other1", "other2")
Hair <- c("blonde", "brunette", "redhead")
Situation <- c("W", "X", "Y", "Z")
Data <- data.frame(
ID = rep(1:100, each=4),
Relationship = rep(
sample(Relationship, size=100, replace=TRUE, prob=rep(1/7, 7)), each=4),
Hair = rep(sample(Hair, size=100, replace=TRUE, prob=rep(1/3, 3)), each=4),
Situation = rep(Situation, 100),
Value = sample(1:5, size=400, replace=TRUE, prob=rep(1/5, 5))
)
A continuación, observe el patrón de resultados:
# Plot the data to look for patterns in the response values.
library(reshape2)
Wide.Data <- dcast(Data, ID ~ Situation, value.var="Value")[, c("W", "X", "Y", "Z")]
# Get the correlation matrix.
cor(Wide.Data)
# Try a scatterplot matrix. Doesn't work too well. It would
# be nice to have a matrix mosaic plot. Still...
pairs(sapply(Wide.Data, jitter, amount=0.25))
# Look at the principal components.
pc <- princomp(Wide.Data)
summary(pc)
biplot(pc)
loadings(pc) ### To look at the simple factor loadings.
pc$scores ### If you wanted to use the scores.
# Tabulate each pair. May need to stare at the tables a while.
with(Wide.Data, table(W, X))
# ... Do the rest of the pairs the same way.
Aquí el objetivo es explorar en busca de relaciones obvias entre las respuestas. Hay muchos otros gráficos y resúmenes que sería bueno generar. El análisis de componentes principales podría darle una idea de si la dimensionalidad de las preguntas va a estar bien representada por un resumen unidimensional. Si las cargas en el primer componente son aproximadamente iguales y la varianza explicada por el primer componente es alta, entonces un promedio está bien apoyado.
A continuación, se observa el ajuste del modelo lineal. Un modelo que represente con exactitud el diseño tendría errores en las respuestas de cada sujeto correlacionados arbitrariamente con diferentes variabilidades:
# Fit an unstructured correlation matrix for measurements from the
# same subject. (Note that this depends critically on the sort order
# of the Situation items being the same for each subject. The safe way
# is to define a "Time" variable that gives correct order.)
library(nlme)
fit <- gls(
Value ~ Relationship * Hair * Situation,
correlation = corSymm(form = ~ 1 | ID),
weights = varIdent(form = ~ 1 | Situation),
data=Data
)
anova(fit, type="marginal")
Este modelo es bastante rico en parámetros y se pueden esperar problemas para ajustarlo. Además, está modelando en la granularidad del valor de respuesta individual, por lo que la aproximación del modelo lineal podría ser tenue. Pero, tal vez con suficientes datos no sería malo.
Un modelo más simple proporcionaría un simple efecto aleatorio para cada sujeto, lo que implica que todos los errores en los valores de respuesta de cada sujeto están igualmente (y positivamente) correlacionados:
# Fit a simpler model with a random effect for each subject.
fit <- lme(
Value ~ Relationship * Hair * Situation,
random = ~ 1 | ID,
data=Data
)
anova(fit, type="marginal")
Este modelo es bastante probable que funcione, pero de nuevo puede ser demasiado granular para ajustarse bien. Por último, se puede ajustar un modelo a algún resumen de los cuatro valores de respuesta (como la media, o alguna otra combinación):
# Compare with results from simply averaging the values.
library(plyr)
Mean.Data <- ddply(
Data,
.(ID, Relationship, Hair),
summarise,
Mean=mean(Value)
)
# Fit using the usual machinery.
library(car)
fit <- lm(Mean ~ Relationship * Hair, data=Mean.Data)
Anova(fit)
plot(fit)
summary(fit)
# Plot effects. Pair-wise contrasts. Et cetera. Et cetera.
Uno de estos dos últimos enfoques es probable que sea bastante bueno, si tienes una cantidad decente de datos. La interpretación de los resultados dependerá de la población y de la estrategia de muestreo.
Otras opciones para ajustar los datos:
- Realice el análisis de cada pregunta por separado (mejor hacer una media, si procede)
- Modelar los rangos utilizando enfoques modernos como nparLD o rlme
- Dicotomizar las respuestas y ajustar las regresiones binomiales
- Ajuste un modelo de efectos mixtos multinomiales (buena suerte, pero vea este puesto )
Estos enfoques tienden a perder información en diferentes grados, lo que cambia el tipo de conclusión que se puede reunir después de todo.