Simule datos de regresión con una variable dependiente que no se distribuye normalmente


8

Para el análisis de regresión, a menudo es útil conocer el proceso de generación de datos para verificar cómo funciona el método utilizado. Si bien es bastante simple hacer esto para una regresión lineal simple, este no es el caso cuando la variable dependiente tiene que seguir una distribución específica.

Considere una regresión lineal simple:

N    <- 100
x    <- rnorm(N)
beta <- 3 + 0.4*rnorm(N)
y    <- 1 + x * beta + .75*rnorm(N)

¿Hay alguna forma de usar el mismo enfoque pero yser diferente de lo normal, por ejemplo, dejar sesgado?

Respuestas:


10

Si entiendo su pregunta correctamente, esto es bastante fácil. Solo necesita decidir qué distribución desea que tengan sus errores y usar la función de generación aleatoria correspondiente.

Hay varias distribuciones sesgadas, por lo que debe averiguar cuál le gusta. Además, la mayoría de las distribuciones sesgadas (p. Ej., Log normal, chi-cuadrado, gamma, Weibull, etc.) están sesgadas a la derecha, por lo que serían necesarias algunas adaptaciones menores (p. Ej., Multiplicar por ). -1

Aquí hay un ejemplo que modifica su código:

set.seed(5840)  # this makes the example exactly reproducible
N      <- 100
x      <- rnorm(N)
beta   <- 0.4
errors <- rlnorm(N, meanlog=0, sdlog=1)
errors <- -1*errors   # this makes them left skewed
errors <- errors - 1  # this centers the error distribution on 0
y      <- 1 + x*beta + errors

ingrese la descripción de la imagen aquí

Debo señalar en este punto que la regresión no hace suposiciones sobre las distribuciones de o , solo sobre los errores, (ver aquí: ¿Qué pasa si los residuos están normalmente distribuidos, pero y no lo es? ). Por lo tanto, ese fue el enfoque de mi respuesta anterior. XYε


Actualización: Aquí hay una versión sesgada a la derecha con los errores distribuidos como Weibull:

set.seed(5840)  # this makes the example exactly reproducible
N      <- 100
x      <- rnorm(N)
beta   <- 0.4
errors <- rweibull(N, shape=1.5, scale=1)
# errors <- -1*errors   # this makes them left skewed
errors <- errors - factorial(1/1.5)  # this centers the error distribution on 0
y      <- 1 + x*beta + errors

Los datos de Weibull ya están sesgados, por lo que no necesitamos cambiar su dirección (es decir, descartamos la -1*errorsparte). Además, desde la página de Wikipedia para la distribución de Weibull, vemos que la media de un Weibull debería ser:. Queremos restar ese valor de cada uno de los errores para que la distribución del error resultante se centre en . Eso permite que la parte estructural (es decir, ) de su código refleje con precisión la parte estructural del proceso de generación de datos. mi[W]=(1/ /shunapagsmi)!0 01 + x*beta

ingrese la descripción de la imagen aquí

La distribución exgaussiana es la suma de una normal y una exponencial. Hay una función ? RexGAUS en el paquete gamlss.dist para generarlos. No tengo ese paquete, pero deberías poder adaptar mi código anterior sin demasiada dificultad. También podría generar una variable normal aleatoria (vía rnorm()) y una exponencial (vía rexp()) y sumarlas con bastante facilidad. Solo recuerde restar la media de la población, , de cada error antes de agregar los errores a la parte estructural del proceso de generación de datos. (¡Pero tenga cuidado de no restar la media muestral !) μ+1/ /λmean(errors)


Algunos comentarios finales no relacionados: su código de ejemplo en la pregunta está algo confuso (es decir, sin ofender). Porque rnorm(N)genera datos con mean=0y sd=1por defecto, 0.4*rnorm(N)generará rnorm(N, mean=0, sd=0.4). Su código (y posiblemente su pensamiento) será mucho más claro si usa la última formulación. Además, su código para betaparece confundido. Generalmente pensamos en elβen un modelo de regresión como parámetro, no como una variable aleatoria. Es decir, es una constante desconocida que gobierna el comportamiento del proceso de generación de datos, pero la naturaleza estocástica del proceso está encapsulada por los errores. Esta no es la forma en que pensamos cuando trabajamos con modelos multinivel, y su código parece estar a medio camino entre un modelo de regresión estándar y el código para un modelo de regresión multinivel. Especificar sus betas por separado es una buena idea para mantener la claridad conceptual del código, pero para un modelo de regresión estándar, simplemente asignaría un número único a cada beta (por ejemplo, beta0 <- 1; beta1 <- .04).


gracias por su respuesta, para ser más específico: necesito simular datos de tiempo de respuesta. Los tiempos de respuesta son típicamente sesgados y se distribuyen aproximadamente como un ex gaussiano o Weibull.
Comienzo

Elaboraré un ejemplo así, pero serán los errores los que estén sesgados, la distribución marginal de Y es incidental. Además, los datos del tiempo de respuesta deben estar sesgados a la derecha (algunas RT largas, pero un piso sólido), no sesgados (hacia valores pequeños).
gung - Restablece a Monica

Sí, sesgada a la derecha, accidentalmente escribí "sesgada a la izquierda" en mi pregunta.
Comienzo

1
Gracias por sus amplias respuestas. En realidad, estoy simulando datos para un modelo multinivel. Acabo de usar el código y lo adopté para un escenario de regresión lineal simple.
Comienzo

Una pregunta más: ¿sabe cómo simular datos de medidas repetidas utilizando un modelo de regresión como el anterior para que las medidas repetidas tengan una estructura de correlación específica (para tener en cuenta la esfericidad)? Digamos que hay N sujetos, cada uno de los cuales proporciona 20 ensayos en cada una de las tres condiciones de tratamiento, donde la correlación entre las condiciones de tratamiento debe conocerse en el proceso de generación de datos.
comenzando
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.