¿Qué prueba puedo usar para comparar pendientes de dos o más modelos de regresión?

29

Me gustaría probar la diferencia en la respuesta de dos variables a un predictor. Aquí hay un ejemplo mínimo reproducible.

library(nlme) 
## gls is used in the application; lm would suffice for this example
m.set <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "setosa")
m.vir <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "virginica")
m.ver <- gls(Sepal.Length ~ Petal.Width, data = iris, 
               subset = Species == "versicolor")

Puedo ver que los coeficientes de la pendiente son diferentes:

m.set$coefficients
(Intercept) Petal.Width 
  4.7771775   0.9301727
m.vir$coefficients
(Intercept) Petal.Width 
  5.2694172   0.6508306 
m.ver$coefficients
(Intercept) Petal.Width 
   4.044640    1.426365 

Tengo tres preguntas:

  1. ¿Cómo puedo probar la diferencia entre pendientes?
  2. ¿Cómo puedo probar la diferencia entre las variaciones residuales?
  3. ¿Cuál es una manera simple y efectiva de presentar estas comparaciones?

Una pregunta relacionada, Método para comparar el coeficiente variable en dos modelos de regresión , sugiere volver a ejecutar el modelo con una variable ficticia para diferenciar las pendientes, ¿hay opciones que permitan el uso de conjuntos de datos independientes?

Abe
fuente
En cuanto a la primera pregunta, consulte stats.stackexchange.com/questions/55501/… .
russellpierce

Respuestas:

22

¿Cómo puedo probar la diferencia entre pendientes?

Incluya un maniquí para especies, deje que interactúe con y vea si este maniquí es significativo. Supongamos que es la longitud del sépalo y el ancho del pedal y son las variables ficticias para las tres especies. El comparar el modeloPiLiPiS1,S2,S3

E(Li)=β0+β1Pi

con el modelo que permite que el efecto de sea ​​diferente para cada especie:Pi

E(Li)=α0+α1S2+α2S3+α4Pi+α5PiS2+α6PiS3

Los estimadores GLS son MLE y el primer modelo es un submodelo en el segundo, por lo que puede usar la prueba de razón de probabilidad aquí. Las probabilidades se pueden extraer utilizando la logLikfunción y los grados de libertad para la prueba serán ya que ha eliminado parámetros para llegar al submodelo.44

¿Cuál es una manera simple y efectiva de presentar la comparación?

Creo que la forma más atractiva sería trazar las líneas de regresión para cada especie en todos los mismos ejes, tal vez con barras de error basadas en los errores estándar. Esto haría que la diferencia (o no diferencia) entre las especies y su relación con muy evidente.Pi

Editar: noté que se agregó otra pregunta al cuerpo. Entonces, estoy agregando una respuesta a eso:

¿Cómo puedo probar la diferencia entre las variaciones residuales?

Para esto, deberá estratificar el conjunto de datos y ajustar modelos separados, ya que el modelo basado en la interacción que sugerí limitará la varianza residual para que sea la misma en cada grupo. Si se ajusta a modelos separados, esta restricción desaparece. En ese caso, aún puede usar la prueba de razón de probabilidad (la probabilidad para el modelo más grande ahora se calcula sumando las probabilidades de los tres modelos separados). El modelo "nulo" depende de con qué quiere compararlo

  • si solo desea probar la varianza, dejando los efectos principales, entonces el modelo "nulo" debería ser el modelo con las interacciones que he escrito anteriormente. Los grados de libertad para la prueba son entonces .2

  • Si desea probar la varianza conjuntamente con los coeficientes, entonces el modelo nulo debería ser el primer modelo que he escrito anteriormente. Los grados de libertad para la prueba son entonces .6

