Как создать гиперкадр, содержащий группы точек с метками, каждая из которых связана с уникальным окном в R - PullRequest
0 голосов
/ 02 октября 2018

У меня возникают трудности с преобразованием точечных паттернов в гиперкадры, несмотря на онлайновый поиск и консультации с Бэддли и Рубаком Пространственные точечные паттерны: методология и приложения с R. Я новичок в R и пространственной статистике.Любая помощь приветствуется!Моя ситуация: у меня есть точечный шейп-файл и полигональный шейп-файл из ГИС.Точечный шейп-файл содержит координаты xy, а также множество группирующих переменных, ковариат и переменных отклика.Шейп-файл полигона содержит координаты графика, в котором расположены точки, и включает столбец идентификатора графика.

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

PlotID  Point#  X Coord     Y Coord Color   Size    Sex     Weight  Growth
    A   1       514514.5    3372057 Red     Small   Female  10      0.5
    A   2       514484.2    3372062 Red     Medium  Male    14      0.6
    A   3       514517.8    3372017 Red     Large   Female  12      0.6
    B   1       524514.5    3372065 Blue    Small   Male    14      0.4
    B   2       524484.2    3372067 Blue    Small   Male    16      0.3
    B   3       524517.8    3372063 Blue    Large   Male    10      0.35
    C   1       504514.5    3372041 Red     Medium  Female  10      0.7
    C   2       504484.2    3372042 Red     Large   Female  12      0.4
    C   3       504517.8    3372038 Red     Small   Male    16      0.6
    D   1       504517.8    3372038 Blue    Small   Male    10      0.7
    D   2       504517.8    3372038 Blue    Medium  Female  12      0.3
    D   3       504517.8    3372038 Blue    Small   Male    16      0.6

Вышеупомянутый гиперкадр может быть использован для группировки точечных рисунков по цвету для анализа различий в точечных рисунках.

Я успешно преобразовал упрощенную версиюшейп-файлов к гиперкадру путем поднабора одного графика с соответствующими точками.Вот код:

    library(sp)
    library(spatstat)
    library(shapefiles)
    library(maptools)
    library(rgdal)

    x <- readShapeSpatial("Points_subset.shp") #creates a spatial points 
                                               #dataframe
    x.data <- slot(x,"data") #columns of the data frame used as marks 
    p <- readShapeSpatial("Plot_subset") #creates spatial polygons df.  
    w <- as(as(p,"SpatialPolygons"),"owin") #assign the plot boundary as the 
                                            #window of the point pattern
    y <- as(x, "SpatialPoints") #Assign point coordinates as spatial points
    z <- as(y, "ppp") #Convert to class "ppp"
    z <- z[w] #Assign the plot boundary as the window of the ppp
    marks(z) <- x.data #Attach the data.frame of variables to the ppp.
    plot(z) #Correctly produces 1 plot containing all points

Однако, когда я применяю один и тот же процесс для нескольких графиков, используя цикл, гиперкадр включает в себя информацию только из одного графика.Вот код для нескольких графиков:

    xm <- readShapeSpatial("Points_All.shp")
    xm.data <- slot(xm,"data")
    xn <- levels(unique(xm$PlotID)) #identify all plots

    pm <- readShapeSpatial("Plots_All.shp") 

    for(i in 1:length(xn)) {
    pm2 <- subset(pm, pm$PlotID == xn[i])
    wm2 <- as(as(pm2,"SpatialPolygons"),"owin")#list of polygon windows
    xm2 <- subset(xm, xm$PlotID == xn[i])
    xm2.data <- subset(xm.data, xm.data$PlotID == xn[i])
    ym <- as(xm2, "SpatialPoints")
    zm2 <- as.ppp(coordinates(ym),wm2)
    marks(zm2) <- xm2.data
    unitname(zm) <- c("metre","metres")
    plot(zm2, main=paste(xn[i])) #plots each plot's points with correct 
                                 #window
    }

