4 votos

¿Cómo puedo obtener la pendiente y el error estándar en varios niveles de una interacción continua en R?

Estoy comparando las pendientes de las diferentes variables de respuesta (DVs; en representación de las diferentes poblaciones) a un conjunto de predictores (IVs). Para algunos DVs una 2-forma de interacción (continua continua) es compatible. Para facilitar la comparación de la IV coeficientes me gustaría parcela de la pendiente de las estimaciones y 95% CI en una sola gráfica (aparte de la gráfica para cada IV), y para el DV con una interacción en la que me gustaría parcela de la pendiente en la ~3 los valores de la continua moderadora variable (por ejemplo, "DV 1" en la figura a continuación).

enter image description here

Estoy seguro de que hay una variedad de maneras de obtener estos valores, pero estoy esperando que alguien puede me apunte a un simple pedazo de código o un paquete que puede ayudar a automatizar este proceso para mí. Yo también debería tomar nota de mis modelos son de lme4.

Los 'efectos' paquete fácilmente calcula los valores predichos por el usuario especifica los niveles de la moderadora variable, pero no proporciona pistas o SE a mi conocimiento (aunque yo podía entender estas fuera de los valores pronosticados, estoy esperando a que salgan más corriente alineada método).

Aquí es un juguete de datos, aunque no se puede producir una interacción como muestro en la figura;

set.seed(50)
x1 <- rnorm(100,2,10)
x2 <- rnorm(100,2,10)
y1 <- x1+x2+x1*x2+rnorm(100,0,100)

model1<-lm(y1 ~ x1*x2)

Y aquí está la predicción de los valores trazados de 'efectos', pero yo quiero las pistas y SE de estas líneas...

library(effects)
model1.eff<-effect("x1*x2",model1,xlevels=3)
plot(model1.eff,multiline=T,ci.style="bands")
as.data.frame(model1.eff)

3voto

user70650 Puntos 91

Con el fin de examinar simple pistas de diferentes niveles de una de las variables continuas, usted puede simplemente centro de la otra variable continua para centrarse en la pendiente de interés. En un modelo con una continua interacción continua, como así: $$y = \beta_0 + \beta_1x_1 + \beta_2x_2 + \beta_3x_1*x_2$$ the two single predictor coefficients ($\beta_1$ and $\beta_2$) son simples pistas para el predictor cuando el otro predictor (sin embargo es centrado) es igual a 0.

Por lo tanto, si ejecuto el código de la práctica anterior, obtengo el siguiente resultado:

Call:
lm(formula = y1 ~ x1 * x2)

Residuals:
     Min       1Q   Median       3Q      Max 
-281.996  -70.148   -3.702   70.190  209.182 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  17.7519    10.8121   1.642    0.104    
x1            1.4175     1.0151   1.397    0.166    
x2            0.8222     1.0614   0.775    0.440    
x1:x2         0.8911     0.1295   6.882 6.04e-10 ***
---
Signif. codes:  0 ‘***' 0.001 ‘**' 0.01 ‘*' 0.05 ‘.' 0.1 ‘ ' 1

Residual standard error: 100.6 on 96 degrees of freedom
Multiple R-squared:  0.4283,    Adjusted R-squared:  0.4105 
F-statistic: 23.98 on 3 and 96 DF,  p-value: 1.15e-11

El x1 salida nos da la prueba de que el x1 pendiente en x2 = 0. De este modo obtenemos una pendiente, error estándar, y (como un bono) la prueba de que la estimación del parámetro en comparación con 0. Si queremos conseguir el simple pendiente de x1 (y el error estándar y sig. de prueba) cuando x2 = 6, utilizamos simplemente una transformación lineal para hacer que un valor de 6 en x2 en el punto 0:

x2.6<- x2-6

Viendo las estadísticas de resumen, podemos ver que esta es la misma variable como antes, pero se ha desplazado hacia abajo en el número de línea por 6 unidades:

summary(x2)
summary(x2.6)

 > summary(x2)
   Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-31.0400  -5.9520   1.3430   0.8396   8.0090  22.3800 

 > summary(x2.6)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-37.040 -11.950  -4.657  -5.160   2.009  16.380 

Ahora, si queremos volver a ejecutar el mismo modelo, pero el sustituto de x2 para nuestros nuevos centrado en la variable x2.6, obtenemos esto:

model1.6<- lm(y1~x1*x2.6)
summary(model1.6)


Call:
lm(formula = y1 ~ x1 * x2.6)

Residuals:  
     Min       1Q   Median       3Q      Max 
-281.996  -70.148   -3.702   70.190  209.182 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  22.6853    12.6384   1.795   0.0758 .  
x1            6.7639     1.2346   5.479 3.44e-07 ***
x2.6          0.8222     1.0614   0.775   0.4404    
x1:x2.6       0.8911     0.1295   6.882 6.04e-10 ***
---
Signif. codes:  0 ‘***' 0.001 ‘**' 0.01 ‘*' 0.05 ‘.' 0.1 ‘ ' 1

Residual standard error: 100.6 on 96 degrees of freedom
Multiple R-squared:  0.4283,    Adjusted R-squared:  0.4105 
F-statistic: 23.98 on 3 and 96 DF,  p-value: 1.15e-11 

Si comparamos este resultado a la edad de salida, podemos ver que el omnibus F todavía está 23.98, la interacción t es todavía 6.882 y la pendiente para x2.6 es todavía .822 (y no significativo). Sin embargo, nuestro coeficiente de x1 es ahora mucho más amplio y significativo. Esta pendiente es ahora el simple pendiente de cuando x1 x2 es igual a 6 (o cuando x2.6 = 0). Centrando por diferentes variables, podemos probar diferentes efectos simples (y obtener pistas y errores estándar) sin mucho trabajo. Mediante el uso de un (temida en la comunidad de investigación) bucle for para recorrer la lista, podemos probar diferentes efectos simples de forma eficiente:

