使用spatstat在窗口内插入一个点

时间:2016-11-14 17:28:14

标签: r spatstat

我有一个映射的森林图的数据框,其中所有树干都有X,Y坐标,胸高(cm)和生存(0,1)(在此处找到,名为“MFP14_surv_forSO.csv”) :https://www.dropbox.com/sh/t10b53qcobvxlzg/AACZyASgudtFLiZ79QRIjHH_a?dl=0)。

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

我想在所有树干上插入这种“gappiness”度量。我已经知道模式中有几个点位于窗口之外,因此我使用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个观测值,插值中只有4872个ext。因此,当我尝试使用cbind将gappiness度量绑定到我的数据框时,我收到以下错误消息:

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

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

2 个答案:

答案 0 :(得分:0)

这种失败的原因有点复杂。

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

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

继续编写代码,然后创建一个R函数death.fun 两个参数xy,它返回内核平滑树 x,y位置的直径,必须在多边形窗口内 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

在简单的情节上,原始窗口覆盖了数字 近似看起来很好:

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

但是,您无法在此完美地表示原始窗口 解析度。 surv14的点号1850在原始窗口内 但不是数字近似:

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对像素图像进行子集化 被解释为点列表和每个点的像素值 返回图像窗口内的。因此只有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

请注意,我没有考虑使用它是否是个好主意 这里的差距度量。我会把它留给你。

答案 1 :(得分:0)

AJ布朗问:

  

我不知道如何弄清楚它遗漏了哪一点,以及原因。

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

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

然后,您可以使用is.na(ext)查找有问题的点。

在这个特定的例子中你不需要像素化,所以最好只使用Smoothfun,就像Ege所建议的那样。