2016-05-28 7 views
1

Ich habe Probleme, eine LOESS-Regression mit einem Datensatz zu konkurrieren. Ich konnte die Linie richtig erstellen, aber ich kann sie nicht korrekt darstellen.Probleme bei der Anzeige der LOESS-Regressionslinie und des Konfidenzintervalls

Ich lief die Daten so durch.

animals.lo <- loess(X15p5 ~ Period, animals, weights = n.15p5)  
animals.lo  
summary(animals.lo)  
plot(X15p5~ Period, animals)  
lines(animals$X15p5, animals.lo, col="red") 

An diesem Punkt erhielt ich einen Fehler

"Fehler in xy.coords (x, y): 'x' und 'y' Längen unterscheiden"

I gesucht herum und las, dass dieses Problem wegen der Punkte sein könnte, die bestellt werden müssen, also ging ich weiter.

a <- order(animals$Period)  
lines(animals$X15p5[a], animals.lo$Period[a], col="red", lwd=3) 

Es gab zu diesem Zeitpunkt keine Fehler, aber die LOESS-Linie wurde immer noch nicht in der Auftragung angezeigt. Die Punkte wurden korrekt angezeigt, aber nicht die Linie.

Dies ist vergleichbar mit dem Datensatz ich verwende ...

structure(list(Site = c("Cat", "Dog", "Bear", "Chicken", "Cow", 
"Bird", "Tiger", "Lion", "Leopard", "Wolf", "Puppy", "Kitten", 
"Emu", "Ostrich", "Elephant", "Sheep", "Goat", "Fish", "Iguana", 
"Monkey", "Gorilla", "Baboon", "Lemming", "Mouse", "Rat", "Hamster", 
"Eagle", "Parrot", "Crow", "Dove", "Falcon", "Hawk", "Sparrow", 
"Kite", "Chimpanzee", "Giraffe", "Bear", "Donkey", "Mule", "Horse", 
"Zebra", "Ox", "Snake", "Cobra", "Iguana", "Lizard", "Fly", "Mosquito", 
"Llama", "Butterfly", "Moth", "Worm", "Centipede", "Unicorn", 
"Pegasus", "Griffin", "Ogre", "Monster", "Demon", "Witch", "Vampire", 
"Mummy", "Ghoul", "Zombie"), Region = c(6L, 4L, 4L, 5L, 7L, 6L, 
2L, 4L, 6L, 7L, 7L, 4L, 6L, 4L, 4L, 4L, 4L, 3L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 8L, 4L, 6L, 6L, 
4L, 2L, 7L, 4L, 2L, 2L, 7L, 3L, 4L, 7L, 4L, 4L, 4L, 7L, 7L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 8L), Period = c(-2715, -3500, 
-3500, -4933.333333, -2715, -2715, -2715, -3500, -2715, -4350, 
-3500, -3500, -2950, -4350, -3650, -3500, -3500, -2715, -3650, 
-4350, -3500, -3500, -3400, -4350, -3500, -3500, -4350, -3900, 
-3808.333333, -4233.333333, -3500, -3900, -3958.333333, -3900, 
-3500, -3500, -3500, -2715, -3650, -2715, -2715, -2715, -2715, 
-3500, -2715, -2715, -3500, -4350, -3650, -3650, -4350, -5400, 
-3500, -3958.333333, -3400, -3400, -4350, -3600, -4350, -3650, 
-3500, -2715, -5400, -3500), Value = c(0.132625995, 0.163120567, 
0.228840125, 0.154931973, 0.110047847, 0.054347826, 0.188679245, 
0.245014245, 0.128378378, 0.021428571, 0.226277372, 0.176923077, 
0.104938272, 0.17659805, 0.143798024, 0.086956522, 0.0625, 0.160714286, 
0, 0.235588972, 0, 0, 0.208333333, 0.202247191, 0.364705882, 
0.174757282, 0, 0.4, 0.1, 0.184027778, 0.232876712, 0.160493827, 
0.74702381, 0.126984127, 0.080645161, 0.06557377, 0, 0.057692308, 
0.285714286, 0.489361702, 0.108695652, 0.377777778, 0, 0.522727273, 
0.024390244, 0.097560976, 0.275, 0, 0.0625, 0.255319149, 0.135135135, 
0.216216216, 0.222222222, 0.296296296, 0.222222222, 0.146341463, 
0.09375, 0.125, 0.041666667, 0.078947368, 0.2, 0.137931034, 0.571428571, 
0.142857143), Sample_size = c(188.5, 105.75, 79.75, 70, 52.25, 
46, 39.75, 39, 37, 35, 34.25, 32.5, 32.4, 30.76666667, 30.36666667, 
28.75, 28, 28, 28, 26.6, 25, 25, 24, 22.25, 21.25, 20.6, 20, 
20, 20, 19.2, 18.25, 18, 18, 16.8, 15.5, 15.25, 15, 13, 12.6, 
11.75, 11.5, 11.25, 11, 11, 10.25, 10.25, 10, 10, 9.6, 9.4, 9.25, 
9.25, 9, 9, 9, 8.2, 8, 8, 8, 7.6, 7.5, 7.25, 7, 7), Sample_sub = c(25, 
17.25, 18.25, 10.8452381, 5.75, 2.5, 7.5, 9.555555556, 4.75, 
0.75, 7.75, 5.75, 3.4, 5.433333333, 4.366666667, 2.5, 1.75, 4.5, 
0, 6.266666667, 0, 0, 5, 4.5, 7.75, 3.6, 0, 8, 2, 3.533333333, 
4.25, 2.888888889, 13.44642857, 2.133333333, 1.25, 1, 0, 0.75, 
3.6, 5.75, 1.25, 4.25, 0, 5.75, 0.25, 1, 2.75, 0, 0.6, 2.4, 1.25, 
2, 2, 2.666666667, 2, 1.2, 0.75, 1, 0.333333333, 0.6, 1.5, 1, 
4, 1)), .Names = c("Site", "Region", "Period", "Value", "Sample_size", 
"Sample_sub"), class = "data.frame", row.names = c(NA, -64L)) 

