Wie passt man eine Regression wie

9

Ich habe einige Zeitreihendaten, bei denen die Messgröße diskrete positive ganze Zahlen (Zählungen) sind. Ich möchte testen, ob es im Laufe der Zeit einen Aufwärtstrend gibt (oder nicht). Die unabhängige Variable (x) liegt im Bereich von 0 bis 500 und die abhängige Variable (y) liegt im Bereich von 0 bis 8.

Ich dachte, ich beantworte dies, indem ich eine Regression der Form unter y = floor(a*x + b)Verwendung gewöhnlicher kleinster Quadrate (OLS) anpasse.

Wie würde ich dies mit R (oder Python) tun? Gibt es ein vorhandenes Paket dafür oder ist es besser, meinen eigenen Algorithmus zu schreiben?

PS: Ich weiß, dass dies nicht die ideale Technik ist, aber ich muss eine relativ einfache Analyse durchführen, die ich tatsächlich verstehen kann - mein Hintergrund ist Biologie, nicht Mathematik. Ich weiß, dass ich gegen Annahmen über Fehler in Messgrößen und die Unabhängigkeit von Messungen im Zeitverlauf verstoße.

afaulconbridge
quelle
5
Obwohl es mathematisch natürlich ist, eine Regression dieser Form zu versuchen, verbirgt sich dahinter ein statistischer Fehler: Der Fehlerterm wird nun stark mit dem vorhergesagten Wert korreliert. Das ist eine ziemlich starke Verletzung der OLS-Annahmen. Verwenden Sie stattdessen eine zählbasierte Technik, wie in der Antwort von Greg Snow vorgeschlagen. (Ich habe diese Frage jedoch gerne positiv bewertet, da sie einige echte Gedanken und Klugheit widerspiegelt. Vielen Dank, dass Sie sie hier gestellt haben!)
whuber

Antworten:

11

Sie könnten das Modell, das Sie angeben, mit der Funktion nls(nichtlineare kleinste Quadrate) anpassen R, aber wie Sie sagten, wird dies viele der Annahmen verletzen und wahrscheinlich immer noch nicht viel Sinn machen (Sie sagen, das vorhergesagte Ergebnis ist zufällig um einen Schritt herum Funktion, keine ganzzahligen Werte um eine reibungslos ansteigende Beziehung).

Die gebräuchlichste Methode zum Anpassen von Zähldaten ist die Verwendung der Poisson-Regression mithilfe der glmFunktion in R. Das erste Beispiel auf der Hilfeseite ist eine Poisson-Regression. Wenn Sie jedoch mit Statistiken nicht so vertraut sind, wenden Sie sich am besten an einen Statistiker, um dies sicherzustellen dass du die Dinge richtig machst.

Wenn der Wert 8 ein absolutes Maximum ist (es ist unmöglich, jemals eine höhere Anzahl zu sehen, nicht nur das, was Sie gesehen haben), dann könnten Sie eine logistische Regression mit proportionalen Gewinnchancen in Betracht ziehen. Es gibt einige Tools, um dies in Paketen zu tun R, aber Sie sollte wirklich einen Statistiker einbeziehen, wenn Sie dies tun möchten.

Greg Snow
quelle
"Sie sagen, das vorhergesagte Ergebnis ist zufällig um eine Schrittfunktion herum, nicht ganzzahlige Werte um eine reibungslos wachsende Beziehung" --- Das habe ich nicht berücksichtigt. Am Ende ging ich mit Poisson Regression von glm. Es ist nicht die perfekte Wahl, aber "gut genug" für das, was ich brauchte.
Afaulconbridge
10

Es ist klar, dass Gregs Vorschlag das erste ist, was man versuchen sollte: Die Poisson-Regression ist das natürliche Modell in vielen, vielen konkreten Situationen.

Das von Ihnen vorgeschlagene Modell kann jedoch beispielsweise auftreten, wenn Sie gerundete Daten beobachten: mit normalen Fehlern .

Yi=axi+b+ϵi,
ϵi

Ich finde es interessant, einen Blick darauf zu werfen, was damit gemacht werden kann. Ich bezeichne mit das cdf der normalen Standardvariablen. Wenn , dann Verwendung bekannter Computernotationen.FϵN(0,σ2)

P(ax+b+ϵ=k)=F(kb+1axσ)F(kbaxσ)=pnorm(k+1axb,sd=σ)pnorm(kaxb,sd=σ),

Sie beobachten Datenpunkte . Die Log-Wahrscheinlichkeit ist gegeben durch Dies ist nicht identisch mit den kleinsten Quadraten. Sie können versuchen, dies mit einer numerischen Methode zu maximieren. Hier ist eine Illustration in R:(xi,yi)

(a,b,σ)=ilog(F(yib+1axiσ)F(yibaxiσ)).
log_lik <- function(a,b,s,x,y)
  sum(log(pnorm(y+1-a*x-b, sd=s) - pnorm(y-a*x-b, sd=s)));

x <- 0:20
y <- floor(x+3+rnorm(length(x), sd=3))
plot(x,y, pch=19)
optim(c(1,1,1), function(p) -log_lik(p[1], p[2], p[3], x, y)) -> r
abline(r$par[2], r$par[1], lty=2, col="red")
t <- seq(0,20,by=0.01)
lines(t, floor( r$par[1]*t+r$par[2]), col="green")

lm(y~x) -> r1
abline(r1, lty=2, col="blue");

abgerundetes lineares Modell

In Rot und Blau werden die Linien durch numerische Maximierung dieser Wahrscheinlichkeit bzw. der kleinsten Quadrate gefunden. Die grüne Treppe ist für , ermittelt aus der maximalen Wahrscheinlichkeit ... Dies legt nahe, dass Sie die kleinsten Quadrate bis zu einer Übersetzung von um 0,5 verwenden und ungefähr das gleiche Ergebnis erzielen können. oder dass die kleinsten Quadrate gut zum Modell passen wobei die nächste ganze Zahl ist. Abgerundete Daten werden so oft getroffen, dass ich sicher bin, dass dies bekannt ist und ausgiebig untersucht wurde ...ax+bax+ba,bb

Yi=[axi+b+ϵi],
[x]=x+0.5
Elvis
quelle
4
+1 Ich liebe diese Technik und habe vor einigen Jahren tatsächlich ein Papier darüber in einem Risikoanalyse-Journal eingereicht. (Einige Risikoanalytiker sind sehr an Intervalldaten interessiert.) Sie wurden als "zu mathematisch" für ihr Publikum abgelehnt. :-(. Ein Tipp: Wenn Sie numerische Methoden verwenden, ist es immer eine gute Idee, gute Startwerte für die Lösung anzugeben. Wenden Sie OLS auf die Rohdaten an, um diese Werte zu erhalten, und "polieren" Sie sie dann mit dem numerischen Optimierer.
whuber
Ja, das ist ein guter Vorschlag. In diesem Fall wähle ich entfernte Werte, um zu betonen, dass "es funktioniert", aber in der Praxis wäre Ihr Vorschlag die einzige Lösung, um zu vermeiden, von einer sehr flachen Region auszugehen, abhängig von den Daten ...
Elvis