[R-sig-Geo] raster::extract fails on brick but works on individual layers of brick
Frank Davenport
frank.davenport at gmail.com
Thu Sep 11 00:22:45 CEST 2014
Hi Robert-
I was unable to install the development version, however I did update to
raster- 2.3-0 and the issue appears to be resolved. I can run
extract(..,..,mean) with or without weights and get values each time,
without having to use dissagregate first.
However I noticed now that the 'weights' colunm sums to one. This what I
would like from a weights column however this is not the how weights
behaved in the past, as per this discussion:
https://stackoverflow.com/questions/17766989/extract-data-from-raster-with-small-polygons-rounded-weights-too-small
My new question: Has the weights function fundamentally changed or is it
different only when the polygons are significantly smaller than the
raster cells? Or put another way, if I re-run old code that uses
weights=T, should I expect different answers?
Thanks again for the great package!
Frank
Here is my code and session info:
> library(raster)
Loading required package: sp
Warning message:
package ‘raster’ was built under R version 3.1.1
> #install.packages("raster", repos="http://R-Forge.R-project.org")
>
> load('~/Dropbox/Public/99_raster_bugreport.Rdata')
#https://dl.dropboxusercontent.com/u/9577903/99_raster_bugreport.Rdata
> test1<-extract(g,dsd,fun=mean,na.rm=T,weights=T) #No Error
> test2<-extract(g,dsd,fun=mean,na.rm=T,weights=F) #No Error
>
> test3<-extract(g,dsd,weights=T) #just get the weights
>
> test3[[1]][,'weight'] #the weights column sums to 1
[1] 0.6 0.4
>
> sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] raster_2.3-0 sp_1.0-15
loaded via a namespace (and not attached):
[1] grid_3.1.0 lattice_0.20-29 tools_3.1.0
On 9/2/14 9:41 AM, Robert J. Hijmans wrote:
> Frank,
> I hope this issue has been solved in the development version.
> install.packages("raster", repos="http://R-Forge.R-project.org")
> I would appreciate feedback.
> Best, Robert
>
> On Fri, Jul 25, 2014 at 12:40 PM, Frank Davenport
> <frank.davenport at gmail.com> wrote:
>> Sorry for the mutliple postings but I found another solution using
>> raster::disaggregate(). Essentially the same as resample but prerserves all
>> the cell values. The fundamental issue was the small size of the polygons
>> compared to the cells (which can be problematic when using weights()).
>>
>> See the discussion here:
>> https://stackoverflow.com/questions/17766989/extract-data-from-raster-with-small-polygons-rounded-weights-too-small
>>
>>
>> g2<-raster::disaggregate(g,10)
>> test1<-extract(g2,dsd,fun=mean,na.rm=T,weights=T,small=T)
>>
>> On 7/23/14 10:07 AM, Lyndon Estes wrote:
>>> Hi Frank,
>>>
>>> I think the mean function is getting in the way, since if you want to
>>> extra the values for all cells each polygon overlaps, the outputs will
>>> first end up in a list.
>>>
>>> test1 <- extract(g, dsd, weights = TRUE, small = TRUE)
>>>
>>> Will get the cell values for each polygon from each layer in the
>>> brick, along with their weight (while allowing very small polygons to
>>> get their underlying cell values).
>>>
>>> I would then process the mean function on the list.
>>>
>>> v <- t(sapply(test1, function(x) apply(t(sapply(1:nrow(x), function(y)
>>> x[y, 1:10] * x[y, 11])), 2, sum))) # matrix of annual values per
>>> polygon
>>>
>>> Hope this helps.
>>>
>>> Cheers, Lyndon
>>>
>>>
>>> On Wed, Jul 23, 2014 at 12:17 PM, Frank Davenport
>>> <frank.davenport at gmail.com> wrote:
>>>> Hello,
>>>>
>>>> I am using extract() to aggregate values from a raster to a polygon. The
>>>> raster is a brick object. Extract fails on the brick object but succeeds
>>>> when applied on each individual layer of the brick (via a for() loop). I
>>>> would use this as a work around but in my actual scenario the brick is
>>>> much
>>>> bigger and the individual approach is too slow.
>>>>
>>>> The specific error message is: "Error in t(sapply(res, meanfunc)) :
>>>> error
>>>> in evaluating the argument 'x' in selecting a method for function 't':
>>>> Error in apply(x, 1, function(X) { : dim(X) must have a positive length"
>>>>
>>>> I believe this has something to do with the relative sizes of the
>>>> polygons
>>>> (small) and the grid cells. I have successfully extracted this brick to
>>>> another shapefile that had much larger polygons. Likewise I can also do
>>>> the
>>>> extraction if I resample the cells to a smaller resolution (not shown
>>>> below).
>>>>
>>>>
>>>> Finally the extract will work if I set 'na.rm=F' but then produces mostly
>>>> NA's, even though there are no NAs in the brick. I realize this might be
>>>> something to do with the dataType(). However that does not explain why
>>>> extract works on individual layers, but not the whole brick.
>>>>
>>>> Reproducible code is below and prettier example can be found here:
>>>> http://rpubs.com/frank_davenport/22698
>>>>
>>>> The data necessary to run the example can be found here:
>>>> https://dl.dropboxusercontent.com/u/9577903/99_raster_bugreport.Rdata
>>>>
>>>> Thank you for your help and apologies if a solution is already posted.
>>>>
>>>> Frank
>>>>
>>>>> rm(list=ls())
>>>>> library(raster)
>>>> Loading required package: sp
>>>>> ##-Download data from here:
>>>> https://dl.dropboxusercontent.com/u/9577903/99_raster_bugreport.Rdata
>>>>> ##contains 'dsd' a spatial polygons data.frame and 'g' a raster brick
>>>> with 10 layers
>>>>> load('~/Dropbox/Public/99_raster_bugreport.Rdata')
>>>>>
>>>>> dsd
>>>> class : SpatialPolygonsDataFrame
>>>> features : 36
>>>> extent : 34.04665, 39.70319, -4.67742, 1.19921 (xmin, xmax, ymin,
>>>> ymax)
>>>> coord. ref. : +proj=longlat +a=6378249.145 +b=6356514.96582849 +no_defs
>>>> variables : 4
>>>> names : Province, District, Division, uidu
>>>> min values : CENTRAL, BUNGOMA, ABOTHUGUCHI WEST, 1
>>>> max values : WESTERN, VIHIGA, WINAM, 44
>>>>> g
>>>> class : RasterBrick
>>>> dimensions : 24, 20, 480, 10 (nrow, ncol, ncell, nlayers)
>>>> resolution : 0.5, 0.5 (x, y)
>>>> extent : 33, 43, -6, 6 (xmin, xmax, ymin, ymax)
>>>> coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
>>>> data source : in memory
>>>> names : X1999.03.01, X1999.03.02, X1999.03.03, X1999.03.04,
>>>> X1999.03.05, X1999.03.06, X1999.03.07, X1999.03.08, X1999.03.09,
>>>> X1999.03.10
>>>> min values : 22.47562, 22.44415, 22.25507, 22.23166,
>>>> 22.12387, 22.42477, 22.27802, 22.15134, 22.36218, 22.33447
>>>> max values : 41.47818, 40.53116, 41.54944, 42.33093,
>>>> 41.67810, 40.79260, 41.83319, 40.83359, 41.12604, 42.00555
>>>>
>>>>> #---Show the data
>>>>> plot(g[[1]])
>>>>> plot(dsd,add=T)
>>>>>
>>>>> #--Try to extract, with weights yeilds an error
>>>>> test1<-extract(g,dsd,fun=mean,na.rm=T,weights=T)
>>>> Error in t(sapply(res, meanfunc)) :
>>>> error in evaluating the argument 'x' in selecting a method for
>>>> function
>>>> 't': Error in apply(x, 1, function(X) { : dim(X) must have a positive
>>>> length
>>>>> #--Extract without weights--produces NA's for most polygons
>>>>> test2<-extract(g,dsd,fun=mean,na.m=T)
>>>>> head(test2)
>>>> X1999.03.01 X1999.03.02 X1999.03.03 X1999.03.04 X1999.03.05
>>>> X1999.03.06 X1999.03.07 X1999.03.08 X1999.03.09 X1999.03.10
>>>> [1,] NA NA NA NA NA
>>>> NA NA NA NA NA
>>>> [2,] NA NA NA NA NA
>>>> NA NA NA NA NA
>>>> [3,] NA NA NA NA NA
>>>> NA NA NA NA NA
>>>> [4,] NA NA NA NA NA
>>>> NA NA NA NA NA
>>>> [5,] NA NA NA NA NA
>>>> NA NA NA NA NA
>>>> [6,] NA NA NA NA NA
>>>> NA NA NA NA NA
>>>>> summary(test2)
>>>> X1999.03.01 X1999.03.02 X1999.03.03 X1999.03.04
>>>> X1999.03.05 X1999.03.06 X1999.03.07 X1999.03.08
>>>> Min. :24.47 Min. :25.21 Min. :24.67 Min. :25.47 Min.
>>>> :27.42 Min. :25.38 Min. :25.93 Min. :24.11
>>>> 1st Qu.:29.29 1st Qu.:30.99 1st Qu.:29.55 1st Qu.:30.83 1st
>>>> Qu.:31.58 1st Qu.:29.78 1st Qu.:29.51 1st Qu.:28.35
>>>> Median :30.31 Median :33.63 Median :31.13 Median :31.88 Median
>>>> :33.32 Median :30.31 Median :30.52 Median :29.71
>>>> Mean :29.87 Mean :32.75 Mean :30.41 Mean :31.78 Mean
>>>> :32.61 Mean :29.71 Mean :29.90 Mean :29.19
>>>> 3rd Qu.:31.86 3rd Qu.:36.08 3rd Qu.:32.59 3rd Qu.:34.37 3rd
>>>> Qu.:34.73 3rd Qu.:30.60 3rd Qu.:31.32 3rd Qu.:30.82
>>>> Max. :32.81 Max. :37.00 Max. :33.45 Max. :35.77 Max.
>>>> :35.42 Max. :31.98 Max. :31.69 Max. :32.53
>>>> NA's :30 NA's :30 NA's :30 NA's :30 NA's
>>>> :30 NA's :30 NA's :30 NA's :30
>>>> X1999.03.09 X1999.03.10
>>>> Min. :25.98 Min. :25.53
>>>> 1st Qu.:29.53 1st Qu.:30.73
>>>> Median :30.57 Median :31.06
>>>> Mean :30.12 Mean :31.24
>>>> 3rd Qu.:31.41 3rd Qu.:33.52
>>>> Max. :32.75 Max. :34.83
>>>> NA's :30 NA's :30
>>>>> #--Extract each layer seperatley--works but is SLOW
>>>>> glist<-vector(mode='list',length=nlayers(g))
>>>>>
>>>>> for(i in 1:length(glist)){
>>>> + glist[[i]]<-extract(g[[i]],dsd,fun=mean,na.rm=T,weigths=T)
>>>> + }
>>>>> sessionInfo()
>>>> R version 3.1.0 (2014-04-10)
>>>> Platform: x86_64-apple-darwin10.8.0 (64-bit)
>>>>
>>>> locale:
>>>> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
>>>>
>>>> attached base packages:
>>>> [1] stats graphics grDevices utils datasets methods base
>>>>
>>>> other attached packages:
>>>> [1] raster_2.2-31 sp_1.0-15
>>>>
>>>> loaded via a namespace (and not attached):
>>>> [1] grid_3.1.0 lattice_0.20-29 tools_3.1.0
>>>> [[alternative HTML version deleted]]
>>>>
>>>> _______________________________________________
>>>> R-sig-Geo mailing list
>>>> R-sig-Geo at r-project.org
>>>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>
>> --
>> Frank Davenport, Ph.D
>> Climate Hazards Group
>> UCSB Geography
>>
>> _______________________________________________
>> R-sig-Geo mailing list
>> R-sig-Geo at r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
--
Frank Davenport Ph.D
Climate Hazards Group
UCSB Geography
More information about the R-sig-Geo
mailing list