centeringValues<- c(1,2,3,4,5,6) # Creating a vector of values to center around

for(i in 1:length(centeringValues)){     #Making a for loop that iterates through the list
  x<- x2-i         # Creating a predictor that is the newly centered variable
  print(paste0('x.',centeringValues[i])) # printing x.centering value so you can keep track of output
  print(summary(lm(y1~x1*x))[4]) # printing coefficients for the model with the center variable

}

Este código crea primero un vector de valores que usted quiere convertirse en el punto 0 de la variable que no quiere que la pendiente (en este ejemplo, x2). A continuación, cree un bucle que itera a través de las posiciones en esta lista (es decir, si la lista tiene 3 elementos, el bucle for se repite a través de los valores de 1 a 3). A continuación, cree una nueva variable que es el centrado en la versión de la variable para la cual usted no desea centrado en laderas (en este caso estamos interesados en simples pistas para x1, así que el centro de x2). Por último, la impresión de los coeficientes del modelo que incluye su recién centrado en la variable en lugar de la materia prima variable. Esto se traduce en la siguiente salida:

[1] "x.1"
    $coefficients
              Estimate Std. Error   t value     Pr(>|t|)
(Intercept) 18.5741364 10.8815154 1.7069439 9.106513e-02
x1           2.3085985  1.0143100 2.2760286 2.506664e-02
x            0.8222252  1.0613590 0.7746909 4.404262e-01
x1:x         0.8910530  0.1294695 6.8823366 6.041102e-10

[1] "x.2"
$coefficients
              Estimate Std. Error   t value     Pr(>|t|)
(Intercept) 19.3963616 11.0528627 1.7548722 8.247158e-02
x1           3.1996515  1.0299723 3.1065415 2.489385e-03
x            0.8222252  1.0613590 0.7746909 4.404262e-01
x1:x         0.8910530  0.1294695 6.8823366 6.041102e-10

[1] "x.3"
$coefficients
              Estimate Std. Error   t value     Pr(>|t|)
(Intercept) 20.2185867 11.3215341 1.7858522 7.728065e-02
x1           4.0907045  1.0613132 3.8543802 2.096928e-04
x            0.8222252  1.0613590 0.7746909 4.404262e-01
x1:x         0.8910530  0.1294695 6.8823366 6.041102e-10

[1] "x.4"
$coefficients
              Estimate Std. Error   t value     Pr(>|t|)
(Intercept) 21.0408119 11.6808159 1.8013135 7.479290e-02
x1           4.9817575  1.1070019 4.5002249 1.905339e-05
x            0.8222252  1.0613590 0.7746909 4.404262e-01
x1:x         0.8910530  0.1294695 6.8823366 6.041102e-10

[1] "x.5"
$coefficients
              Estimate Std. Error   t value     Pr(>|t|)
(Intercept) 21.8630371 12.1226545 1.8034859 7.444873e-02
x1           5.8728105  1.1653521 5.0395160 2.193149e-06
x            0.8222252  1.0613590 0.7746909 4.404262e-01
x1:x         0.8910530  0.1294695 6.8823366 6.041102e-10

[1] "x.6"
$coefficients
              Estimate Std. Error   t value     Pr(>|t|)
(Intercept) 22.6852623 12.6383944 1.7949481 7.580894e-02
x1           6.7638636  1.2345698 5.4787212 3.439867e-07
x            0.8222252  1.0613590 0.7746909 4.404262e-01
x1:x         0.8910530  0.1294695 6.8823366 6.041102e-10

Aquí puede ver la salida proporciona los coeficientes de varias pruebas, pero la única cosa que cambia cada vez que es la pendiente de x1. La pendiente de x1 en cada salida representa la pendiente para cuando x1 x2 es igual a lo de centrado valor que le hemos asignado para esa iteración. Espero que esto ayude!

1voto

AndersNS Puntos 111

Mientras @lanas respuesta parece más que adecuado, aquí es otra de las alternativas que permite el cálculo del efecto marginal de x1 dado x2, a partir de un único modelo de salida sin el centrado de las variables x;

De acuerdo a http://statistics.ats.ucla.edu/stat/r/faq/concon.htm; donde el modelo es

y ~ β0 + ß1x1 + ß2x2+ ß3x1∗x2

a continuación, la pendiente de x1 a un determinado valor de x2 es β1 + β3 * x2

Para poder elegir un par de valores de x2 como;

at.x2<-c(-6, 1, 6)

slopes <- coef(model1)["x1"] + coef(model1)["x1:x2"] * at.x2

De acuerdo a la forma de calcular el error estándar de los efectos marginales en las interacciones (regresión robusta)? Error estándar para pendientes = sqrt(var(b1) + var(b3) x2^2 + 2 x2 * cov(b1,b3) )

estvar<-vcov(model1); model1.vcov<-as.data.frame(as.matrix(estvar))
var.b1<-model1.vcov["x1","x1"]
var.b3<-model1.vcov["x1:x2","x1:x2"]
cov.b1.b3<-model1.vcov["x1","x1:x2"]

SEs <- rep(NA, length(at.x2))
for (i in 1:length(at.x2)){
  j <- at.x2[i]  
  SEs[i] <- sqrt(var.b1 + var.b3 * j^2 + 2*j* cov.b1.b3)
}

cbind(SEs, slopes)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by: