r - 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 返回的 $ 运算符对原子向量无效。你能解释一下这里发生了什么吗?
非常感谢。
解决方案
这是几个问题 - 请一次问一个问题。
从您的帖子中不清楚您是在尝试理解别人的代码,还是自己开发代码。这使得答案有所不同。
澄清一下,此代码并非来自spatstat
包内部;它是使用spatstat
包生成数据的某人的代码。包中有代码spatstat
可以生成泊松集群过程的模拟实现(我认为这是您想要做的),您可以查看spatstat
代码rPoissonCluster
以了解如何正确有效地完成它。
您在此处显示的代码有很多错误。但我将首先回答你标题中的两个问题。
- 创建
ppp
对象的规则在ppp
. 帮助说明如果给出了参数,则忽略window
不匹配的参数。...
这意味着该行seeds2<-ppp(x=x,y=y,window=win,marks=marks,pops=rpois(lambda=5,n=pmax(1,n.seeds)))
中的参数pops
将被忽略。 - 该成语
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))
推荐阅读
- git - 为单个用户挑选樱桃后合并期间的 git 冲突
- android - Android Studio 应用程序无法连接到 arduino 网络服务器
- swift - 对数组中的 2 个连续元素求和
- sql - 从oracle中的两个日期计算平均时间(以秒为单位)
- azure - Azure Logic App,无法从 CreateFile 函数获取数据
- r - 将多个 tabBox 动态添加到 shinydashboard
- java - 升级到 Spring Boot 2.2.2 后无法加载应用程序上下文
- jhipster - Jhipster 在实体更新后更新假数据 csv 文件
- angular - Angular 7 - 材料 - 表列过滤器和列排序 - 边缘
- python - Kubernetes 中使用 Ingress 的 Django 文档