ich für diese eine Zeit lang gearbeitet haben und versuchen, so viel wie ich kann, zu lesen, aber ich habe nicht in der Lage gewesen, um zusätzliche Fortschritte zu machen. Jeder Rat oder jede Anleitung würde sehr geschätzt werden.


Follow-up über das Hinzufügen von Konfidenzintervall plotten

Ich habe in Konfidenzintervall versucht, mit einem anderen Beispiel auf der Website auf dieser Seite How to get the confidence intervals for LOWESS fit using R? gefunden hinzuzufügen.

Das Beispiel auf dieser Seite gegeben ist:

plot(cars) 
plx<-predict(loess(cars$dist ~ cars$speed), se=T) 

lines(cars$speed,plx$fit) 
lines(cars$speed,plx$fit - qt(0.975,plx$df)*plx$se, lty=2) 
lines(cars$speed,plx$fit + qt(0.975,plx$df)*plx$se, lty=2) 

ich angepasst, dass wie folgt aus:

plot(X15p5 ~ Period, animals) 
animals.lo2<-predict(loess(animals$X15p5 ~ animals$Period), se=T) 
a <- order(animals$Period) 
lines(animals$Period[a],animals.lo2$fit, col="red", lwd=3) 
lines(animals$Period[a],animals.lo2$fit - qt(0.975,animals.lo2$df)*animals.lo2$se, lty=2) 
lines(animals$Period[a],animals.lo2$fit + qt(0.975,animals.lo2$df)*animals.lo2$se, lty=2) 

Obwohl dieses Konfidenzintervall liefert, ist die Regressionslinie alles falsch. Ich bin mir nicht sicher, ob es ein Problem mit der predict Funktion oder einem anderen Problem ist. Danke noch einmal!

+0

Sorry, das Beispiel war nicht das genaue Set, das ich verwendete. Das X15p5 entspricht dem Wert und das n.X15p5 entspricht Sample_size. Deine Erklärung hat funktioniert. Vielen Dank! – Corey

Antwort

3

richtiger Code

ich um gesucht und gelesen, dass dieses Problem auf den Punkt fällig könnte, um zu bestellen, so ging ich.

Nein, nein. Das Bestellproblem hängt nicht mit dem angezeigten Fehler zusammen.Um den Fehler zu überwinden, müssen Sie

lines(animals$X15p5, animals.lo, col="red") 

mit

lines(animals$Period, animals.lo$fitted, col="red") 

