Ich habe einige Daten, die ich glätten möchte, damit die geglätteten Punkte monoton abnehmen. Meine Daten nehmen stark ab und beginnen dann ein Plateau. Hier ist ein Beispiel mit R
df <- data.frame(x=1:10, y=c(100,41,22,10,6,7,2,1,3,1))
ggplot(df, aes(x=x, y=y))+geom_line()
Was ist eine gute Glättungstechnik, die ich verwenden könnte? Außerdem wäre es schön, wenn ich den 1. geglätteten Punkt so einstellen könnte, dass er meinem beobachteten Punkt nahe kommt.
plot(y~x,data=df); f=fitted( glm( y~ns(x,df=4), data=df,family=quasipoisson)); lines(df$x,f)
Antworten:
Sie können dies mithilfe von bestraften Splines mit Monotonieeinschränkungen über die Funktionen
mono.con()
undpcls()
im mgcv- Paket tun . Es muss ein wenig herumgespielt werden, da diese Funktionen nicht so benutzerfreundlich sindgam()
, aber die folgenden Schritte basieren hauptsächlich auf dem Beispiel von?pcls
, das an die von Ihnen angegebenen Beispieldaten angepasst wurde:Jetzt müssen wir das Objekt ausfüllen, an das
pcls()
die Details des bestraften beschränkten Modells übergeben werden, das angepasst werden sollJetzt können wir endlich die Anprobe machen
p
enthält einen Koeffizientenvektor für die Basisfunktionen, die dem Spline entsprechen. Um den angepassten Spline zu visualisieren, können wir aus dem Modell 100 Positionen über den Bereich von x vorhersagen. Wir machen 100 Werte, um eine schöne glatte Linie auf dem Plot zu bekommen.Um vorhergesagte Werte zu generieren, verwenden wir
Predict.matrix()
eine Matrix, die bei multiplen Koeffizientenp
vorhergesagte Werte aus dem angepassten Modell ergibt:Dies erzeugt:
Ich überlasse es Ihnen, die Daten in ein ordentliches Formular für das Plotten mit ggplot zu bringen ...
Sie können eine engere Anpassung erzwingen (um Ihre Frage nach der Anpassung des Glätters an den ersten Datenpunkt teilweise zu beantworten), indem Sie die Dimension der Basisfunktion von vergrößern
x
. Wenn Sie zum Beispielk
gleich8
(k <- 8
) setzen und den obigen Code erneut ausführen, erhalten SieSie können
k
für diese Daten nicht viel mehr tun, und Sie müssen vorsichtig sein, wenn Sie übermäßig anpassen. Alles,pcls()
was Sie tun müssen, ist, das Problem der bestraften kleinsten Fehlerquadrate zu lösen, da die Einschränkungen und die bereitgestellten Basisfunktionen vorhanden sind.Wenn Sie eine Interpolation wünschen, sehen Sie sich die Basis-R-Funktion an,
?splinefun
die Hermite-Splines und kubische Splines mit Monotonizitätsbeschränkungen enthält. In diesem Fall können Sie dies jedoch nicht verwenden, da die Daten nicht streng monoton sind.quelle
splinefun
war mein erster Gedanke auch (ich interpoliere), aberspline(x=df$x, y=df$y, n=nrow(df), method="monoH.FC")
undspline(x=df$x, y=df$y, n=nrow(df), method="hyman")
beide werfen Fehler?mono.con
enthält weitere Einzelheiten zu dem Verfahren.splinefun
wird ein Fehler ausgelöst? Ich habe gerade festgestellt, dass Sie einen monotonen Spline anpassen können, der Daten interpoliert, die selbst nicht monoton sind. Die Beobachtung beix = 6
ist größery
als die Beobachtungen beix = 5
. Sie müssen nur diesen Teil der Antwort ignorieren :-)mono.con
die für einen kubischen Spline zurückgegeben werden.?pcls
Es gibt Beispiele für dünne Plattensplines und additive Modelle, die weniger benutzerfreundlich sind als die oben genannten, die jedoch möglicherweise mehr Rechenaufwand bedeuten, wenn Sie mit den Mathematiken für diese Spline-Typen vertraut sind (ich bin selbst nicht so vertraut).Das kürzlich erschienene Betrugspaket von Natalya Pya, das auf dem Artikel "Shape constrained additive models" von Pya & Wood (2015) basiert, kann einen Teil des in Gavins exzellenter Antwort erwähnten Prozesses erheblich vereinfachen.
Es gibt eine Reihe von bs-Funktionen, die Sie verwenden können - im obigen Beispiel habe ich mpd für "monoton abnehmenden P-Spline" verwendet, aber es hat auch Funktionen, die Konvexität oder Konkavität entweder separat oder neben den monotonen Bedingungen erzwingen.
quelle