地图上如何让高权重的点覆盖低权重的点?

6

有哪些好的kriging/插值方法或选项可以让重点加权的点在绘制的R地图上渗透到轻点加权的点?

康涅狄格州有八个县。我找到了它们的质心并想要绘制每个县的贫困率。其中三个县人口非常多(约100万人),其余五个县人口稀少(约10万人)。由于这三个人口密集的县拥有超过州总人口的90%,因此我希望这三个人口密集的县完全“压倒”地图,并影响跨越县界的其他点。

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

这是可复制的代码,可以快速生成一个硬边框地图,然后再生成三个不同加权的地图。希望我只需更改此代码,但也许需要像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


1
县城并不总是一个县的人口中心,但在康涅狄格州的情况下,县城确实是人口中心。 (这个手工编码的例子对于我这个曾经的康涅狄格州居民来说看起来“完全错误”)。哈特福德,纽黑文和费尔菲尔德市将是更好的“中心”。 - IRTFM
2
如果您正在使用像ggplot这样的东西,请根据权重(或-weight)设置点的不透明度(alpha)。 - Ryan Hope
@RyanHope 谢谢!你能给一个例子作为答案吗?请注意,我的加权地图示例与散点图完全不同。 - Anthony Damico
@CarlWitthoft,显然有一个制作卡托图的包:http://stackoverflow.com/a/9320567/3897439。或者您可以像这篇文章(http://spatial.ly/2013/06/r_activity/)中那样使用ScapeToad。 - Cotton.Rockwood
提供一些关于上下文和目的的更多信息可能会有所帮助。如果您想要代表真实世界,基于县质心创建贫困水平的平滑曲面并没有太多意义。如果您仍然想使用克里金插值法,查看这个链接可能会有所帮助:http://resources.arcgis.com/en/help/main/10.1/index.html#/How_Kriging_works/009z00000076000000/。您可能需要尝试调整 sill 和 nugget 值。 - Cotton.Rockwood
显示剩余6条评论
3个回答

7
免责声明 - 我不是Krigging方面的专家。Krigging很复杂,需要对基础数据、方法和目的有很好的理解才能获得正确的结果。你可能希望尝试从GIS Stack Exchange上获取@whuber的意见或通过他的网站(http://www.quantdec.com/quals/quals.htm))联系其他专家。

话虽如此,如果你只是想达到你所要求的视觉效果,并且不打算用于某种统计分析,我认为有一些相对简单的解决方案。


编辑:

正如您所评论的那样,尽管以下建议使用thetasmoothness参数可以使预测表面更加平滑,但它们同样适用于所有测量值,因此不能将人口密集县相对于人口较少的县的“影响范围”扩大。经过进一步考虑,我认为有两种方法可以实现这一点:通过改变协方差函数以依赖于人口密度或使用权重,就像您所做的那样。如我下面所写,您的加权方法会改变krigging函数的误差项。也就是说,它会反向缩放nugget方差。

enter image description here

正如您在半变异图像中所看到的,小区块基本上是y截距或同一位置测量之间的误差。 权重影响小区块方差(sigma 2),即sigma 2 /权重。 因此,更大的权重意味着在小尺度距离上误差更小。 然而,这并不会改变半方差函数的形状,也不会对范围或 sill 产生太多影响。
我认为最好的解决方案是使您的协方差函数依赖于种群。 但是,我不知道如何实现,并且我没有看到任何可以执行此操作的Krig参数。 我尝试玩定义自己的协方差函数,就像Krig示例中一样,但只得到错误。
对不起,我无法提供更多帮助!
了解Krigging的另一个很好的资源是:http://www.epa.gov/airtrends/specialstudies/dsisurfaces.pdf
正如我在评论中所说的那样, sill 和 nugget 值以及半方差图的范围是可以改变的,这些都会影响平滑效果。通过在调用 Krig 时指定 weights,您正在改变测量误差的方差。也就是说,在正常使用中,权重应该与测量值的准确性成比例,因此较高的权重表示更准确的测量值。但实际上这并不适用于您的数据,但它可能会给您带来所需的效果。
要改变数据插值的方式,您可以在简单的 Krig 调用中调整两个(甚至更多)参数:theta 和 smoothness。theta 调整半方差图的范围,也就是说,随着 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度,在纬度上变化约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 的手册。它写得非常好,并很好地解释了参数。 此外,如果这在任何方面是定量的,我强烈建议与具有显著空间统计知识的人交谈!

谢谢!在发布之前,我确实检查过这些选项,但它们似乎无法解决问题。在打开每个选项后,请在我的可重现示例中将size <- 5size <- 100进行比较。这些选项都没有改善size <- 5size <- 100之间的比较。我正在寻找一种方法,其中一个高权重点明显侵占了附近的轻权重点,但是低权重点的侵占程度不那么严重。(对我的非专业术语表示抱歉) - Anthony Damico
@AnthonyDamico,据我所知,您希望在较低人口测量值时预测值与实际测量值之间的联系更少?是这样吗?如果是这样,加权似乎是正确的方法。然而,它可能需要与您感兴趣的变量:贫困率的变化范围相同。由于贫困率从5.8到11.4不等,我猜想指定远高于此范围的权重将没有意义。但是,如果您将人口缩放到此范围内,您可能会更加成功。我会在答案中添加一些内容,看看是否有帮助。 - Cotton.Rockwood
感谢您的编辑,Cotton!即使没有其他收获,知道我试图使用克里金插值法实现的目标并不完全可行也是有帮助的。感谢您让我避免在错误的道路上浪费大量时间 ;) - Anthony Damico

