【问题标题】:What are the rules for ppp objects? Is selecting two variables possible for an sapply function?ppp对象的规则是什么?是否可以为 sapply 函数选择两个变量?
【发布时间】:2020-11-13 15:33:28
【问题描述】:

在 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)

我遇到的第一个问题是,一个名为 pops 的对象被添加到 ppp 对象中,该对象描述了窗口的人口。我了解这些值是如何得出的,它是给定输入值 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 返回的 $ 运算符对原子向量无效。你能解释一下这里发生了什么吗?

非常感谢。

【问题讨论】:

    标签: r spatstat


    【解决方案1】:

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

    从您的帖子中不清楚您是想理解别人的代码,还是自己开发代码。这会对答案产生影响。

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

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

    1. ppp 对象的创建规则在ppp 的帮助文件中列出。帮助说明如果给出了参数window,那么不匹配的参数... 将被忽略。这意味着在seeds2&lt;-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的组件,而后者又是一个结构或列表,其中有一个名为@987654335的组件@,然后成语 seeds1$marks$pops 将提取它。这与sapply 无关。

    现在转向代码中的错误,

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多