2014-01-16 10 views
9

Ich habe ein bisschen eine bizarre Frage, aber ich hoffe, jemand kann mir helfen. Ich versuche, eine Oberflächendarstellung des Grund eines Sees zu erstellen und dann einige Punkte zeigt Pflanzen Frequenz für eine visuelle von hinzufügen, wo Wasserpflanzen sind im ganzen See auftreten.Einstellen einer oberen Grenze von 0 auf einem 3d Löss Glättung mit negativen Werten in R

Momentan arbeite ich an der Erstellung des Oberflächendiagramms sowohl in scatterplot3d als auch in wireframe mit den Scatterplot3d- bzw. Gitterpaketen in R. Um den gewünschten Plottentyp zu erhalten, habe ich die Tiefen in negative umgewandelt Werte (man stelle sich die Wasseroberfläche des Sees als 0 auf der Z-Achse) erzeugt, dann ein Löß Modell durch Breiten- und Längenkoordinaten der Tiefe. Ein Problem, das ich habe, ist jedoch, dass das Lößmodell positive Tiefen voraussagt (was natürlich in einem See unmöglich ist; man kann nur aus einer Tiefe von 0 in die Wassersäule gehen).

Beispiel

x <- seq(1,100,1) 
y <- seq(1,100,1) 
depth <- rbeta(100, 1, 50)*100 
depth <- -depth 

dep.lo <- loess(depth~x*y, degree=2, span=.25) # this shows a big warning, but it works 
coord.fit <- expand.grid(x=x, y=y) 
coord.fit$depth <- as.numeric(predict(dep.lo, newdata=coord.fit)) 
range(coord.fit$depth) 
    # -14.041011 6.986745 

Wie Sie sehen, meine Tiefe geht von -14 bis fast 7. Gibt es eine Möglichkeit, eine obere Schranke auf einem Löss-Modell zu setzen, so dass mein Modell nicht diese Art nicht erreicht von positiven Werten?

Vielen Dank für jede Hilfe,
Paul

+5

versuchen Sie eine GAMM mit einer Log-Verbindung, mit dem 'mgcv'-Paket. –

Antwort

6

Wenn Sie ein Löss Modell verwenden möchten, können Sie eine Transformation verwenden Ihre Variable bleibt negativ zu gewährleisten. Sie wurden die Warnungen bekommen, weil alle Ihre Punkte über eine Leitung waren, so ein bisschen die Daten zu ändern:

set.seed(123) 
n = 100 
x <- c(0, runif(n, min=1, max=100), 100) 
y <- c(0, runif(n, min=1, max=100), 100) 
depth <- rbeta(n+2, 1, 50)*100 
depth <- -depth 
range(depth) 

[1] -13.27248715 -0.01520178 

Ihre ursprüngliche Beispiel verwenden, würden Sie bekommen:

dep.lo <- loess(depth~x*y, degree=2, span=.25) 
coord.fit <- expand.grid(x=seq(1,100,1), y=seq(1,100,1)) 
coord.fit$depth <- as.numeric(predict(dep.lo, newdata=coord.fit)) 
range(coord.fit$depth) 

[1] -7.498542 2.397855 

Die Transformation log(-depth) sein kann Beispiel:

tiny = 1e-3 
nlogdepth = log(-depth + tiny) # adding 'tiny' to ensure depth is not 0 
dep.lo <- loess(nlogdepth~x*y, degree=2, span=.25) 
coord.fit <- expand.grid(x=x, y=y) 
coord.fit$depth <- -exp(as.numeric(predict(dep.lo, newdata=coord.fit))) + tiny 
range(coord.fit$depth) 

[1] -16.9366043 -0.1091614 
Verwandte Themen