我有一个映射的森林图的数据框,其中所有树干都有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
我不知道如何弄清楚它遗漏了哪一点,以及为什么。任何指导将不胜感激!
答案 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
此时,您有一个带有两个不同标记的标记点图案:
diam90
和surv
,为了避免并发症,我只会保留
diam90
(因为我们知道所有点surv
为0):
marks(death.pp) <- marks(death.pp)$diam90
继续编写代码,然后创建一个R函数death.fun
两个参数x
和y
,它返回内核平滑树
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所建议的那样。