首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中实现二维核密度估计的不同核

在R中实现二维核密度估计的不同核
EN

Stack Overflow用户
提问于 2013-11-20 22:56:07
回答 1查看 1.4K关注 0票数 4

我在寻找一些帮助,来理解如何实现二维核密度方法,其中包含各向同性方差,以及一个二元正态核,但不是使用典型的距离,因为数据在地球表面,我需要使用一个大圆距离。

我想在R中复制这一点,但是我不知道如何使用一个距离度量,除了简单的欧几里德距离,对于任何一个内置的估计量,因为它使用了一个复杂的卷积方法来添加核。有人有办法编写任意的内核吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-22 19:49:04

最后,我从海量库中修改了kde2d函数。需要进行一些重大修订,如下文所示。也就是说,代码非常灵活,允许使用任意的2-d内核。(rdist.earth()用于大圆距离,h是选择的带宽,在这里是km,n是要使用的每个方向上的网格点的数目。rdist.earth需要“字段”库)

该函数可以修改为在超过2d内执行计算,但是网格在更高的维度上变得非常快。(并不是说它现在很小。)

欢迎对优雅或表演提出意见和建议!

代码语言:javascript
复制
kde2d_mod <- function (data, h, n = 200, lims = c(range(data$lat), range(data$lon))) {
#Data is a matrix: lon,lat for each source. (lon,lat to match rdist.earth format.)
print(Sys.time()) #for timing

nx <- dim(data)[1]
if (dim(data)[2] != 2) 
stop("data vectors have only lat-long data")
if (any(!is.finite(data))) 
stop("missing or infinite values in the data are not allowed")
if (any(!is.finite(lims))) 
stop("only finite values are allowed in 'lims'")
#Grid:
g<-grid(n,lims) #Function to create grid.

#The distance matrix gets large... Can we work around it? YES WE CAN!
sets<-ceiling(dim(g)[1]/10000)
#Allocate our output:
z<-rep(as.double(0),dim(g)[1])

for (i in (1:sets)-1) {
   g_subset=g[(i*10000+1):(min((i+1)*10000,dim(g)[1])),]
   a_matrix<-rdist.earth(g_subset,data,miles=FALSE)

   z[(i*10000+1):(min((i+1)*10000,dim(g)[1]))]<- apply( #Here is my kernel...
    a_matrix,1,FUN=function(X)
    {sum(exp(-X^2/(2*(h^2))))/(2*pi*nx)}
   )
rm(a_matrix)
}

print(Sys.time())
#Un-transpose the final data.
z<-t(matrix(z,n,n))
dim(z)<-c(n^2,1)
z<-as.vector(z)
return(z)
}

这里的关键点是,任何内核都可以在内部循环中使用;缺点是,这是在网格点上进行评估的,因此需要一个高分辨率的网格来运行它;FFT很好,但我没有尝试过。

网格功能:

代码语言:javascript
复制
grid<- function(n,lims) {
num <- rep(n, length.out = 2L)
gx <- seq.int(lims[1L], lims[2L], length.out = num[1L])
gy <- seq.int(lims[3L], lims[4L], length.out = num[2L])

v1=rep(gy,length(gx))
v2=rep(gx,length(gy))
v1<-matrix(v1, nrow=length(gy), ncol=length(gx))
v2<-t(matrix(v2, nrow=length(gx), ncol=length(gy)))
grid_out<-c(unlist(v1),unlist(v2))

grid_out<-aperm(array(grid_out,dim=c(n,n,2)),c(3,2,1) ) #reshape
grid_out<-unlist(as.list(grid_out))
dim(grid_out)<-c(2,n^2)
grid_out<-t(grid_out)
return(grid_out)
}

您可以使用image.plot绘制这些值,并使用x,y点的v1矩阵和v2矩阵:

代码语言:javascript
复制
kde2d_mod_plot<-function(kde2d_mod_output,n,lims) ){
 num <- rep(n, length.out = 2L)
 gx <- seq.int(lims[1L], lims[2L], length.out = num[1L])
 gy <- seq.int(lims[3L], lims[4L], length.out = num[2L])

 v1=rep(gy,length(gx))
 v2=rep(gx,length(gy))
 v1<-matrix(v1, nrow=length(gy), ncol=length(gx))
 v2<-t(matrix(v2, nrow=length(gx), ncol=length(gy)))

 image.plot(v1,v2,matrix(kde2d_mod_output,n,n))
 map('world', fill = FALSE,add=TRUE)
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20108870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档