2
Kriging不是你想要的。(这是一种用于准确--而不是扭曲!--插值数据的统计方法。它需要对数据进行预分析--而你没有足够的数据来完成此目的--并且无法实现所需的地图扭曲。)
示例和“渗透”引用建议考虑使用anamorph面积卡特罗格拉姆图。这是一张地图,将扩大和缩小县多边形的面积,以反映它们相对人口而保留其形状。链接(到SE GIS网站)解释并说明了这个想法。虽然它的答案不太令人满意,但该网站的搜索将揭示一些有效的解决方案。

权重参数'allow'是否允许模型对低权重测量值的拟合程度更加变化?我只是想知道我的理解是否正确。 - Cotton.Rockwood
@Cotton 如果你在回答中提到了“Krig”的参数,我无法帮助你,因为我找不到任何包含该函数的“R”库。你使用的是哪个库?无论如何,在任何插值器(或通常情况下是统计预测过程)中加权都不能实现OP似乎要求的内容,这似乎更接近于加权核密度估计而不是实际插值。 - whuber
1
我指的是OP正在使用的fields包中的Krig。参考手册在此:http://cran.r-project.org/web/packages/fields/fields.pdf。我同意它不能满足他所描述的期望结果。 - Cotton.Rockwood
1
@Cotton 谢谢!“weights”参数用于调整克里金矩阵,该矩阵填充有协方差值。该模型中的协方差是来自“P”和“Z”过程以及测量误差“e”的三个项的总和。权重仅适用于“e”,对于精确测量,权重将很高,对于不精确的测量,权重将很低:“权重与测量误差的倒数方差成比例。... e.k 的方差为 sigma**2/ weights.k。”在这种应用中,使用倒数人口作为权重具有优点,但它不能实现 OP 所寻求的目标。 - whuber
@Cotton.Rockwood,我正在为http://asdfree.com编写一篇通用博客文章(含代码!)。许多调查数据集具有地理标识符,但没有普查区级别的数据,并且许多数据集的地理信息是不完整的。其中许多数据集类似于[cps](http://www.asdfree.com/search/label/current%20population%20survey%20%28cps%29),其中包含_一些_县,但并非全部。因此,在康涅狄格州的例子中,您知道三个大县_和_所有其他县的平均值。看到利奇菲尔德县被孤立了吗?从调查中,我们唯一得到的利奇菲尔德信息是所有五个低人口县的平均值 :) - Anthony Damico
显示剩余7条评论

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.最初我没有使用任何加权,但我想您可以直接向平滑函数提供权重。如上两个示例地图。


当然,请看一下现在。这是一个相当琐碎的加权,但我想你可以在平滑函数中直接对数据进行加权。 - miles2know
如果您将更多的颜色级别添加到rampPalette中,例如从(...)(20)到(...)(100),则地图看起来会更加连续。显然。 - miles2know
好的,我花了很多时间处理这个问题——权重仍然无法正常工作。当你在地理范围内随机抽样点时,你是在从加权点中随机抽样。我认为可能可以使用fields:::cover.design来保留权重,但我不确定如何操作?现在你所使用的“随机”抽样会破坏用户一开始设定的任何权重。有没有什么解决方法呢?谢谢! - Anthony Damico
这有道理,我相信有解决方法。我会好好考虑一下,但如果我理解你的意图...你没有随机点样本。你是在使用CBSA质心对吧?所以如果你事先有这些数据,它们将成为传递给ppp()的x,y数据。然后你的数据将成为ppp()的marks参数。不需要任何抽样。我只是用它来创建域内的一组任意点。我没有想到它可能会影响加权。无论如何,我会像我说的那样再好好考虑一下。干杯。 - miles2know
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Anthony Damico
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接