Simulieren Sie Regressionsdaten, wobei die abhängige Variable nicht normal verteilt ist


8

Für die Regressionsanalyse ist es häufig hilfreich, den Datengenerierungsprozess zu kennen, um zu überprüfen, wie die verwendete Methode funktioniert. Während es für eine einfache lineare Regression ziemlich einfach ist, dies zu tun, ist dies nicht der Fall, wenn die abhängige Variable einer bestimmten Verteilung folgen muss.

Betrachten Sie eine einfache lineare Regression:

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

Gibt es eine Möglichkeit, den gleichen Ansatz zu verwenden, yaber anders als normal zu sein, sagen wir links schief?

Antworten:


10

Wenn ich Ihre Frage richtig verstehe, ist das ganz einfach. Sie müssen nur entscheiden, welche Verteilung Ihre Fehler haben sollen, und die entsprechende Zufallsgenerierungsfunktion verwenden.

Es gibt eine Reihe von verzerrten Verteilungen, daher müssen Sie herausfinden, welche Sie mögen. Darüber hinaus sind die meisten verzerrten Verteilungen (z. B. logarithmisch normal, Chi-Quadrat, Gamma, Weibull usw.) recht verzerrt, sodass einige geringfügige Anpassungen erforderlich wären (z. B. mit multiplizieren ). 1

Hier ist ein Beispiel zum Ändern Ihres Codes:

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

Geben Sie hier die Bildbeschreibung ein

Ich sollte an dieser Stelle beachten, dass die Regression keine Annahmen über die Verteilungen von oder , sondern nur über die Fehler (siehe hier: Was ist, wenn die Residuen normal verteilt sind, y jedoch nicht? ). Das war also der Schwerpunkt meiner obigen Antwort. Y εXYε


Update: Hier ist eine rechtwinklige Version mit den als Weibull verteilten Fehlern:

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

Weibull-Daten sind bereits richtig verzerrt, sodass wir ihre Richtung nicht ändern müssen (dh wir lassen das -1*errorsTeil fallen). Auf der Wikipedia-Seite für die Weibull-Verteilung sehen wir auch, dass der Mittelwert eines Weibull sein sollte:. Wir wollen diesen Wert von jedem der Fehler subtrahieren, damit die resultierende Fehlerverteilung auf zentriert ist . Dadurch kann der strukturelle Teil (dh ) Ihres Codes den strukturellen Teil des Datengenerierungsprozesses genau wiedergeben. 0E[W]=(1/shape)!01 + x*beta

Geben Sie hier die Bildbeschreibung ein

Die ExGaußsche Verteilung ist die Summe aus Normal und Exponential. Es gibt eine Funktion ? RexGAUS im Paket gamlss.dist , um diese zu generieren. Ich habe dieses Paket nicht, aber Sie sollten in der Lage sein, meinen obigen Code ohne allzu große Schwierigkeiten anzupassen. Sie können auch eine zufällige Normalvariable (via rnorm()) und eine Exponentialvariable (via rexp()) generieren und diese ganz einfach summieren. Denken Sie daran, den Populationsmittelwert von jedem Fehler zu subtrahieren, bevor Sie die Fehler zum strukturellen Teil des Datenerzeugungsprozesses hinzufügen. (Achten Sie darauf , nicht die subtrahieren Probe Mittelwert , aber!) μ+1/λmean(errors)


Einige abschließende, nicht verwandte Kommentare: Ihr Beispielcode in der Frage ist etwas durcheinander (was keine Beleidigung bedeutet). Da rnorm(N)Daten mit mean=0und sd=1standardmäßig 0.4*rnorm(N)generiert , werden generiert rnorm(N, mean=0, sd=0.4). Ihr Code (und möglicherweise Ihr Denken) wird viel klarer, wenn Sie die letztere Formulierung verwenden. Außerdem betascheint Ihr Code für verwirrt zu sein. Wir denken im Allgemeinen an dieβin einem Modell vom Regressionstyp als Parameter, nicht als Zufallsvariable. Das heißt, es ist eine unbekannte Konstante, die das Verhalten des Datenerzeugungsprozesses bestimmt, aber die stochastische Natur des Prozesses wird durch die Fehler eingekapselt. Dies ist nicht die Art und Weise, wie wir darüber denken, wenn wir mit Mehrebenenmodellen arbeiten, und Ihr Code scheint auf halbem Weg zwischen einem Standardregressionsmodell und dem Code für ein Mehrebenenregressionsmodell zu liegen. Die separate Angabe Ihrer Betas ist eine gute Idee, um die konzeptionelle Klarheit des Codes zu erhalten. Bei einem Standard-Regressionsmodell würden Sie jedoch jeder Beta (z beta0 <- 1; beta1 <- .04. B. ) nur eine einzige Nummer zuweisen .


Vielen Dank für Ihre Antwort, um genauer zu sein: Ich muss Antwortzeitdaten simulieren. Die Reaktionszeiten sind in der Regel recht schief und ungefähr wie bei einem Ex-Gaußschen oder Weibull verteilt.
Beginn

Ich werde ein solches Beispiel ausarbeiten , aber es werden die Fehler sein , die verzerrt sind, die marginale Verteilung von Y ist zufällig. Außerdem sollten die Antwortzeitdaten nach rechts verschoben sein (einige lange RTs, aber ein fester Boden) und nicht nach links verschoben sein (in Richtung kleiner Werte).
Gung - Reinstate Monica

Ja, rechts schief, ich habe versehentlich "links schief" in meine Frage geschrieben.
Beginn

1
Vielen Dank für Ihre ausführlichen Antworten. Eigentlich simuliere ich Daten für ein Mehrebenenmodell. Ich habe den Code nur verwendet und ihn für ein einfaches lineares Regressionsszenario übernommen.
Beginn

Noch eine Frage: Wissen Sie, wie man wiederholte Messdaten mit einem Regressionsmodell wie dem oben genannten simuliert, damit die wiederholten Messungen eine spezifische Korrelationsstruktur haben (um die Sphärizität zu berücksichtigen)? Angenommen, es gibt N Probanden, die jeweils 20 Studien unter drei Behandlungsbedingungen durchführen, bei denen die Korrelation zwischen den Behandlungsbedingungen bei der Datenerzeugung bekannt sein sollte.
Beginn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.