2017-10-12 6 views
3

Ich habe ein Problem beim Versuch, density Objekte zu plotten. Betrachten wir zum BeispielProblem mit dem Plotten von "Dichte" -Objekten

require(grDevices) 

set.seed(43) 
d0 = density(rexp(1e5,rate=1)) 
d1 = density(rexp(1e5,rate=1.8)) 


plot(d1, col="white", xlab = "x", ylab="Density", main = "") 
polygon(d1, col=adjustcolor("blue", alpha.f=0.2)) 
lines(d0, col="white") 
polygon(d0, col=adjustcolor("red", alpha.f=0.2)) 

enter image description here

Im Augenblick scheint es, als ich erwartet hatte. Das Problem tritt auf, wenn auf niedrige Werte der Y-Achse gezoomt wird. Betrachten wir zum Beispiel

plot(d1, col="white", xlim=c(2.5,3), xlab = "x", ylab="Density", main = "", 
ylim=c(0,0.02)) 
polygon(d1, col=adjustcolor("blue", alpha.f=0.2)) 
lines(d0, col="white", xlim=c(2.5,3), ylim=c(0,0.02)) 
polygon(d0, col=adjustcolor("red", alpha.f=0.2)) 

enter image description here

Merkwürdigerweise der untere Teil der Polygone nicht erreichen, Dichte = 0. Auch ein Polygon endet niedriger ist als die andere. Das Problem besteht weiterhin bei der Einstellung yaxs="i" und xaxs="i".

Was ist los und wie löst man dieses Problem?


mit einigen persönlichen Daten, bekomme ich Dinge wie

enter image description here

Antwort

2

Eine weitere Option ist die x-Bereich der Dichte Schätzung ein wenig über den Bereich der Daten zu erweitern, so dass die Dichte Schätzung wirklich effektiv Null an beiden Enden sein. Dies vermeidet die Notwendigkeit, irgendwelche Werte in der Dichteabschätzung künstlich zu ändern. Zum Beispiel:

set.seed(43) 
d0 = density(rexp(1e5,rate=1)) 
d1 = density(rexp(1e5,rate=1.8)) 

d1$y[c(1, length(d1$y))] 

[1] 2.987316e-03 1.235864e-06

set.seed(43) 
d1 = rexp(1e5,rate=1.8) 
d1 = density(d1, from=min(d1) - 0.05*diff(range(d1)), to=max(d1) + 0.05*diff(range(d1))) 

d1$y[c(1, length(d1$y))] 

[1] 6.334144e-17 3.797333e-17

+2

Diese Lösung hat ein bisschen mehr eine "Behandlung der Ursache" Vibe dazu als meine haben ;) – AkselA

1

Können Sie betrügen, indem nur an beiden Enden die y-Werte auf Null zu verankern?

set.seed(43) 
d0 = density(rexp(150,rate=1)) 
d1 = density(rexp(150,rate=1.8)) 

d0$y[c(1, length(d0$y))] <- 0 
d1$y[c(1, length(d1$y))] <- 0 

plot(d1, col="white", xlim=c(2.5,3), xlab = "x", ylab="Density", main = "", 
ylim=c(0,0.02)) 
polygon(d1, col=adjustcolor("blue", alpha.f=0.2)) 
lines(d0, col="white", xlim=c(2.5,3), ylim=c(0,0.02)) 
polygon(d0, col=adjustcolor("red", alpha.f=0.2)) 

enter image description here

Eine leichte Verbesserung wäre es, die gesamte Polygon zu senken, so dass eines der Enden der Basislinie berührt, und dann das nächste zu Null gesetzt:

set.seed(43) 
d0 = density(rexp(150,rate=1)) 
d1 = density(rexp(150,rate=1.8)) 

ends0 <- d0$y[c(1, length(d0$y))] 
ends1 <- d1$y[c(1, length(d1$y))] 

d0$y <- d0$y - min(ends0) 
d1$y <- d1$y - min(ends1) 

d0$y[c(1, length(d0$y))] <- 0 
d1$y[c(1, length(d1$y))] <- 0 


plot(d1, col="white", xlim=c(2.5,3), xlab = "x", ylab="Density", main = "", 
ylim=c(0,0.02)) 
polygon(d1, col=adjustcolor("blue", alpha.f=0.2)) 
lines(d0, col="white", xlim=c(2.5,3), ylim=c(0,0.02)) 
polygon(d0, col=adjustcolor("red", alpha.f=0.2)) 

enter image description here

Hier ist eine ohne Korrektur, zum Vergleich.

enter image description here

+0

Oh ... ich verstehe grob das Problem und die einfache Lösung jetzt. Es sieht wie eine schlechte Lösung aus, aber es behebt das Problem und könnte die einfachste mögliche Lösung sein. +1 –

+0

@ Remi.b: Ja, und wenn Sie die x-Wert-Endpunkte in der Handlung enthalten, können Sie mit einer unangenehmen gezackten Kante enden – AkselA

Verwandte Themen