允许地图上的高加权点压低其他低权重点的选项

时间:2014-10-01 14:25:48

标签: r maps gis raster kriging

什么是一些好的克里金/插值思路/选项,允许高加权点在绘制的R图上的轻度加权点上出血?

康涅狄格州有八个县。我找到了质心,想要绘制这8个县的贫困率。其中三个县人口密集(约100万人),其他五个县人口稀少(约10万人)。由于这三个人口稠密的县有超过90%的州人口,我希望这三个人口密集的县完全“压倒”#34;地图和影响县界的其他点。

R Krig包中的fields函数有很多参数以及可以调用的协方差函数,但我不知道从哪里开始?

这里是可重现的代码,可以快速生成硬边界地图,然后是三个不同加权的地图。希望我可以对这段代码进行更改,但是它可能需要像geoRglm包那样更复杂的东西?三个加权地图中的两个看起来几乎相同,尽管其中一个加权地图是另一个加权的10倍。

https://raw.githubusercontent.com/davidbrae/swmap/master/20141001%20how%20to%20modify%20the%20Krig%20function%20so%20a%20huge%20weight%20overwhelms%20nearby%20points.R

谢谢!

hard-bordered connecticut map with county labels

example weighted map - fairfield, hartford, and new haven should overwhelm all other counties


编辑:这是我想要的行为的图片示例 -

enter image description here

3 个答案:

答案 0 :(得分:7)

