用R中的LinearK函数分析章鱼捕获量

用R中的LinearK函数分析章鱼捕获量,r,cluster-analysis,spatial,spatstat,R,Cluster Analysis,Spatial,Spatstat,我希望你能帮我解决这个我无法解决的问题。对不起,如果我在写这篇文章时犯了一些错误,我的英语现在有点生疏了 问题是。我有.shp数据,我想在R中分析。shp可以是表示捕捉章鱼的陷阱线的线,也可以是位于这些线正上方的点,表示我们捕捉章鱼的位置 我试图回答的问题是:章鱼是否有统计分组? 经过一点调查,我觉得我需要使用R及其linearK函数来回答这个问题,使用Maptools、SpatStat和Sp库 以下是我在RStudio中使用的代码: 加载库 library(spatstat) library

我希望你能帮我解决这个我无法解决的问题。对不起,如果我在写这篇文章时犯了一些错误,我的英语现在有点生疏了

问题是。我有.shp数据,我想在R中分析。shp可以是表示捕捉章鱼的陷阱线的线,也可以是位于这些线正上方的点,表示我们捕捉章鱼的位置

我试图回答的问题是:章鱼是否有统计分组?

经过一点调查,我觉得我需要使用R及其linearK函数来回答这个问题,使用Maptools、SpatStat和Sp库

以下是我在RStudio中使用的代码:

加载库

library(spatstat)
library(maptools)
library(sp)
使用轨迹创建linnet对象

t1<- as.linnet(readShapeSpatial("./20170518/t1.shp"))
绘制它以确保一切正常

plot(t1)

使用点创建ppp对象

