我有一个奇怪的问题,但希望有人能帮助我。我试图创建一个湖底的表面图,然后添加一些点来显示植物的频率,以便直观地了解整个湖中水生植物的生长位置。

现在,我正在分别使用R中的scatterplot3d和grid包在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。是否有办法为黄土模型设定上限,以使我的模型无法达到这些正值?

谢谢你的帮助,
保罗

最佳答案

如果要使用黄土模型,可以使用转换以确保变量保持负值。之所以收到警告,是因为所有要点都在一条线上,因此请稍稍更改一下数据:

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

关于r - 在R中将负值设置为3d黄土平滑时,将上限设置为0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21166218/

10-12 19:15