2016-11-14 100 views
0

我有一個映射森林圖的數據框,其中所有樹幹都有X,Y座標,胸高(cm)和存活率(0,1)(在這裏找到,名爲「MFP14_surv_forSO.csv」:https://www.dropbox.com/sh/t10b53qcobvxlzg/AACZyASgudtFLiZ79QRIjHH_a?dl=0)。使用spatstat窗口內的插值留下了一個點

我創建了一個空間點模式,然後是一個大莖幹死亡的平滑內核(im對象),作爲冠層「gappiness」(或光透入量)的代理。我認爲大莖的直徑大於9釐米,而'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

這種失敗的原因有點複雜。

我會嘗試去通過您的代碼,並解釋這是怎麼回事:

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 

繼續你的代碼下一個CRE吃death.fun其中是R函數的兩個參數xy 並將其返回內核平滑樹 直徑在位置X,Y必須是上文所定義的多邊形窗口 win14內部。

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

現在將此功能轉換爲像素圖像的默認分辨率128×128 像素在封閉的矩形。

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 

請注意,我還沒有考慮過是否使用 這個缺點的衡量標準。我會把它留給你。

+0

我真的很感謝您的詳細回覆!這很有意義。我避免了像素逼近,直接使用'death.fun',問題得到解決。 –

0

AJ布朗問:

我不知道如何找出哪些點它的離開了,爲什麼。

在您使用[.im在具有座標surv14[,1:2]的位置來提取像素的圖像值的命令ext <- 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建議的那樣。

+0

感謝您添加關於'drop = FALSE'參數的註釋;我應該更仔細地檢查默認設置! –