Ich führe Quantilregressionen in R mit dem Paket quantreg durch. Mein Datensatz enthält 12.328 Beobachtungen zwischen 0,12 und 330. Die Zeitpunkte für meine Daten sind nicht genau kontinuierlich. Alle Daten fallen in einen von wenigen Dutzend Fächern zwischen 73 und 397.
Als ich mit der Funktion lm () eine lineare Regression dieser Daten durchführte, konnte ich dies mit Polynomen bis zu 4 tun:
lm(Y~poly(X,3,raw=TRUE),data=mydata)
Mit dem Paket quantreg und dem Befehl rq () kann ich jedoch keine Polynome verwenden. Eine einfache Regression funktioniert einwandfrei:
rq(Y~X,data=mydata,tau=.15)
Aber sobald ich in Polynome gerate, keine Würfel. Wenn ich dies eingebe:
rq(Y~poly(X,2,raw=TRUE),data=mydata,tau=.15)
Ich erhalte die folgende Fehlermeldung:
Error in rq.fit.br(x, y, tau = tau, ...) : Singular design matrix
Ich habe einzelne Matrizen gelesen und denke, dass es zwei Gründe dafür geben kann: (1) Ich habe nur eine Variable auf jeder Achse oder (2) meine Daten sind gruppiert / die Y-Variable ist nicht wirklich stetig.
Kann mir jemand sagen, warum ich diesen Fehler bekomme?
PS - So sieht das Diagramm aus:
quelle
Antworten:
Ich glaube, der Grund, warum es als Singular auftaucht, ist Ihr zweiter Grund, dass die Daten zusammengefasst sind. Das Duplizieren von Beobachtungen (für einen einzelnen x-Wert mehrere Antworten) erhöht die Wahrscheinlichkeit einer Singularität.
Ich hatte die gleiche Fehlermeldung wie Sie mit einem ähnlich strukturierten Datensatz. Ich habe mehrere Beobachtungen für jeden x-Wert, von denen einige identisch waren. Ich habe es umgangen, indem ich die Daten "zitterte" und den Antwortwerten mit rnorm () eine sehr kleine Menge zufälligen Rauschens hinzufügte. Dies bedeutete, dass es zwar mehrere Beobachtungen für jeden x-Wert gab, jedoch keine identischen Wiederholungen gab und die Funktion rq () funktioniert. Solange das von Ihnen hinzugefügte Rauschen gering ist, werden die Koeffizienten- und SE-Schätzungen von rq nicht merklich beeinflusst.
quelle
Eine Alternative zu dem
rnorm()
von Jack Ballard vorgeschlagenen ist die Verwendungjitter()
aus dem Basispaket.quelle