Исследование zm2

    str(zm2) # Although all plots print above, "str" shows only the first 
             #plot 
    View(zm2)#Contains only the points of the first plot

Преобразование в гиперкадр

    zm2.hyp <- as.hyperframe(zm2)
    str(zm2.hyp) #as above, contains a row for each point of the first plot.
                 #hyperframe should include points for all plots

Как включить все графики в гиперкадр?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Ответ Адриана Баддели привел меня в правильном направлении, но мой код данных пришлось реорганизовать, прежде чем код заработал.Решение:

    #load points shapefile    
    xm <- readShapeSpatial("Points_All.shp")

    #coerce spatialpointdataframe to dataframe
    xm.df <- as.data.frame(xm) 

    #reorder df so X and Y data are the first columns as required for mapply
    xm.df.d <- xm.df[,c(5,6,25,1:4,7:24)]
    #Remove plotlevel data except plotID. Only point level data remains    
    xm.df.d <- xm.df.d[,-c(4,6,7,9,10)]

    #Create list of dataframes with all point data based on Plotnam.
    xm.df.l <- split(xm.df.d, f=xm.df.d$plotID)

    #select plot level data from df. Combine plot level to the hyperframe 
    #later
    plot.df <- xm.df[,c(3,6,9,10)]
    plot.df <- unique(plot.df)
    #check df length same as hyperframe length
    nrow(plot.df)

    #load plot polygons shapefile. Use as windows
    pm <- readShapeSpatial("Plots_All")

    #list of plots based on plotID
    pm.l <- split(pm, pm$plotID)
    #Coerce plots to owin type objects
    pm.l.win <- lapply(pm.l, as.owin)

#A Baddeley, E Rubak, R Turner - 2015 pg 55-56 details the mapply procedure
#Note: procedure will not work unless X and Y coord data are the first 2 
#columns of the df.
    zml <- mapply(as.ppp, X = xm.df.l, W = pm.l.win,SIMPLIFY=FALSE)

    H <- hyperframe(X=zml)

#combine the point pattern of the hyperframe with plot level data
#produces a hyperframe of ppp for each plot, with columns of plot level data 
#such as Vegetation Type for each plot. Data for each point, such as tree 
#height and species, are stored within the $marks 
    Final.hyp <- cbind.hyperframe(H,plot.df)
0 голосов
/ 04 октября 2018

Да, вам нужно расположить данные в гиперкадре для анализа.Каждая строка этого гиперкадра будет содержать все данные для одного экспериментального блока, то есть каждая строка гиперкадра будет содержать точечный шаблон, включая его многоугольник границы.

Однако в первом отображаемом блоке в вашем сообщении(озаглавленный «В качестве примера вот как я представляю гиперкадр») каждая строка содержит данные для одной точки.Это не то, что вы хотите.Данные в этом поле могут быть представлены как data.frame, и ваша первая задача - разделить их на группы, содержащие данные для каждого точечного шаблона.

Предположим, вы установили data.frame, содержащий все данные, набросанные в этом первом отображаемом окне.Назовите это df.Сначала мы разбиваем этот фрейм данных на несколько фреймов данных в соответствии с переменной PlotID:

dflist <- split(df, PlotID)

Результатом является список, каждый элемент которого является фреймом данных, с df[[i]], содержащим данные координатдля i-го точечного паттерна.

Далее вы хотите сопоставить эти фреймы данных с соответствующими граничными полигонами.Предположим, вы собрали граничные полигоны в виде списка blist, где blist[[i]] - это i-й полигон.Чтобы сопоставить координаты и границы,

plist <- mapply(as.ppp, X=dflist, W=blist, SIMPLIFY=FALSE)

Результатом должен быть список шаблонов точек (все остальные переменные, такие как Sex, Colour, будут "метками", прикрепленными к этим шаблонам).Из этого списка вы можете построить свой гиперкадр, например,

H <- hyperframe(X=plist)

, но вам понадобится больше столбцов в гиперкадре, чтобы соответствовать интересным моделям.

...