2016-03-23 14 views
0

Ich wollte zonale Perzentilen in R für Rasterwerte mit einem Gridcode berechnen, mit dem DoBy-Paket. Bestimmte Perzentile funktionieren perfekt, andere erzeugen mehr oder weniger NA-Werte, in diesem Fall -9999. Was kann die Ursache für diese Diskrepanz sein?R Quantile: -9999 für einige Quantile

HINWEIS: Alle NA-Werte erscheinen in Polygonen, die nicht vollständig mit dem Raster überlappen, für das ich mich interessiere. Dies erklärt jedoch nicht, warum einige Perzentile berechnen, andere nicht.

Meine angewendet Perzentil Funktionen:

quant1<-function(x,na.rm=TRUE){(quantile(x, c(.01), na.rm = TRUE))} 
quant5<-function(x,na.rm=TRUE){(quantile(x, c(.05), na.rm = TRUE))} 
quant15<-function(x,na.rm=TRUE){(quantile(x, c(.15), na.rm = TRUE))} 
quant25<-function(x,na.rm=TRUE){(quantile(x, c(.25), na.rm = TRUE))} 
quant75<-function(x,na.rm=TRUE){(quantile(x, c(.75), na.rm = TRUE))} 
quant85<-function(x,na.rm=TRUE){(quantile(x, c(.85), na.rm = TRUE))} 
quant95<-function(x,na.rm=TRUE){(quantile(x, c(.95), na.rm = TRUE))} 
quant99<-function(x,na.rm=TRUE){(quantile(x, c(.99), na.rm = TRUE))} 

Anwendung von Funktionen:

q1<-summaryBy(RASTERVALU~grid_code,data=depth, FUN=quant1, keep.names=T) 
q5<-summaryBy(RASTERVALU~grid_code,data=depth, FUN=quant5, keep.names=T) 
q15<-summaryBy(RASTERVALU~grid_code,data=depth, FUN=quant15, keep.names=T) 
q25<-summaryBy(RASTERVALU~grid_code,data=depth, FUN=quant25, keep.names=T) 
q75<-summaryBy(RASTERVALU~grid_code,data=depth, FUN=quant75, keep.names=T) 
q85<-summaryBy(RASTERVALU~grid_code,data=depth, FUN=quant85, keep.names=T) 
q95<-summaryBy(RASTERVALU~grid_code,data=depth, FUN=quant95, keep.names=T) 
q99<-summaryBy(RASTERVALU~grid_code,data=depth, FUN=quant99, keep.names=T) 

Dies sollte mein Verständnis entfernen Werte NA vor der Berechnung und erzeugen Ergebnisse für alle Polygone, unabhängig von der Pixelzahl zu.

Folgt einer Ausgabetabelle der Berechnung. Perzentil 1 und 15 werden am stärksten von NA-Werten geplagt.