p1<- as.ppp(readShapeSpatial("./20170518/p1.shp"))
p1绘图(p1)
如果(!is.vector(xrange)| | length(xrange)!=2 | | xrange[2L]<,则出现错误:
缺少需要TRUE/FALSE的值
此外:警告信息:
1:参数maxsize和markscale的解释已更改(在spatstat版本1.37-0及更高版本中)。现在,圆的大小是通过其直径测量的。
2:在plot.ppp(x,…,multiplot=FALSE,do.plot=FALSE)中:
所有标记值均为NA;仅打印位置。
3:在plot.ppp(x,…,multiplot=FALSE,do.plot=FALSE)中:
所有标记值均为NA;仅打印位置。
4:在plot.ppp(x,…,multiplot=FALSE,do.plot=FALSE)中:
所有标记值均为NA;仅打印位置。
5:在plot.ppp(x,…,multiplot=FALSE,do.plot=FALSE)中:
所有标记值均为NA;仅打印位置。
6:在plot.ppp(x,…,multiplot=FALSE,do.plot=FALSE)中:
所有标记值均为NA;仅打印位置。
7:在plot.ppp(x,…,multiplot=FALSE,do.plot=FALSE)中:
所有标记值均为NA;仅打印位置。
现在剩下的是将对象连接到lpp对象中,并使用linearK函数对其进行分析

> pt1 <- lpp(p1,t1)
> linearK(pt1)
Function value object (class ‘fv’)
for the function r -> K[L](r)
......................................
    Math.label     Description        
r   r              distance argument r
est {hat(K)[L]}(r) estimated K[L](r)  
......................................
Default plot formula:  .~r
where “.” stands for ‘est’
Recommended range of argument r: [0, 815.64]
Available range of argument r: [0, 815.64]
pt1线性标记(pt1) 函数值对象(类“fv”) 对于函数r->K[L](r) ...................................... 数学标签描述 距离变元 est{hat(K)[L]}(r)估计的K[L](r) ...................................... 默认绘图公式:。~r where“.”代表“est” 建议的参数范围r:[0815.64] 参数r的可用范围:[0815.64] 这就是我现在的情况。我不知道为什么绘图函数不能与我的ppp对象一起工作,以及如何理解linearK函数的返回。帮助(linearK)没有提供任何线索。因为我有很多轨迹,每个轨迹都有一组点,我想要的结果是某种总结,比如x轨迹分析、a分组、b分散和c未知

谢谢你的时间,如果你能帮我解决这个问题,我将不胜感激


编辑:这里有一个包含一天所有shp文件(包括轨迹和点)的zip文件链接,还有一个包含我的代码的txt文件。

前两条一般建议:(1)每次创建复杂对象时,都要在终端上打印出来,看看是否符合预期。(2)出现错误时,立即键入
traceback()
并复制输出。这将准确显示检测到错误的位置

ppp
对象必须包含研究区域(窗口)的规范。在您的代码中,对象
p1
是通过将类
SpatialPointsDataFrame
的数据转换为类
ppp
的对象创建的,该类数据不包括研究区域的规范,通过函数
as.ppp.SpatialPointsDataFrame
转换为类
ppp
的对象,在该类对象中,通过使用坐标。不幸的是,在您的示例中,
p1
中只有一个数据点,因此默认边界框是宽度为0、高度为0的矩形。[这可以通过打印
p1
来显示]此类对象通常可以由
spatstat
处理,但此特定对象会在函数
plot.solist
中触发一个错误,该函数期望windows具有非零大小。我将修复该错误,但

就你而言,我建议你这样做

Window(p1) <- Window(t1)

Window(p1)我已经找到了一个解决方案。正如Adrian Baddeley所注意到的,
owin
对象有一个问题。如果我以手动方式创建ppp对象而不是转换我的点集,这个问题似乎被绕过了(没有真正解决)

我还更改了
rgdal::readOGR
readShapeFile
函数,因为第一个函数已被弃用,这就是我收到警告的原因

这是我现在正在使用的R脚本,评论澄清:

#first install spatstat, maptools y sp

#load them

library(spatstat)
library(maptools)
library(sp)


#create an array of folders, will add more when everything works fine
folders=c("20170518")
for(f in folders){

  #read all shp from that folder, both points and tracks
  pointfiles <- list.files(paste("./",f,"/points", sep=""), pattern="*.shp$")
  trackfiles <- list.files(paste("./",f,"/tracks", sep=""), pattern="*.shp$")

  #for each point and track couple
  for(i in 1:length(pointfiles)){


    #create a linnet object with the track

    t<- as.linnet(rgdal::readOGR(paste("./",f,"/tracks/",trackfiles[i], sep="")))
    #plot(t)



    #create a ppp object for each set of points

    pre_p<-rgdal::readOGR(paste("./",f,"/points/",pointfiles[i], sep=""))
    #plot(p)
    #obtain the coordinates the current set of points
    c<-coordinates(pre_p)
    #create vector of x coords
    xc=c()
    #create vector of y coords
    yc=c()
    #not a very good way to fill my vectors but it works for my study area
    for(v in c){
      if(v>4000000){yc<-c(yc,v)}
      else {if(v<4000000 && v>700000){xc<-c(xc,v)}}
    }
    print(xc)
    print(yc)
    #create a ppp object using the vectors of x and y coords, and a window object
    #extracted from my set of points
    p=ppp(xc,yc,Window(as.ppp(pre_p)))

    #join them into an lpp object

    pt <- lpp(p,t)
    #plot(pt)

    #analize it with the linearK function, nsim=9 for testing purposes
    #envelope.lpp is the method for analyzing linear point patterns
    assign(paste("results",f,i,sep="_"),envelope.lpp(pt, nsim=9, fun=linearK))

  }#end for each points & track set
}#end for each day of study
#首先安装spatstat,maptools y sp
#装上
图书馆(spatstat)
图书馆(地图工具)
图书馆(sp)
#创建一个文件夹数组,当一切正常时将添加更多文件夹
文件夹=c(“20170518”)
用于(文件夹中的f){
#读取该文件夹中的所有shp,包括点和轨迹

点文件你更有可能得到一个很好的答案,你让这个例子完全重现。你,先生,完全正确。我在问题的底部添加了一个链接。谢谢你的兴趣。非常感谢阿德里安的回答。我也注意到ppp对象是我所有麻烦的开始,所以我决定尝试创建我的它以一种更为手动的方式工作,而且似乎很有效。
Window(p1) <- Window(t1)
#first install spatstat, maptools y sp

#load them

library(spatstat)
library(maptools)
library(sp)


#create an array of folders, will add more when everything works fine
folders=c("20170518")
for(f in folders){

  #read all shp from that folder, both points and tracks
  pointfiles <- list.files(paste("./",f,"/points", sep=""), pattern="*.shp$")
  trackfiles <- list.files(paste("./",f,"/tracks", sep=""), pattern="*.shp$")

  #for each point and track couple
  for(i in 1:length(pointfiles)){


    #create a linnet object with the track

    t<- as.linnet(rgdal::readOGR(paste("./",f,"/tracks/",trackfiles[i], sep="")))
    #plot(t)



    #create a ppp object for each set of points

    pre_p<-rgdal::readOGR(paste("./",f,"/points/",pointfiles[i], sep=""))
    #plot(p)
    #obtain the coordinates the current set of points
    c<-coordinates(pre_p)
    #create vector of x coords
    xc=c()
    #create vector of y coords
    yc=c()
    #not a very good way to fill my vectors but it works for my study area
    for(v in c){
      if(v>4000000){yc<-c(yc,v)}
      else {if(v<4000000 && v>700000){xc<-c(xc,v)}}
    }
    print(xc)
    print(yc)
    #create a ppp object using the vectors of x and y coords, and a window object
    #extracted from my set of points
    p=ppp(xc,yc,Window(as.ppp(pre_p)))

    #join them into an lpp object

    pt <- lpp(p,t)
    #plot(pt)

    #analize it with the linearK function, nsim=9 for testing purposes
    #envelope.lpp is the method for analyzing linear point patterns
    assign(paste("results",f,i,sep="_"),envelope.lpp(pt, nsim=9, fun=linearK))

  }#end for each points & track set
}#end for each day of study