2016-11-14 12 views
0

У меня есть кадр данных отображаемого лесного участка, где все древесные стебли имеют координаты X, Y, диаметр на высоте груди (в см) и выживание (0,1) (найденный здесь, названный «MFP14_surv_forSO.csv»: https://www.dropbox.com/sh/t10b53qcobvxlzg/AACZyASgudtFLiZ79QRIjHH_a?dl=0).Интерполяция внутри окна с использованием сплюстата выходит из одной точки

Я создал образец пространственной точки, а затем сглаженное ядро ​​(im object) большой стеблевой смерти в качестве прокси-сервера для навеса «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 

Но когда я интерполировать, он покидает одну из точек - Есть 4873 наблюдения в surv14 и только 4872 в интерполяции, ext. Поэтому, когда я пытаюсь связать меру gappiness моего кадра данных с помощью cbind я получаю следующее сообщение об ошибке:

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 

На данный момент у вас есть заметный узор точка с двумя различными марками: diam90 и surv, и избежать осложнений, я буду только держать diam90 (так как мы знаем surv является 0 для всех точек):

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

Продолжая свой код следующий CRE ели death.fun, которая является функцией R двух аргументов 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) 

Однако, вы не можете прекрасно представлять исходное окно в этой резолюции .Пункт номер 1850 из surv14 находится внутри исходного окна , но не цифровое приближение:

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 Браун спросил:

Я не знаю, как выяснить, чего он уходит из, и почему.

В команде 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.

+0

Спасибо за добавление примечания о аргументе 'drop = FALSE'; Я должен был проверить настройки по умолчанию более внимательно! –