Macro
fuente
¿Por qué no hay en el segundo modelo? ¿Es la implementación correcta del modelo en R? S1gls(Sepal.Length ~ species:Petal.Width, data = iris)
Abe
Hola @Abe. es la especie "de referencia": la línea de regresión para esa especie viene dada por . Si es una variable categórica, creo que sería la sintaxis. α 0 + α 4 P iS1α0+α4Pispeciesgls(Sepal.Length ~ species*Petal.Width, data=iris)
Macro
@Macro Buena respuesta (+1)! Me pregunto si podría ajustarse al glsmodelo pero permitiendo diferentes variaciones residuales para cada especie con la opción weights=varIdent(form=~1|Species)(con respecto a la segunda pregunta).
COOLSerdash
15

Para responder estas preguntas con el código R, use lo siguiente:
1. ¿Cómo puedo probar la diferencia entre pendientes?
Respuesta: Examine el valor p de ANOVA a partir de la interacción de Petal.Width por Species, luego compare las pendientes usando lsmeans :: lstrends, de la siguiente manera.

library(lsmeans)
m.interaction <- lm(Sepal.Length ~ Petal.Width*Species, data = iris)
anova(m.interaction)
 Analysis of Variance Table

 Response: Sepal.Length
                      Df Sum Sq Mean Sq  F value Pr(>F)    
 Petal.Width           1 68.353  68.353 298.0784 <2e-16 ***
 Species               2  0.035   0.017   0.0754 0.9274    
 Petal.Width:Species   2  0.759   0.380   1.6552 0.1947    
 Residuals           144 33.021   0.229                    
 ---
 Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

# Obtain slopes
m.interaction$coefficients
m.lst <- lstrends(m.interaction, "Species", var="Petal.Width")
 Species    Petal.Width.trend        SE  df   lower.CL upper.CL
 setosa             0.9301727 0.6491360 144 -0.3528933 2.213239
 versicolor         1.4263647 0.3459350 144  0.7425981 2.110131
 virginica          0.6508306 0.2490791 144  0.1585071 1.143154

# Compare slopes
pairs(m.lst)
 contrast                 estimate        SE  df t.ratio p.value
 setosa - versicolor    -0.4961919 0.7355601 144  -0.675  0.7786
 setosa - virginica      0.2793421 0.6952826 144   0.402  0.9149
 versicolor - virginica  0.7755341 0.4262762 144   1.819  0.1669

2. ¿Cómo puedo probar la diferencia entre las variaciones residuales?
Si entiendo la pregunta, puede comparar las correlaciones de Pearson con una transformación de Fisher, también llamada "Fisher de r a z", de la siguiente manera.

library(psych)
library(data.table)
iris <- as.data.table(iris)
# Calculate Pearson's R
m.correlations <- iris[, cor(Sepal.Length, Petal.Width), by = Species]
m.correlations
# Compare R values with Fisher's R to Z
paired.r(m.correlations[Species=="setosa", V1], m.correlations[Species=="versicolor", V1], 
         n = iris[Species %in% c("setosa", "versicolor"), .N])
paired.r(m.correlations[Species=="setosa", V1], m.correlations[Species=="virginica", V1], 
         n = iris[Species %in% c("setosa", "virginica"), .N])
paired.r(m.correlations[Species=="virginica", V1], m.correlations[Species=="versicolor", V1], 
         n = iris[Species %in% c("virginica", "versicolor"), .N])

3. ¿Cuál es una manera simple y efectiva de presentar estas comparaciones?
"Utilizamos la regresión lineal para comparar la relación de la longitud del sepal con el ancho del pétalo para cada especie. No encontramos una interacción significativa en las relaciones de la longitud del sepal con el ancho del pétalo para I. Setosa (B = 0.9), I. Versicolor (B = 1.4), ni I. Virginica (B = 0.6); F (2, 144) = 1.6, p = 0.19. Una comparación de Fisher de z a z indicó que la correlación de Pearson para I. Setosa (r = 0.28) fue significativamente menor (p = 0.02) que I. Versicolor (r = 0.55). Similarmente, la correlación para I. Virginica (r = 0.28) fue significativamente más débil (p = 0.02) que la observada para I. Versicolor".

Finalmente, ¡visualiza siempre tus resultados!