免责声明 - 我不是克里格专家。 Krigging很复杂,需要很好地理解底层数据,方法和目的,以达到正确的结果。您可能希望尝试从GIS堆栈交换机上获取@whuber的输入,或通过他的网站(http://www.quantdec.com/quals/quals.htm)]或您认识的其他专家)与他联系。

那就是说,如果你只想达到你所要求的视觉效果而不是用于某种统计分析,我认为有一些相对简单的解决方案。


<强> 编辑:

正如您所评论的那样,虽然以下使用thetasmoothness参数的建议会使预测表面均匀,但它们同样适用于所有测量,因此不会扩展&#34;范围影响&#34;人口较稠密的县相对于人口较少的人口。在进一步考虑之后,我认为有两种方法可以实现这一点:通过改变协方差函数来依赖人口密度或使用权重,就像你所拥有的那样。正如我在下面写的那样,你的加权方法改变了krigging函数的误差项。也就是说,它反向缩放了块金方差。

enter image description here

正如您在半变异函数图像中所看到的,块金本质上是y轴截距,或者是同一位置的测量值之间的误差。权重影响熔核方差(sigma 2 )为sigma 2 / weight。因此,更大的权重意味着在小规模距离上的误差更小。但是,这不会改变半方差函数的形状,也不会对范围或窗台产生太大影响。

我认为最好的解决方案是让你的协方差函数取决于人口。但是,我不知道如何做到这一点,我也没有看到Krig这样做的任何论据。我试着在Krig示例中定义我自己的协方差函数,但只有错误。

抱歉,我无法提供更多帮助!

帮助理解Krigging的另一个重要资源是:http://www.epa.gov/airtrends/specialstudies/dsisurfaces.pdf


正如我在评论中所说,窗台和金块的价值以及半变异函数的范围是你可以改变以影响平滑的东西。通过在weights的调用中指定Krig,您正在改变测量误差的方差。也就是说,在正常使用中,预期权重与测量值的准确度成比例,从而更高的权重基本上代表更准确的测量。对于您的数据,这实际上并不正确,但它可能会给您带来您想要的效果。

要更改数据的插值方式,您可以在正在使用的简单Krig来电中调整两个(以及更多)参数:thetasmoothnesstheta调整半方差范围,这意味着当您增加theta时,更远的测量点会对估算值做出更多贡献。您的数据范围是

range <- data.frame(lon=range(ct.data$lon),lat=range(ct.data$lat))
range[2,]-range[1,]
       lon       lat
2 1.383717 0.6300484

所以,你的测量点变化大约1.4度lon和~0.6度纬度。因此,您可以指定该范围内的theta值,以了解其对结果的影响。通常,较大的theta会导致更平滑,因为您要为每个预测绘制更多值。

Krig.output.wt <- Krig( cbind(ct.data$lon,ct.data$lat) , ct.data$county.poverty.rate ,
                        weights=c( size , 1 , 1 , 1 , 1 , size , size , 1 ),Covariance="Matern", theta=.8)  
r <- interpolate(ras, Krig.output.wt)
r <- mask(r, ct.map)
plot(r, col=colRamp(100) ,axes=FALSE,legend=FALSE)
title(main="Theta = 0.8", outer = FALSE)
points(cbind(ct.data$lon,ct.data$lat))
text(ct.data$lon, ct.data$lat-0.05, ct.data$NAME, cex=0.5)

给出:

enter image description here

Krig.output.wt <- Krig( cbind(ct.data$lon,ct.data$lat) , ct.data$county.poverty.rate ,
                        weights=c( size , 1 , 1 , 1 , 1 , size , size , 1 ),Covariance="Matern", theta=1.6)  
r <- interpolate(ras, Krig.output.wt)
r <- mask(r, ct.map)
plot(r, col=colRamp(100) ,axes=FALSE,legend=FALSE)
title(main="Theta = 1.6", outer = FALSE)
points(cbind(ct.data$lon,ct.data$lat))
text(ct.data$lon, ct.data$lat-0.05, ct.data$NAME, cex=0.5)

给出:

enter image description here

添加smoothness参数将更改用于平滑预测的函数的顺序。默认值为0.5,导致二阶多项式。

Krig.output.wt <- Krig( cbind(ct.data$lon,ct.data$lat) , ct.data$county.poverty.rate ,
                        weights=c( size , 1 , 1 , 1 , 1 , size , size , 1 ),
                        Covariance="Matern", smoothness = 0.6)  
r <- interpolate(ras, Krig.output.wt)
r <- mask(r, ct.map)
plot(r, col=colRamp(100) ,axes=FALSE,legend=FALSE)
title(main="Theta unspecified; Smoothness = 0.6", outer = FALSE)
points(cbind(ct.data$lon,ct.data$lat))
text(ct.data$lon, ct.data$lat-0.05, ct.data$NAME, cex=0.5)

给出:

enter image description here

这应该为您提供一个开始和一些选项,但您应该查看fields的手册。它编写得很好,很好地解释了这些论点。 此外,如果这在任何方面是定量的,我强烈建议与具有重要空间统计知识的人交谈!

答案 1 :(得分:2)

克里金不是你想要的。 (这是准确的统计方法 - 没有失真! - 数据插值。它需要对数据进行初步分析 - 你没有足够的数据用于此目的 - 以及无法完成所需的地图失真。)

示例和对“流血”的引用建议考虑 anamorph area cartogram。这是一个地图,它将扩大和缩小县多边形区域,以便在保留其形状的同时反映其相对人口。链接(到SE GIS站点)解释并说明了这个想法。虽然它的答案不尽如人意,但search of that site将揭示一些有效的解决方案。

答案 2 :(得分:1)

上面有很多有趣的评论和引导。

我看了一下哈佛方言调查,以了解你想要先做的事情。我必须说真的很酷的地图。在我开始研究之前......我之前已经看过你的调查分析工作,并且学到了很多技巧。谢谢。

所以我第一次采取的很快就是如果你想通过核密度估计进行空间平滑,那么你需要考虑点过程模型。我确定还有其他办法,但那就是我去的地方。

所以我在下面做的是抓住一个非常通用的美国地图并将其转换成我可以用作采样窗口的东西。然后我在该区域内创建点的随机样本,只是假装那些是你的质心。在我将随机值附加到这些点并绘制之后。

我只是想在概念上进行测试,这就是为什么我没有通过额外的步骤去抓住cbsa,也很抱歉没有预测,但我认为这些是基础。哦,方言研究的平滑正在整个国家进行。我认为。那就是作者没有在多边形中对他的平滑过程进行分层......所以我最后添加了状态。

代码:

library(sp)
    library(spatstat)
    library(RColorBrewer)
    library(maps)
    library(maptools)

    # grab us map from R maps package
    usMap <- map("usa")
    usIds <- usMap$names

    # convert to spatial polygons so this can be used as a windo below
    usMapPoly <- map2SpatialPolygons(usMap,IDs=usIds)

    # just select us with no islands
    usMapPoly <- usMapPoly[names(usMapPoly)=="main",]

    # create a random sample of points on which to smooth over within the map
    pts <- spsample(usMapPoly, n=250, type='random')

    # just for a quick check of the map and sampling locations
    plot(usMapPoly)
    points(pts)

    # create values associated with points, be sure to play aroud with
    # these after you get the map it's fun
    vals <-rnorm(250,100,25)
    valWeights <- vals/sum(vals)
    ptsCords <- data.frame(pts@coords)

    # create window for the point pattern object  (ppp) created below
    usWindow <- as.owin(usMapPoly)

    # create spatial point pattern object
    usPPP <- ppp(ptsCords$x,ptsCords$y,marks=vals,window=usWindow)

    # create colour ramp
    col <- colorRampPalette(brewer.pal(9,"Reds"))(20)

    # the plots, here is where the gausian kernal density estimation magic happens
    # if you want a continuous legend on one of the sides get rid of ribbon=FALSE
    # and be sure to play around with sigma
    plot(Smooth(usPPP,sigma=3,weights=valWeights),col=col,main=NA,ribbon=FALSE)
    map("state",add=TRUE,fill=FALSE)

示例没有权重:

SmoothMap

我的琐碎重量的例子

SmoothMap2

在这个和你的目标之间显然有很多工作要做,这种类型的地图可以在各种级别的空间聚合和样本数据中重现,但好运这似乎是一个很酷的项目。

p.s.最初我没有使用任何加权,但我想你可以直接为Smooth函数提供权重。上面有两个示例地图。