R package spatstat:如何使用点过程模型协变量作为从形状文件

时间:2017-04-30 05:34:39

标签: r r-raster spatstat

我有一个类似于this one from 2014,的问题已得到解答,但数据集不再可用且我们的原始数据结构不同。 (我正处于关键时刻并且难倒,所以如果你能够快速回应我会非常感激!!)

目标:在spatstat与康涅狄格州矿区的点过程模型(ppm)中使用基岩类型作为协变量。

数据:这些文件可从此Dropbox folder获得。岩石数据和CT多边形轮廓来自UConn Magic Library,矿山数据来自USGS矿产资源数据系统。

方法: 我加载了一些相关的包并读入了shapefile(和转换的坐标以匹配CT系统),并将CT多边形用作一个owin对象。

library(rgdal)
library(splancs)
library(spatstat)
library(sp)
library(raster) 
library(geostatsp)

#read in shapefiles
ct <-readOGR(".","CONNECTICUT_STATE_POLY")
mrds <-readOGR(".","mrds-2017-02-20-23-30-58") 
rock<-readOGR(".","bedrockpolyct_37800_0000_2000_s50_ctgnhs_1_shp_wgs84")

#convert mrds and rock to ct's coord system
tempcrs<-ct@proj4string
mrds<-spTransform(mrds,tempcrs)
rock<-spTransform(rock,tempcrs)

#turn ct shapefile into owin, call it w for window
w <-as.owin(ct)

#subset mrds data to just CT mines
mrdsCT <-subset(mrds,mrds@data$state=="Connecticut")

#ppm can't handle marked data yet, so need to unmark() 

#create ppp object for mrds data, set window to w
mrdsCT.ppp <-as.ppp(mrdsCT)
Window(mrdsCT.ppp)<-w

来自&#34;建模R&#34;中的空间点模式;通过Baddeley&amp;特纳(第39页): 不幸的是,spatstat中的像素图像不能具有分类(因子)值,因为R拒绝创建因子值矩阵。为了将分类变量表示为像素图像,分类值应该被编码为整数(为了效率)并且被分配给整数值像素图像。然后,模型公式应该在此图像上调用factor命令。例如,如果fim是具有表示因子级别的整数值的图像,则:

ppm(X, ˜factor(f), Poisson(), covariates=list(f=fim))

shapefile中包含几种不同类型的岩石分类。我对LITHO1很感兴趣,这是一个27级的因素。这是第六个属性。

litho1<-rock[,6]

我(有限但研究)的理解是我需要将shapefile转换为栅格,然后将其转换为图像以便以ppm使用。我从ct创建了一个掩码,并使用了它。

ctmask<-raster(ct, resolution=2000) 
ctmask[!is.na(ctmask)] <- 0
litho1rast<-rasterize(litho1,ctmask) 

在此之后,我已经尝试了几种方法,但尚未取得成功。我试图遵循链接问题中列出的方法,并在文档中搜索相关的例子(因素,批准,级别)。与之前的问题不同,我的数据已经是一个因素,因此我不清楚为什么要将因子函数应用于它。

查看litho1rast,@ data @ attributes数据帧包含以下内容。如果我绘制它,它只是绘制ID; levelplot函数确实绘制了LITHO1。当我应用因子函数时,ID将被保留但不会保留LITHO1。

$ ID    : int [1:1891] 1 2 3 4 5 6 7 8 9 10 ...    
$ LITHO1: Factor w/ 27 levels "amphibolite",..: 23 16 23 16 23 16 24 23 16 24 ... 

ppm模型需要一个对象类im,所以我将光栅转换为im。我试过两种方法。我可以使ppm执行...但它将每个点视为一个因素而不是27个级别(使用litho1.im或litho1.im2)......

litho1.im<-as.im(litho1rast)
litho1.im2<-as.im.RasterLayer(litho1rast)

model1=ppm(unmark(mrdsCT.ppp) ~ factor(COV1), covariates=list(COV1=litho1.im))
model1

所以,我不太确定从哪里开始。看起来我需要将一个参数传递给as.im,以便它知道保留LITHO1而不是ID。 聪明的想法或导致相关功能或方法非常受欢迎!

2 个答案:

答案 0 :(得分:0)

查看您的代码,您似乎没有向field提供rasterize参数。

来自rasterize帮助:

  

field数字或字符。要转移的价值。这个可以   是一个数字,或长度相同的数字向量   空间要素(点,线,多边形)的数量。 如果x是a   Spatial * DataFrame,这可以是变量的列名   转移。如果缺少,则使用属性索引(即数字   从1到特征数量)。您还可以提供矢量   长度与空间要素的数量相同,或者矩阵在哪里   行数与空间要素数相匹配

在这一行:

litho1rast<-rasterize(litho1,ctmask)

您可能必须指定要在栅格化中使用litho对象的哪一列。类似的东西:

litho1rast<-rasterize(litho1,ctmask, field = "LITHO1")

答案 1 :(得分:0)

Baddeley&amp; amp;特纳不再是真的 - 引用来自一套非常古老的研讨会笔记。

班级im的像素图片可以包含因子值(自2011年起)。如果Z是整数值像素图像(类im),则可以通过设置levels(Z) <- levlev设置为因子值图像,其中rasterize是字符向量可能值的标签。

您不需要使用rock[,6]:应该可以使用as.immaptools直接转换为像素图像(在加载{{1}}包之后)。< / p>

请参阅Baddeley,Rubak和Turner的书(空间点模式:R 的方法和应用,CRC Press,2016)以获得完整的解释。