从相似的数据集中插值缺失的气候数据

时间:2018-09-20 17:41:55

标签: r interpolation temperature

我正在使用我在野外实验中使用的几(5)个数据记录器的气候数据。我缺少一些气候数据,部分原因是实验开始后安装了记录器,部分原因是缺陷记录器。 为了对丢失的数据进行插值,我有来自附近两个气象站的气候数据。 我试图找到一种快速安全的方法来替换此数据集中的缺失数据,因为我想出的方法非常繁琐且令人费解。

df <- data.frame(date=c("2015-06-17","2015-06-18","2015-06-19","2015-06-20","2015-06-21"), 
meantemp1=c(15,17,19,15,19),maxtemp1=c(18,25,27,25,28),
meantemp2=c(13,12,12,18,14),maxtemp2=c(22,25,25,24,26),
meantemp3=c(NA,NA,21,17,21),maxtemp3=c(NA,NA,29,25,29),
meantemp4=c(NA,14,14,20,16),maxtemp4=c(NA,27,27,26,28))#create toy dataset    
df$date <- as.Date(df$date)

View(df)
      date      meantemp1 maxtemp1 meantemp2 maxtemp2 meantemp3 maxtemp3 meantemp4 maxtemp4
1 2015-06-17        15       18        13       22        NA       NA        NA       NA
2 2015-06-18        17       25        12       25        NA       NA        14       27
3 2015-06-19        19       27        12       25        21       29        14       27
4 2015-06-20        15       25        18       24        17       25        20       26
5 2015-06-21        19       28        14       26        21       29        16       28

假设前四列对应于气象站数据,后四列对应于数据记录器数据。实际上,我研究了更多的气候因素。 现在,我将数据集缩短到相关的时间范围(每月一次),没有任何NA值,以计算相关性。

#create a short dataset without NA values
dfshort <- df[df$date>="2015-06-19"&df$date<="2015-06-21 ",]
dfshort$date<-as.numeric(dfshort$date)#date needs to be transformed to numeric for cor()
corrmatrix <-((cor(dfshort)))
library(reshape)
m <- melt(corrmatrix)#show correlation matrix as a list
m <- m[order(- abs(m$value)), ]#order correlation matrix according to correlation values

View(m)
          X1        X2 value
1       date      date     1
11 meantemp1 meantemp1     1
15 meantemp3 meantemp1     1
16  maxtemp3 meantemp1     1
21  maxtemp1  maxtemp1     1
31 meantemp2 meantemp2     1
35 meantemp4 meantemp2     1
10      date meantemp1     0
46      date meantemp3     0
55      date  maxtemp3     0

为了更好地了解哪些因素最相关,我将列表简化为“记录器数据”取决于“气象站数据”的情况。

m1 <- subset(m, X1 %in% c('meantemp3', 'maxtemp3', 'meantemp4', 'maxtemp4'))
#select logger data for first ("dependent") column
m2 <-subset(m1,X2 %in% c('meantemp1', 'maxtemp1', 'meantemp2', 'maxtemp2'))
#select cases with weather station data for second ("reference")column

View(m2)

      X1        X2      value
15 meantemp3 meantemp1  1.0000000
16  maxtemp3 meantemp1  1.0000000
35 meantemp4 meantemp2  1.0000000
45  maxtemp4  maxtemp2  1.0000000
27  maxtemp4  maxtemp1  0.9819805
17 meantemp4 meantemp1 -0.9449112
24 meantemp3  maxtemp1  0.9449112
26 meantemp4  maxtemp1 -0.7857143
36  maxtemp4 meantemp2 -0.6546537
44 meantemp4  maxtemp2 -0.6546537

现在,我标记“记录器数据”的最高相关性,并在以下this之后创建lm:

#formulate linear models
model.meantemp3 <- lm(meantemp3 ~ meantemp1, data = df)
model.maxtemp3 <- lm(maxtemp3 ~ meantemp1, data = df)
model.meantemp4 <- lm(meantemp4 ~ meantemp2, data = df)
model.maxtemp4 <- lm(maxtemp4 ~ maxtemp2, data = df)
#predict values as column
df$predict.meantemp3 = predict(model.meantemp3, newdata = df)
df$predict.maxtemp3 = predict(model.maxtemp3, newdata = df)
df$predict.meantemp4 = predict(model.meantemp4, newdata = df)
df$predict.maxtemp4 = predict(model.maxtemp4, newdata = df)
# replace (only) NAs with predictions
df$meantemp3 = ifelse(is.na(df$meantemp3), df$predict.meantemp3, df$meantemp3)
df$maxtemp3 = ifelse(is.na(df$maxtemp3), df$predict.maxtemp3,df$maxtemp3)
df$meantemp4 = ifelse(is.na(df$meantemp4), df$predict.meantemp4, df$meantemp4)
df$maxtemp4 = ifelse(is.na(df$maxtemp4), df$predict.maxtemp4, df$maxtemp4)
#tadaa!
df<- df[c(-10:-13)] #drop column we are not interested in
head(df) #dataset without NA's

       date     meantemp1 maxtemp1 meantemp2 maxtemp2 meantemp3 maxtemp3 meantemp4 maxtemp4
1 2015-06-17        15       18        13       22        17       25        15       24
2 2015-06-18        17       25        12       25        19       27        14       27
3 2015-06-19        19       27        12       25        21       29        14       27
4 2015-06-20        15       25        18       24        17       25        20       26
5 2015-06-21        19       28        14       26        21       29        16       28

必须有一种更简洁,更不易出错的方法来执行此操作,而且我不能成为唯一遇到此问题的人,正如this未回答的stackexchange问​​题所建议的那样。 我一直在寻找可以做到这一点的程序包(例如,“ mice”程序包),但是它们往往以非常复杂的输出结尾。地理学家似乎同意,简单的线性模型对于温度数据估算而言太原始了。但是,我的气候数据高度相关,因此为了简单起见,我想这样做。

非常感谢您的帮助!

0 个答案:

没有答案