使用 spatstat 进行点模式分类:如何选择合适的带宽?
Point pattern classification with spatstat: how to choose the right bandwidth?
我仍在努力寻找对双变量点模式进行分类的最佳方法:
Point pattern classification with spatstat: what am I doing wrong?
我现在使用@Adrian 的建议 sigma=bw.diggle
分析了我的数据集的 110 个样本(因为我想要一个自动带宽选择)。 f
是一个“资源选择函数”(RSF),它描述了癌点过程的强度与协变量(这里是免疫核密度)之间的关系:
Cancer <- split(cells)[["tumor"]]
Immune <- split(cells)[["bcell"]]
Dimmune <- density(Immune,sigma=bw.diggle)
f <- rhohat(Cancer, Dimmune)
我对我得到的一些结果有疑问。十几个 rho 函数看起来很奇怪(中断,单峰)。在更改为默认 sigma=NULL
或 sigma=bw.scott
(更平滑)后,功能变得“更好”(参见下面的示例)。我还尝试了以下操作:
cells # bivariate point pattern with marks "tumor" and "bcell"
o.marks<-cells$marks # original marks
#A) randomly re-assign original marks
a.marks <- sample(cells$marks)
#B) replace marks randomly with a 50/50 proportion
b.marks<-as.factor(sample(c("tumor","bcell"), replace=TRUE, size=length(o.marks)))
#C) random (homogenious?) pattern with the original number of points
randt<-runifpoint(npoints(subset(cells,marks=="tumor")),win=cells$window)
randb<-runifpoint(npoints(subset(cells,marks=="bcell")),win=cells$window)
cells<-superimpose(tumor=randt,bcell=randb)
#D) tumor points are associated with bcell points (is "clustered" a right term?)
Cancer<-rpoint(npoints(subset(cells,marks=="tumor")),Dimmune,win=cells$window)
#E) tumor points are segregated from bcell points
reversedD<-Dimmune
density.scale.v<-sort(unique((as.vector(Dimmune$v)[!is.na(as.vector(Dimmune$v))]))) # density scale
density.scale.v.rev<-rev(density.scale.v)# reversed density scale
new.image.v<-Dimmune$v
# Loop over matrix
for(row in 1:nrow(Dimmune$v)) {
for(col in 1:ncol(Dimmune$v)) {
if (is.na(Dimmune$v[row, col])==TRUE){next}
number<-which(density.scale.v==Dimmune$v[row, col])
new.image.v[row, col]<-density.scale.v.rev[number]}
}
reversedD$v<-new.image.v # reversed density
Cancer<-rpoint(npoints(subset(cells,marks=="tumor")),reversedD,win=cells$window)
@Adrian 在下面的 post 中给出了生成反密度热图的更好方法。
我无法为 bw.diggle
密度生成 rpoint
模式,因为它产生负值 numbers.Thus 我替换了负值 Dimmune$v[which(Dimmune$v<0)]<-0
并且可以 运行 rpoint
然后。正如@Adrian 在下面的 post 中解释的那样,这是正常的,可以通过使用 density.ppp
选项 positive=TRUE
.
更容易地解决
我首先使用 bw.diggle
,因为 hopskel.test
表示我所有模式的“聚类”。现在我将使用 bw.scott
进行分析,但这个决定是否合理?除了“RSF-function is looking weird”还有更好的方法吗?
一些例子:
示例 10:
样本 20:
示例 110:
问题太多了!
请尝试每个post只问一个问题。
但这里有一些关于 spatstat
的技术问题的答案。
负值:
density.ppp
的帮助解释了由于数值效应,可能会出现小的负值。要强制密度值为非负数,请在对 density.ppp
的调用中使用参数 positive=TRUE
。例如 density(Immune, bw.diggle, positive=TRUE)
.
反转图像:反转图像中值的顺序Z
您可以使用以下代码:
V <- Z
A <- order(Z[])
V[][A] <- Z[][rev(A)]
那么V
就是倒序图
代码提示:
要生成与现有点模式 X
具有相同点数和相同 window 的随机点模式,请使用 Y <- runifpoint(ex=X)
。
要提取点模式 X
的标记,请使用 a <- marks(X)
。要为点模式 X
分配新标记,请使用 marks(X) <- b
.
要随机排列附加到点模式 X
中的点的标记,请使用 Y <- rlabel(X)
.
将新标记分配给点模式 X
,其中新标记是从给定的值向量 m
中随机抽取并替换的,使用 Y <- rlabel(X, m, permute=FALSE)
.
我仍在努力寻找对双变量点模式进行分类的最佳方法:
Point pattern classification with spatstat: what am I doing wrong?
我现在使用@Adrian 的建议 sigma=bw.diggle
分析了我的数据集的 110 个样本(因为我想要一个自动带宽选择)。 f
是一个“资源选择函数”(RSF),它描述了癌点过程的强度与协变量(这里是免疫核密度)之间的关系:
Cancer <- split(cells)[["tumor"]]
Immune <- split(cells)[["bcell"]]
Dimmune <- density(Immune,sigma=bw.diggle)
f <- rhohat(Cancer, Dimmune)
我对我得到的一些结果有疑问。十几个 rho 函数看起来很奇怪(中断,单峰)。在更改为默认 sigma=NULL
或 sigma=bw.scott
(更平滑)后,功能变得“更好”(参见下面的示例)。我还尝试了以下操作:
cells # bivariate point pattern with marks "tumor" and "bcell"
o.marks<-cells$marks # original marks
#A) randomly re-assign original marks
a.marks <- sample(cells$marks)
#B) replace marks randomly with a 50/50 proportion
b.marks<-as.factor(sample(c("tumor","bcell"), replace=TRUE, size=length(o.marks)))
#C) random (homogenious?) pattern with the original number of points
randt<-runifpoint(npoints(subset(cells,marks=="tumor")),win=cells$window)
randb<-runifpoint(npoints(subset(cells,marks=="bcell")),win=cells$window)
cells<-superimpose(tumor=randt,bcell=randb)
#D) tumor points are associated with bcell points (is "clustered" a right term?)
Cancer<-rpoint(npoints(subset(cells,marks=="tumor")),Dimmune,win=cells$window)
#E) tumor points are segregated from bcell points
reversedD<-Dimmune
density.scale.v<-sort(unique((as.vector(Dimmune$v)[!is.na(as.vector(Dimmune$v))]))) # density scale
density.scale.v.rev<-rev(density.scale.v)# reversed density scale
new.image.v<-Dimmune$v
# Loop over matrix
for(row in 1:nrow(Dimmune$v)) {
for(col in 1:ncol(Dimmune$v)) {
if (is.na(Dimmune$v[row, col])==TRUE){next}
number<-which(density.scale.v==Dimmune$v[row, col])
new.image.v[row, col]<-density.scale.v.rev[number]}
}
reversedD$v<-new.image.v # reversed density
Cancer<-rpoint(npoints(subset(cells,marks=="tumor")),reversedD,win=cells$window)
@Adrian 在下面的 post 中给出了生成反密度热图的更好方法。
我无法为 bw.diggle
密度生成 rpoint
模式,因为它产生负值 numbers.Thus 我替换了负值 Dimmune$v[which(Dimmune$v<0)]<-0
并且可以 运行 rpoint
然后。正如@Adrian 在下面的 post 中解释的那样,这是正常的,可以通过使用 density.ppp
选项 positive=TRUE
.
我首先使用 bw.diggle
,因为 hopskel.test
表示我所有模式的“聚类”。现在我将使用 bw.scott
进行分析,但这个决定是否合理?除了“RSF-function is looking weird”还有更好的方法吗?
一些例子:
示例 10:
问题太多了!
请尝试每个post只问一个问题。
但这里有一些关于 spatstat
的技术问题的答案。
负值:
density.ppp
的帮助解释了由于数值效应,可能会出现小的负值。要强制密度值为非负数,请在对 density.ppp
的调用中使用参数 positive=TRUE
。例如 density(Immune, bw.diggle, positive=TRUE)
.
反转图像:反转图像中值的顺序Z
您可以使用以下代码:
V <- Z
A <- order(Z[])
V[][A] <- Z[][rev(A)]
那么V
就是倒序图
代码提示:
要生成与现有点模式
X
具有相同点数和相同 window 的随机点模式,请使用Y <- runifpoint(ex=X)
。要提取点模式
X
的标记,请使用a <- marks(X)
。要为点模式X
分配新标记,请使用marks(X) <- b
.要随机排列附加到点模式
X
中的点的标记,请使用Y <- rlabel(X)
.将新标记分配给点模式
X
,其中新标记是从给定的值向量m
中随机抽取并替换的,使用Y <- rlabel(X, m, permute=FALSE)
.