在 R 中使用负值在 3d 黄土平滑上设置上限为 0
Posted
技术标签:
【中文标题】在 R 中使用负值在 3d 黄土平滑上设置上限为 0【英文标题】:Setting an upper bound of 0 on a 3d loess smoothing with negative values in R 【发布时间】:2014-02-05 14:55:20 【问题描述】:我有一个奇怪的问题,但希望有人能帮助我。我正在尝试创建一个湖底的表面图,然后添加一些显示植物频率的点,以便直观地了解整个湖中水生植物的位置。
现在,我正在分别使用 R 中的 scatterplot3d 和 lattice 包在 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。有没有办法在黄土模型上设置上限,这样我的模型就不会达到这些正值?
感谢您的帮助, 保罗
【问题讨论】:
使用mgcv
包尝试使用带有日志链接的 GAMM。
【参考方案1】:
如果您想使用黄土模型,您可以使用转换来确保您的变量保持负数。你收到警告是因为你所有的点都在一条线上,所以改变一下数据:
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 中使用负值在 3d 黄土平滑上设置上限为 0的主要内容,如果未能解决你的问题,请参考以下文章