2013-08-20 62 views
4

比方說,我有相同的4個光柵化層,4個不同年份的數據擴展:2006,2008,2010和2012:R:不同日期的光柵層之間的插值

library(raster) 

r2006<-raster(ncol=3, nrow=3) 
values(r2006)<-1:9 

r2008<-raster(ncol=3, nrow=3) 
values(r2008)<-3:11 

r2010<-raster(ncol=3, nrow=3) 
values(r2010)<-5:13 

r2012<-raster(ncol=3, nrow=3) 
values(r2012)<-7:15 

現在我想創建在2006年到2013年間(或者甚至更長),每年通過內插/外插(線性方法應該是一個好的開始)4個柵格圖層的值。結果應該是這樣的:

r2006<-raster(ncol=3, nrow=3) 
values(r2006)<-1:9 

r2007<-raster(ncol=3, nrow=3) 
values(r2007)<-2:10 

r2008<-raster(ncol=3, nrow=3) 
values(r2008)<-3:11 

r2009<-raster(ncol=3, nrow=3) 
values(r2009)<-4:12 

r2010<-raster(ncol=3, nrow=3) 
values(r2010)<-5:13 

r2011<-raster(ncol=3, nrow=3) 
values(r2011)<-6:14 

r2012<-raster(ncol=3, nrow=3) 
values(r2012)<-7:15 

r2013<-raster(ncol=3, nrow=3) 
values(r2013)<-8:16 

使用lm()approxExtrap似乎沒有很大的幫助。

回答

1

這樣做的一種方法是將問題分爲兩部分:1.首先對柵格值執行數值插值,2.將插值應用於相應的中間柵格圖層。

想法:構建柵格圖層的值(),數據框的時間索引的數據框,然後對這些數字應用線性插值。對於線性插值,我使用simecol包中的approxTime

對於你上面的例子,

library(raster) 
library(simecol)  
df <- data.frame("2006" = 1:9, "2008" = 3:11, "2010" = 5:13, "2012"=7:15) 

#transpose since we want time to be the first col, and the values to be columns 
new <- data.frame(t(df)) 
times <- seq(2006, 2012, by=2) 
new <- cbind(times, new) 

# Now, apply Linear Interpolate for each layer of the raster 
approxTime(new, 2006:2012, rule = 2) 

這給:

# times X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 2006 1 2 3 4 5 6 7 8 9 
#2 2007 2 3 4 5 6 7 8 9 10 
#3 2008 3 4 5 6 7 8 9 10 11 
#4 2009 4 5 6 7 8 9 10 11 12 
#5 2010 5 6 7 8 9 10 11 12 13 
#6 2011 6 7 8 9 10 11 12 13 14 
#7 2012 7 8 9 10 11 12 13 14 15 

然後,您可以保存這一點,並採取每行,並適用於當年的光柵對象的值。

注意:approxTime不會做線性外推。它只是取最接近的價值,所以你需要考慮到這一點。

+0

這適用於線性插值,如果您的數據集中沒有任何NA。我的解決方案有NA,'approxTime'無法處理:只需將所有NA改爲數據集中沒有的數字(例如0),並用'is.na',做_interpolation_並將數字改回NA之後。 –

+0

是的,關於如何規避NA的好方法。 –

+0

很好的插值解決方案。我使用'Hmisc'包中的'approxExtrap'嘗試了相同的代碼,但是我只是得到了一個包含兩個組件的'list':一個具有相互和外推的年份,另一個僅填充0。這很奇怪,因爲'approxTime'和'approxExtrap'似乎都是基於'approxfun'。關於@Ram Narasimhan的任何想法? –