首页 > 解决方案 > ppp对象的规则是什么?是否可以为 sapply 函数选择两个变量?

问题描述

在 spatstat 中使用描述泊松集群过程的代码。一次一个地分解每一行代码以便理解。容易上手。

library(spatstat)
lambda<-100
win<-owin(c(0,1),c(0,1))
n.seeds<-lambda*win$xrange[2]*win$yrange[2]

一旦定义了窗口,我就会使用随机生成函数生成我的点

x=runif(min=win$xrange[1],max=win$xrange[2],n=pmax(1,n.seeds))
y=runif(min=win$yrange[1],max=win$yrange[2],n=pmax(1,n.seeds))

这可以立即绘制我知道使用 ppp 函数

seeds<-ppp(x=x,
y=y,
window=win)

plot(seeds)

下一行我为 ppp 对象添加标记,它显然描述了点的旋转角度,我现在不明白这是如何工作的,但没关系,我稍后会弄清楚。

marks<-data.frame(angles=runif(n=pmax(1,n.seeds),min=0,max=2*pi))
seeds1<-ppp(x=x,
           y=y,
           window=win,
           marks=marks)

我遇到的第一个问题是在 ppp 对象中添加了一个名为 pops 的对象,它描述了窗口的人口。我了解这些值是如何得出的,它是给定输入值 mu 的泊松分布,它可以是任何值,并且观察总数等于窗口中的点。

seeds2<-ppp(x=x,
            y=y,
            window=win,
            marks=marks,
            pops=rpois(lambda=5,n=pmax(1,n.seeds)))

我的第一个问题是,如何在 ppp 对象中添加一个没有分类的变量?我检查了 ppp 文档,没有提到 pops。

我的第二个问题是关于使用双变量,下一行需要一个 sapply 函数来定义维度。

dim1<-pmax(1,sapply(seeds1$marks$pops, FUN=function(x)rpois(n=1,sqrt(x))))

我从未见过 $ 函数被使用过两次,而seeds2$marks$pop 返回的 $ 运算符对原子向量无效。你能解释一下这里发生了什么吗?

非常感谢。

标签: rspatstat

解决方案


这是几个问题 - 请一次问一个问题。

从您的帖子中不清楚您是在尝试理解别人的代码,还是自己开发代码。这使得答案有所不同。

澄清一下,此代码并非来自spatstat包内部;它是使用spatstat包生成数据的某人的代码。包中有代码spatstat可以生成泊松集群过程的模拟实现(我认为这是您想要做的),您可以查看spatstat代码rPoissonCluster以了解如何正确有效地完成它。

您在此处显示的代码有很多错误。但我将首先回答你标题中的两个问题。

  1. 创建ppp对象的规则在ppp. 帮助说明如果给出了参数,则忽略window不匹配的参数。...这意味着该行seeds2<-ppp(x=x,y=y,window=win,marks=marks,pops=rpois(lambda=5,n=pmax(1,n.seeds))) 中的参数pops将被忽略
  2. 该成语sapply(seeds1$marks$pops, FUN=f)在 R 中是完全有效的语法。如果对象seeds1是具有名为 的组件的结构或列表marks,而后者又是具有名为 的组件的结构或列表pops,则该成语seeds1$marks$pops将提取它。这与sapply.

现在转向代码中的错误,

  • 该行n.seeds<-lambda*win$xrange[2]*win$yrange[2]可能是为了计算窗口中集群父母(集群种子)的预期数量。这只有在窗口是一个左下角位于原点 (0,0) 的矩形时才有效。写起来会更安全n.seeds <- lambda * area(win)
  • 但是,该变量n.seeds稍后会使用,因为它是集群父母(集群种子)的数量。作者忘记了种子的数量是随机的,服从泊松分布。所以,更正确的计算是n.seeds <- rpois(1, lambda * area(win))
  • 然而,这仍然不正确,因为窗口外的集群父节点(种子点)也可以在窗口内生成后代点。因此,种子点实际上必须在通过扩展获得的更大窗口中生成win。内部spatstat用于生成集群父级的适当命令是bigwin <- grow.rectangle(Frame(win), cluster_diameter) ; Parents <- rpoispp(lambda, bigwin)
  • 作者显然想为每个父点分配两个标记值:一个随机angle数和一个随机数pops。正确的方法是制作marks一个包含两列的数据框,例如marks(seeds1) <- data.frame(angles=runif(n.seeds, max=2*pi), pops=rpois(n.seeds, 5))

推荐阅读