Hier sind Gründe ersetzen:

  1. loess gibt eine Liste von Objekten, nicht einen einzigen Vektor. Siehe str(animals.lo) oder names(animals.lo).
  2. Warum verwenden Sie animals$X15p5 als X-Achse? Sie passen Ihr Modell: X15p5 ~ Period, so sollte x-Achse Period sein.

über

Nachbestellung benötigen Sie Bestellung zu tun, weil standardmäßig R Linien Punkte, um nach oben. Nehmen Sie dies als Beispiel:

set.seed(0); x <- runif(100, 0, 10) ## x is not in order 
set.seed(1); y <- sqrt(x) ## plot curve y = sqrt(x) 
par(mfrow = c(1,2)) 
plot(x, y, type = "l") ## this is a mess!! 
reorder <- order(x) 
plot(x[reorder], y[reorder], type = "l") ## this is nice 

foo

Ähnlich tun:

a <- order(animals$Period)  
lines(animals$Period[a], animals.lo$fitted[a], col="red", lwd=3) 

Follow-up auf Konfidenzintervall

Versuchen Sie folgendes:

plot(X15p5 ~ Period, animals) 
animals.lo <- loess(X15p5 ~ Period, animals) 
pred <- predict(animals.lo, se = TRUE) 
a <- order(animals$Period) 
lines(animals$Period[a], pred$fit[a], col="red", lwd=3) 
lines(animals$Period[a], pred$fit[a] - qt(0.975, pred$df)*pred$se[a],lty=2) 
lines(animals$Period[a], pred$fit[a] - qt(0.975, pred$df)*pred$se[a],lty=2) 

Sie haben vergessen, erneut zu sortieren. Sie müssen sowohl angepasste Werte als auch Standardfehler neu anordnen.

Jetzt das dist ~ speed Modell für cars Daten müssen nicht neu angeordnet werden. Denn:

is.unsorted(cars$speed) ## FALSE 

Ja, Daten sind dort schon sortiert.

Hinweis Ich habe zwei weitere Änderungen am Code vorgenommen:

  1. ich loess Anruf und predict Anruf getrennt haben; Vielleicht müssen Sie das nicht tun, aber es ist im Allgemeinen eine gute Angewohnheit, Modellanpassung und Modellvorhersage zu trennen und eine Kopie beider Objekte zu behalten.
  2. Ich habe loess(animals$X15p5 ~ animals$Period) zu loess(X15p5 ~ Period, animals) geändert. Es ist eine schlechte Angewohnheit, $ anmelden, um Modellformel anzugeben. Ich habe eine andere Antwort unter https://stackoverflow.com/a/37307270/4891738, die den Nachteil eines solchen Stils zeigt. Sie können auf dem Abschnitt "update" dort nachlesen. Ich habe die glm als ein Beispiel verwendet, aber für lm, glm, loess, sind die Dinge gleich.
+0

Wunderbar! Vielen Dank. LOESS kann auf viele verschiedene Arten verwendet werden, und Erklärungen passen nicht immer zu der Art, wie Menschen sie benutzen wollen.Vielen Dank für den richtigen Code, aber auch die Erklärung! – Corey

+0

Es tut uns leid, ein zusätzliches Follow-up zu stellen, aber ich möchte auch die Konfidenzintervalle hinzufügen. Ich hatte gesehen, dass einige unter Verwendung der LOESS- und Vorhersagefunktion empfohlen wurden, aber wenn ich den Code ähnlich wie in dem Beispiel verwendete, war die ursprüngliche LOESS-Kurve ziemlich unterschiedlich. Das Beispiel ist wie folgt: --- Grundstück (Autos) plx <-predict (Löß (Autos $ dist ~ Autos $ Geschwindigkeit), se = T) Linien (Autos $ Geschwindigkeit, plx $ fit) Linien (Autos $ Geschwindigkeit, plx $ fit - qt (0.975, plx $ df) * plx $ se, lty = 2) Linien (Autos $ Geschwindigkeit, plx $ fit + qt (0.975, plx $ df) * plx $ se, lty = 2) – Corey

+0

Danke, dass du so schnell zurück bist. Ich habe den Beitrag mit dem anderen vorgeschlagenen Code aktualisiert und wie ich ihn an meinen Datensatz angepasst habe. Auch hier wird jede Hilfe sehr geschätzt! – Corey

Verwandte Themen