使用 spatstat 在 window 内进行插值会遗漏一个点

Interpolation within window using spatstat leaves out one point

我有一个映射森林图的数据框,其中所有树干都有 X、Y 坐标、胸高直径(以厘米为单位)和生存率 (0,1)(在此处找到,名为 "MFP14_surv_forSO.csv": https://www.dropbox.com/sh/t10b53qcobvxlzg/AACZyASgudtFLiZ79QRIjHH_a?dl=0).

我创建了一个空间点模式,然后创建了一个平滑的大茎死亡内核(im 对象)作为树冠 "gappiness"(或光穿透量)的代理。我认为大茎是指直径 >9cm 的茎,“0”存活表示茎死亡。

我想将这个 "gappiness" 的度量值插值到所有树干上。我已经知道模式中有几个点位于 window 之外,因此我使用 inside.owin() 将这些点排除在分析之外以对数据框进行子集化。

surv14 <- read.csv("MFP14_surv_forSO.csv")
win14 <- owin(poly=list(x=c(0,250,250,225,225,0),y=c(0,0,50,50,100,100)))  #specifying window extent
surv14 <- surv14[inside.owin(surv14[,1],surv14[,2], win14)==TRUE,]  #removing points outside of window
death <- surv14[!is.na(surv14$diam90) & surv14$diam90>9,]  #subsetting only large stems
death <- death[death$surv==0,]  #subsetting only the large stems that died
death.pp <- as.ppp(death,win14)  #creating point pattern from large stem death
death.fun <- Smoothfun(death.pp,sigma=10,edge=TRUE)  #smoothed kernel of large stem death
im <- as.im(death.fun)  #converting smoothed kernel into im object
ext <- im[surv14[,1:2]]  #yields pixel values of gappiness for each stem
surv14 <- cbind(surv14,ext)  #adding gappiness measure to data frame

但是当我插值时,它遗漏了一个点 - surv14 中有 4873 个观测值,而插值 ext 中只有 4872 个观测值。因此,当我尝试使用 cbind 将间隙度量绑定到我的数据框时,我收到以下错误消息:

Error in data.frame(..., check.names = FALSE) : 
arguments imply differing number of rows: 4873, 4872

我不知道如何弄清楚它遗漏了哪一点以及为什么。任何指导将不胜感激!

这个失败的原因有点复杂

我将尝试检查您的代码并解释发生了什么:

library(spatstat)
surv14 <- read.csv("MFP14_surv_forSO.csv")
win14 <- owin(poly=list(x=c(0,250,250,225,225,0),y=c(0,0,50,50,100,100)))  #specifying window extent
surv14 <- surv14[inside.owin(surv14[,1],surv14[,2], win14)==TRUE,]  #removing points outside of window
death <- surv14[!is.na(surv14$diam90) & surv14$diam90>9,]  #subsetting only large stems
death <- death[death$surv==0,]  #subsetting only the large stems that died
death.pp <- as.ppp(death,win14)  #creating point pattern from large stem death

此时你有一个带有两个不同标记的标记点图案: diam90surv,为了避免并发症,我只会保留 diam90(因为我们知道 surv 对于所有点都是 0):

marks(death.pp) <- marks(death.pp)$diam90

继续您的代码,您接下来创建 death.fun 这是一个 R 函数 两个参数 xy 并且它 returns 内核平滑树 位置 x,y 处的直径必须在多边形 window 内 win14 以上定义。

death.fun <- Smoothfun(death.pp, sigma=10, edge=TRUE)  #smoothed kernel of large stem death

现在您将此函数转换为具有默认分辨率的像素图像 封闭矩形上方 128x128 像素。

im <- as.im(death.fun)  #converting smoothed kernel into im object

在一个简单的图上用原来的 window 覆盖了数字 近似值看起来不错:

plot(im, main = "")
plot(win14, add = TRUE, border = "green", lwd = 3)

但是,你不能完美地代表原来的window 解析度。 surv14 的点号 1850 在原来的 window 里面 但不是数字近似:

inside.owin(surv14$X[1850], surv14$Y[1850], win14)
#> [1] TRUE
inside.owin(surv14$X[1850], surv14$Y[1850], Window(im))
#> [1] FALSE

然后你通过两列 data.frame 对像素图像进行子集化 被解释为点列表和每个点的像素值 在图像的 window 内返回 。因此只有4872分 返回:

ext <- im[surv14[,1:2]]  #yields pixel values of gappiness for each stem
length(ext)
#> [1] 4872

解决这个问题的简单方法是直接使用 death.fun 并跳过 像素近似:

ext <- death.fun(surv14$X, surv14$Y)
#> Warning in ppp(X$x, X$y, window = win, check = check): data contain
#> duplicated points
length(ext)
#> [1] 4873

那么你的最后一行代码应该可以工作:

surv14 <- cbind(surv14,ext)  #adding gappiness measure to data frame

请注意,我还没有考虑使用 这里的间隙测量值。我会把它留给你。

AJ 布朗问:

I don't know how to figure out which point it's leaving out, and why.

在命令 ext <- im[surv14[,1:2]] 中,您使用 [.im 在坐标 surv14[,1:2] 的位置提取像素图像值。 [.im 的帮助说它有一个参数 drop 指定位于像素化 window 之外的位置是应该省略(drop=TRUE)还是应该 return NA 值 (drop=FALSE)。默认值为 drop=TRUE,因此如果您在像素化 window 之外有任何位置,则生成的向量 ext 将比预期的短。所以如果你这样做

ext <- im[surv14[,1:2], drop=FALSE]

然后您可以使用 is.na(ext) 找到违规点。

在此特定示例中您不需要像素化,因此最好只使用 Smoothfun,正如 Ege 所建议的。