ppp 对象的规则是什么?是否可以为 sapply 函数选择两个变量?

What are the rules for ppp objects? Is selecting two variables possible for an sapply function?

使用描述 spatstat 中泊松簇过程的代码。一次分解每一行代码来理解。容易上手。

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

定义 window 后,我会使用随机生成函数生成我的点数

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)

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

中的点
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 returns $运算符对原子向量无效。你能解释一下这是怎么回事吗?

非常感谢。

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

从您的 post 来看,您不清楚您是在尝试理解别人的代码,还是在自己开发代码。这对答案有影响。

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

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

  1. 创建 ppp object 的规则在 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 中是完全有效的语法。如果 object seeds1 是一个结构或列表,它有一个名为 marks 的组件,这反过来是一个结构或列表,它有一个名为 pops 的组件,那么习语 seeds1$marks$pops 将提取它。这与 sapply.
  3. 没有特别关系

现在转向代码中的错误,

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