2014-01-16 40 views
9

我有点奇怪的问题,但希望有人能帮助我。我正在尝试创建一个湖底的表面图,然后添加一些显示植物频率的点,以便查看整个湖中水生植物的发生情况。在R值为负值的3d黄土上平滑设置0的上界值

现在我正在使用scatterplot3d和lattice包分别在R中创建scatterplot3d和线框中的曲面图。为了实现我感兴趣的绘图类型,我已将深度转换为负值值(想象湖的水面在z轴上为0),然后通过纬度和经度坐标创建深度的黄土模型。然而,我遇到的一个问题是,黄土模型预测的是正深度(当然,这在湖中是不可能的;只能从深度0深入到水体中)。

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 

正如你看到的,我的深度-14变为几乎7.是否有一种方法来设置一个上限黄土模式,使我的模型并没有实现这些种类正值?

感谢您的帮助,
保罗

+5

尝试使用'mgcv'软件包与日志链接配合使用GAMM。 –

回答

6

如果你想使用黄土模型,你可以使用一个转换,以确保您的变量仍然为负。你都拿到了警告,因为所有的点都在一条线,所以改变了一下数据:使用你原来的例子

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 

,你会得到:

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 

的转换可以log(-depth)为例如:

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