使用蒙特卡罗方法查找区域的区域

时间:2017-05-03 13:55:51

标签: spatial

我有兴趣找到暗灰色区域的区域,在r中我使用了spatstat包的区域功能,但由于我需要运行mh算法而非常耗时,我已经读过我可以计算这个区域使用蒙特卡罗方法,但我不知道如何继续,请有人可以帮助我吗?

enter image description here

来自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)

3 个答案:

答案 0 :(得分:5)

您要问的是一个简单的蒙特卡罗应用程序。您需要在整个区域绘制统一样本,并检查您所在地区内所选点的比例。

要检查某个点是否位于该区域内,您可以使用圆周方程的中心半径形式描述您的区域(您的区域只是一个圆圈)。

点击链接:

  

http://geekyisawesome.blogspot.com.au/2013/03/montecarlo-method-of-finding-area-of.html

[1]: https://i.stack.imgur.com/VKS

答案 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