q1 q5 q15 q25 q75 q85 q95 q99 
-9999 -82.7934989929199 -9999 -9999 -82.6172466278076 -82.5455478668213 -82.4335483551025 -82.3479396057129 
-9999 -82.0279998779297 -9999 -9999 -81.7740020751953 -81.6869964599609 -81.6319034576416 -81.6039762878418 
-9999 -68.5245018005371 -9999 -68.6367511749268 -68.4617481231689 -68.4400024414062 -68.4128520965576 -68.318980255127 
-9999 -68.1529998779297 -9999 -68.6242504119873 -67.9940013885498 -67.9098526000977 -67.8197998046875 -67.6305767059326 
-9999 -66.0965003967285 -9999 -9999 -65.9724998474121 -65.9219970703125 -65.7605514526367 -65.6639614868164 
-9999 -65.2804985046387 -9999 -9999 -64.8652515411377 -64.7608005523682 -64.5118511199951 -64.4869895172119 
-9999 -62.7045001983643 -9999 -9999 -62.5639991760254 -62.4821016311646 -62.2751508712769 -62.1119895172119 
-9999 -62.5089988708496 -9999 -62.6920013427734 -62.3634986877441 -62.2785495758057 -62.1639013290405 -62.1359615707397 
-9999 -62.3390007019043 -9999 -9999 -62.1464996337891 -62.088650894165 -62.031251335144 -61.9182501983643 
-9999 -58.6590003967285 -9999 -9999 -58.3725004196167 -58.1434007644653 -57.8779983520508 -57.6537393188477 
-9999 -58.4934997558594 -9999 -58.8072500228882 -58.3682489395142 -58.3038509368896 -58.1767482757568 -58.0499892425537 
-9999 -56.1360015869141 -9999 -56.3297491073608 -56.0120010375977 -55.9688512802124 -55.8899494171143 -55.8329501724243 
-9999 -53.9230003356934 -9999 -54.2092504501343 -53.8269996643066 -53.7830009460449 -53.6978017807007 -53.6589603805542 
-9999 -48.9314994812012 -9999 -9999 -48.7105007171631 -48.6123992919922 -48.5179513931274 -48.4739890289307 
-9999 -42.2854995727539 -9999 -42.8615007400513 -41.8812494277954 -41.6038501739502 -41.3591510772705 -40.5169882965088 
-9999 -42.1614990234375 -9999 -42.2462491989136 -42.0267505645752 -41.9099998474121 -41.8459506988525 -41.8219386291504 
-9999 -38.1544990539551 -9999 -9999 -37.8874998092651 -37.6593996047974 -37.4445497512817 -37.3039208602905 
-9999 -33.1689987182617 -9999 -33.2529983520508 -33.1027507781982 -33.0769996643066 -33.0347497940063 -33.0139999389648 
-9999 -29.6655006408691 -9999 -9999 -29.5527496337891 -29.5060005187988 -29.4157503128052 -29.3299599266052 
-9999 -29.638500213623 -9999 -29.7770004272461 -29.5520000457764 -29.5209999084473 -29.4968997955322 -29.4849806022644 
-9999 -29.0570001602173 -9999 -9999 -28.9180006980896 -28.8618495941162 -28.7558505058289 -28.6939602470398 
-9999 -27.1759996414185 -9999 -9999 -27.0627498626709 -27.0209999084473 -26.9890003204346 -26.9459791564941 
-9999 -25.918999671936 -9999 -25.9869995117188 -25.8700008392334 -25.8515495300293 -25.8089500427246 -25.7189898681641 

Was könnte diesen Effekt erklären?

Hinweis: Meine Daten haben keine NA-Werte. Bestimmte Raster haben nur eine geringere Anzahl von Pixeln.

UPDATE: Ja, die Daten haben -9999 für NA-Werte, albern und einfach Fehler. Danke für die Hilfe!

Antwort

1

ich tun würde:

library(raster) 
r <- raster(ncols=10, nrows=10) 
r[] <- runif(ncell(r)) * 1:ncell(r) 
z <- r 
z[] <- rep(1:5, each=20) 

quants <- c(0.01, 0.05, 0.15, 0.25, 0.75, 0.85, 0.95, 0.99) 

q <- zonal(r, z, function(i, ...) quantile(i, quants)) 
colnames(q) <- c("zone", quants) 
q 

nun Ihre Daten eindeutig Werte von -9999 hat. Diese sind nicht NA, sie sind -9999. Aus diesem Grund haben Ihre niedrigsten Quantilwerte diesen Wert. Wenn Sie sie NA sein wollen, können Sie versuchen:

NAvalue(r) <- -9999 
q <- zonal(r, z, function(i, ...) quantile(i, quants, na.rm=TRUE)) 

oder

x <- reclassify(r, cbind(-9999, NA)) 
q <- zonal(r, z, function(i, ...) quantile(i, quants, na.rm=TRUE)) 
1

Von wo ich sitze, macht Ihr Ergebnis Sinn. -9999 werden in die unteren (0,1 und 0,15) Quantile "klassifiziert".

> quantile(c(rep(-9999, 15), rnorm(50, mean = -50, sd = 5)), prob = c(0.1, 0.15, 0.25, 0.75)) 
     10%   15%   25%   75% 
-9999.00000 -9999.00000 -60.11869 -49.44009 

Beachten Sie auch, dass nach Ihrer Notation, quant5 Funktion wahrscheinlich quant50 sein sollte.

+0

aber was ich daraus zu machen? Ich habe Werte für all diese Pixel .. selbst wenn es zwei Pixel gibt, möchte ich ein numerisches Ergebnis erhalten, dass das Quantil 0,01 dem niedrigeren Wert entspricht. Und danke für die Köpfe auf dem Quant5-50-Ding! – Castle

+0

@Sander Entschuldigung, das war nicht Teil Ihrer Frage (nur eine Anmerkung). Bitte öffnen Sie eine neue Frage zu diesem Thema. Stellen Sie sicher, dass Sie ein [reproduzierbares Beispiel] angeben (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). –