我有兴趣找到暗灰色区域的区域,在r中我使用了spatstat包的区域功能,但由于我需要运行mh算法而非常耗时,我已经读过我可以计算这个区域使用蒙特卡罗方法,但我不知道如何继续,请有人可以帮助我吗?
来自spatstat book的一些代码示例,用于绘图和区域:
source("figurelayout.R")
source("startup.R")
llibrary(spatstat)
requireversion(spatstat, "1.41-1.073")
W <- as.owin(swedishpines)
x <- c(28,29,55,60,66)
y <- c(70,38,32,72,59)
X <- ppp(x=x,y=y, window = W)
u <- list(x=48,y=50)
u <- as.ppp(u, W)
rad <- 14
Xplusr <- dilation(X, rad) #
uplusr <- disc(rad, u) #bola de radio rad con centro en u
ovlap <- intersect.owin(uplusr, Xplusr)
B<-setminus.owin( disc( rad, c(u$x, u$y) ), Xplusr)
AIdemo <- layered(W,
ovlap,
Xplusr,
uplusr,
X,
u,B)
layerplotargs(AIdemo) <- list(list(),
list(col="darkgrey", border=NA),
list(lwd=2),
list(lwd=2, lty=2),
list(pch=16),
list(pch=3),
list(col="red", border=NA))
###################################################
### code chunk number 98: Unit.Rnw:3-5
###################################################
newplot(6, 0.7)
setmargins(0)
###################################################
### code chunk number 99: 13gibbs.Rnw:3214-3215
###################################################
plot(AIdemo, main="")
plot(setminus.owin( disc( rad, c(u$x, u$y) ), Xplusr))
area<-area(B)
答案 0 :(得分:5)
您要问的是一个简单的蒙特卡罗应用程序。您需要在整个区域绘制统一样本,并检查您所在地区内所选点的比例。
要检查某个点是否位于该区域内,您可以使用圆周方程的中心半径形式描述您的区域(您的区域只是一个圆圈)。
点击链接:
http://geekyisawesome.blogspot.com.au/2013/03/montecarlo-method-of-finding-area-of.html
答案 1 :(得分:0)
你的问题标题表明你想要使用蒙特卡罗,但问题本身只是说“我有兴趣找到暗灰色区域......”。在spatstat
中计算此区域的另一种方法是使用函数areaLoss
。
继续你的例子(我猜这是spatstat
书的配套网站上真正受版权保护的示例代码):
Y <- superimpose(u, X) # Centres of all circles
areaLoss(Y, rad, exact = TRUE) # Remaining area in each circle
areaLoss(Y, rad, exact = TRUE, subset = 1) # Only circle of interest
根据您拥有的重叠圆圈数量,这可能比您目前所做的更快。另外,根据设置exact = FALSE
的圈数可能会更快。
如果你真的想通过简单的蒙特卡罗来估计B
的面积,可以用几行代码来完成:
Bbox <- as.rectangle(B)
points <- runifpoint(1000, Bbox)
insideB <- inside.owin(points, w = B)
fraction <- mean(insideB)
area(Bbox) * fraction
答案 2 :(得分:-1)
感谢您的意见,以下是解决方案的代码:)
x.min <- min(W$xrange[1])
x.max <- max(W$xrange[2])
y.min <- min(W$yrange[1])
y.max <- max(W$yrange[2])
n.sims <- 1000
random.points <- data.frame(Q=runif(n=n.sims,x.min,x.max),
DOC=runif(n=n.sims,y.min,y.max))
random.points<-data.frame(Xinterval=runif(n=n.sims,x.min,x.max),Yinterval=runif(n=n.sims,y.min,y.max))
contador<-0
for ( ii in 1:n.sims ) {
if(inside.owin(random.points$Xinterval[ii], random.points$Yinterval[ii], w=B)
){
contador<-contador+1
}
}
estimatedArea<-area(W)*contador/n.sims