plotly_interaction <- function(data, x, y, category, colors = col2rgb(viridis(nlevels(as.factor(data[[category]])))), ...) {
  # Create Plotly scatter plot of x vs y, with separate lines for each level of the categorical variable. 
  # In other words, create an interaction scatter plot.
  # The "colors" must be supplied in a RGB triplet, as produced by col2rgb().

  require(plotly)
  require(viridis)
  require(broom)

  groups <- unique(data[[category]])

  p <- plot_ly(...)

  for (i in 1:length(groups)) {
    groupData = data[which(data[[category]]==groups[[i]]), ]
    p <- add_lines(p, data = groupData,
                   y = fitted(lm(data = groupData, groupData[[y]] ~ groupData[[x]])),
                   x = groupData[[x]],
                   line = list(color = paste('rgb', '(', paste(colors[, i], collapse = ", "), ')')),
                   name = groups[[i]],
                   showlegend = FALSE)
    p <- add_ribbons(p, data = augment(lm(data = groupData, groupData[[y]] ~ groupData[[x]])),
                     y = groupData[[y]],
                     x = groupData[[x]],
                     ymin = ~.fitted - 1.96 * .se.fit,
                     ymax = ~.fitted + 1.96 * .se.fit,
                     line = list(color = paste('rgba','(', paste(colors[, i], collapse = ", "), ', 0.05)')), 
                     fillcolor = paste('rgba', '(', paste(colors[, i], collapse = ", "), ', 0.1)'),
                     showlegend = FALSE)
    p <- add_markers(p, data = groupData, 
                     x = groupData[[x]], 
                     y = groupData[[y]],
                     symbol = groupData[[category]],
                     marker = list(color=paste('rgb','(', paste(colors[, i], collapse = ", "))))
  }
  p <- layout(p, xaxis = list(title = x), yaxis = list(title = y))
  return(p)
}

plotly_interaction(iris, "Sepal.Length", "Petal.Width", "Species")

irisPlot

Kayle Sawyer
fuente
8

Estoy de acuerdo con la sugerencia anterior. Debe ajustar un modelo de regresión múltiple con una variable ficticia para cada conjunto de datos. Esto le permitirá probar si las intersecciones son diferentes. Si también desea saber si las pendientes difieren, también debe incluir las interacciones entre los dummies y la variable en cuestión. No hay problema con el hecho de que los datos son independientes. Tenga en cuenta que si ambas son especies independientes y (por ejemplo) diferentes, entonces no podrá saber si la diferencia que encuentra se debe a las diferentes especies o los diferentes conjuntos de datos, ya que están perfectamente confundidos. Sin embargo, no hay prueba / tarjeta para salir de la cárcel que lo ayudará a resolver ese problema sin reunir una nueva muestra y ejecutar su estudio nuevamente.

gung - Restablece a Monica
fuente
Parece que hemos publicado respuestas bastante similares casi al mismo tiempo. +1
Macro
@Macro, sí, pero el tuyo es mayormente mejor (+1 antes); Abordó las 3 preguntas que me perdí en mi primera (no exhaustiva) lectura de la pregunta. Mi contribución aquí es la parte de la confusión.
gung - Restablece a Monica
Sí, ese es un buen punto. Supongo que si estuviera haciendo esta investigación, tendría que estar operando bajo el supuesto de que los conjuntos de datos estaban midiendo lo mismo, etc., con la única diferencia de que las especies eran diferentes.
Macro
3
Desde mi punto de vista, ambos deberían recibir votos positivos, que es lo que estoy haciendo.
Michael R. Chernick
1
La sugerencia de variable ficticia es buena siempre que la varianza del error no difiera apreciablemente entre los modelos. De lo contrario, podría aplicar una prueba t de Satterthwaite-Welch (que tiene la ventaja singular de estar disponible cuando solo se conocen estadísticas resumidas, como suele ser el caso al leer artículos publicados) o utilizar mínimos cuadrados ponderados para ajustarse al modelo combinado.
whuber