Federico Calboli
2014-Aug-20 21:01 UTC
[R] ordinary kriging: the edges of the polygons are ignored
Hi All, I am trying to do some kriging of a floor, based on a number of heat sensors. My data looks like this: sensor temp x y 1 1 1.25437406 390 2960 2 2 0.64384594 830 2960 3 3 1.52067733 1420 2960 4 4 1.21441928 3127 2920 5 5 1.04227694 4005 2920 6 6 1.90084852 400 1960 7 7 1.58530250 835 1880 8 8 1.23060971 1130 1960 9 9 0.92749453 1550 1950 10 10 0.76638878 1995 1960 11 11 0.84247092 2540 1950 12 12 0.93999929 3300 1880 13 13 0.61610170 4000 1870 14 14 1.06967332 395 1330 15 15 0.72970917 845 1330 16 16 0.60216970 1135 1300 17 17 0.44648551 1570 1275 18 18 2.49863724 2010 1290 19 19 0.71619206 2540 1320 20 20 1.50984666 3140 1275 21 21 -0.06540552 4000 1258 22 22 1.20017747 400 685 23 23 1.05820693 1575 640 24 24 2.25086655 1830 625 25 25 0.69296059 3120 625 26 26 0.69324786 3990 605 and the floor plan describes the edges of the floor thus: x y 1 210 3200 2 210 420 3 1510 420 4 1510 100 5 4090 100 6 4090 3200 7 2947 3200 8 2947 2850 9 1647 2850 10 1647 3200 11 210 3200 12 210 3200 I run these commands: house2 <- list(data.frame(house$x, house$y)) plot(house.y ~house.x, type = 'l', house2[[1]]) points(U[,3], U[,4], pch = 20) housekrig=kriging(U[,3],U[,4],U[,2],polygons=house2,lags = 5) image(housekrig, xlim = extendrange(U[,3]), ylim = extendrange(U[,4]), col = rev(heat.colors(100))) and I noticed that the kriging area does not respect the floor plan. In fact, if I do: points(U[,3], U[,4], pch = 20) the sensors and not in the same place, and the kriging has ignored the edges of the polygons altogether. So my question is, how do I have a kriging of the *whole* surface, based on my sensors? Any suggestion is welcome, especially if the data does not require reformatting (or if the reformatting is straightforward)! Best F PS I have contacted the maintainer of the package about the issue but I had no reply, and I?d need to solve this one way or another sooner, rather than later. -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 842 bytes Desc: Message signed with OpenPGP using GPGMail URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20140820/e0d9c100/attachment.bin>
Jon Skoien
2014-Aug-21 06:58 UTC
[R] ordinary kriging: the edges of the polygons are ignored
Hi Frederico, The kriging function seems to come from the kriging package (please give also the package next time you ask a question), which I dont know. I can therefore not tell you why it does not give you the correct result. But R has a huge number of packages which can krige, and autoKrige from automap should fairly easy be able to give you what you want. # You have to create a SpatialPolygon of your house first, from which you can sample: pts = cbind(house$x, house$y) pts = rbind(pts, pts[1,]) # Repeating the first coordinates, just to close the polygon house2 = SpatialPolygons( list( Polygons(list(Polygon(pts)), 1))) housegrid = spsample(house2, 10000, "regular") # Sampling 10000 points on a regular grid gridded(housegrid) = TRUE # Defining this to be a grid, not a collection of points # You need to make a SpatialPointsDataFrame of your temperature data, and then you can interpolate coordinates(U) = ~x+y res = autoKrige(temp~1, U, housegrid) spplot(res$krige_output, col.regions = rev(heat.colors(100))) # Your result is in the var1.pred-variable of res$krige_output You will generally get more and quicker answers to questions about spatial data and methods from the r-sig-geo list. Best wishes, Jon On 8/20/2014 11:01 PM, Federico Calboli wrote:> Hi All, > > I am trying to do some kriging of a floor, based on a number of heat sensors. > > My data looks like this: > > sensor temp x y > 1 1 1.25437406 390 2960 > 2 2 0.64384594 830 2960 > 3 3 1.52067733 1420 2960 > 4 4 1.21441928 3127 2920 > 5 5 1.04227694 4005 2920 > 6 6 1.90084852 400 1960 > 7 7 1.58530250 835 1880 > 8 8 1.23060971 1130 1960 > 9 9 0.92749453 1550 1950 > 10 10 0.76638878 1995 1960 > 11 11 0.84247092 2540 1950 > 12 12 0.93999929 3300 1880 > 13 13 0.61610170 4000 1870 > 14 14 1.06967332 395 1330 > 15 15 0.72970917 845 1330 > 16 16 0.60216970 1135 1300 > 17 17 0.44648551 1570 1275 > 18 18 2.49863724 2010 1290 > 19 19 0.71619206 2540 1320 > 20 20 1.50984666 3140 1275 > 21 21 -0.06540552 4000 1258 > 22 22 1.20017747 400 685 > 23 23 1.05820693 1575 640 > 24 24 2.25086655 1830 625 > 25 25 0.69296059 3120 625 > 26 26 0.69324786 3990 605 > > and the floor plan describes the edges of the floor thus: > > x y > 1 210 3200 > 2 210 420 > 3 1510 420 > 4 1510 100 > 5 4090 100 > 6 4090 3200 > 7 2947 3200 > 8 2947 2850 > 9 1647 2850 > 10 1647 3200 > 11 210 3200 > 12 210 3200 > > I run these commands: > > house2 <- list(data.frame(house$x, house$y)) > plot(house.y ~house.x, type = 'l', house2[[1]]) > points(U[,3], U[,4], pch = 20) > housekrig=kriging(U[,3],U[,4],U[,2],polygons=house2,lags = 5) > image(housekrig, xlim = extendrange(U[,3]), ylim = extendrange(U[,4]), col = rev(heat.colors(100))) > > and I noticed that the kriging area does not respect the floor plan. In fact, if I do: > > points(U[,3], U[,4], pch = 20) > > the sensors and not in the same place, and the kriging has ignored the edges of the polygons altogether. > > So my question is, how do I have a kriging of the *whole* surface, based on my sensors? Any suggestion is welcome, especially if the data does not require reformatting (or if the reformatting is straightforward)! > > Best > > F > > PS I have contacted the maintainer of the package about the issue but I had no reply, and I?d need to solve this one way or another sooner, rather than later. > > > > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.[[alternative HTML version deleted]]