Как эффективно построить несколько вариограмм из одного набора данных в R?

У меня есть кадр данных с именем seoul1to7, содержащий почасовые данные о концентрации PM10 с 1 по 7 марта 2012 г. "nofollow">пожалуйста, загрузите.В этом наборе данных время указано в формате ггггммддч. Например, 2012030101 означает 1 марта 2012 г., 1 час ночи.

Данные выглядят так:

      ID       time PM10      LAT     LON
1 111121 2012030101   42 37.56464 126.976
2 111121 2012030102   36 37.56464 126.976
3 111121 2012030103   46 37.56464 126.976
4 111121 2012030104   40 37.56464 126.976
.
.

Моя конечная цель — построить полувариограмму для каждого часа. например, на 1 марта 2012 г., 1:00 (2012030101) имеется 107 данных PM10. И я хочу построить вариограмму с 2012030101 по 2012030723 (всего 7*24 вариограммы). Я написал код на R:

seoul1to7<-read.csv("seoul1to7.csv", row.names=1)
rownames(seoul1to7)<-NULL

seoul311<-subset(seoul1to7, time==2012030101)
seoul312<-subset(seoul1to7, time==2012030102)
.
.
.
seoul3723<-subset(seoul1to7,time==2012030724)

сначала я попытался сделать нужные (7 * 24) кадры данных с помощью функции subset(), затем я хотел построить вариограмму для каждого кадра данных. Например, я построил вариограмму для seoul311 (для 2012030101) с помощью следующего кода:

library(sp)
library(gstat)
library(rgdal)
seoul311<-read.csv("seoul311.csv",row.name=1)
seoul311<-na.omit(seoul311)

coordinates(seoul311)=~LON+LAT
proj4string(seoul311) =  "+proj=longlat +datum=WGS84" 
seoul311<-spTransform(seoul311, CRS("+proj=utm +north +zone=52 +datum=WGS84"))

#plot Omnidirectional Variogram
seoul311.var<-variogram(PM10~1,data=seoul311,cutoff=66000, width=6000)
seoul311.var
plot(seoul311.var, col="black", pch=16,cex=1.3,
     xlab="Distance",ylab="Semivariance",
     main="Omnidirectional Variogram for seoul 311")

#Model fit
model.311<- fit.variogram(seoul311.var,vgm(psill=250,model="Gau",range=40000,nugget=100),
                          fit.method = 2)
plot(seoul311.var,model=model.311, col="black", pch=16,cex=1.3,
     xlab="Distance",ylab="Semivariance",
     main="Omnidirectional Variogram for seoul 3112")


#Directional Variogram
seoul311.var1<-variogram(PM10~1,data=seoul311,width=6000,cutoff=66000,
                         alpha=seq(0,135,45),tol.hor=15)
seoul311.var1
plot(seoul311.var1,model=model.311, cex=1.1,pch=16,col=1,
     main="ANisotropic Variogram for PM10")    


#anisotropy corrected variograms
model.3112.anis<- fit.variogram(seoul311.var1,vgm(250,"Gau",40000,100,anis=c(45,0.80)),
                                fit.method = 2)

#Final isotropic variogram for kriging
plot(seoul311.var,model=model.3112.anis, col="black", pch=16,cex=1.3,
     xlab="Distance",ylab="Semivariance",
     main="Final Isotropic Variogram")

Но я понимаю, что мой код очень неэффективен! Я пишу (7*24) раз subset(seoul1to7, time==2012030101) этот код. а потом еще раз (7*24) код для построения вариограммы! Я думаю, что это очень неуместный способ.

Итак, как я могу очень эффективно построить эти (7*24) полувариограммы из моего набора данных seoul1to7 (используя цикл или любую другую функцию)? Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.


person Orpheus    schedule 01.08.2015    source источник
comment
Вы проверили variogramST пространственно-временные вариограммы?   -  person Jared Smith    schedule 01.08.2015
comment
Собственно, здесь я занимаюсь просто пространственным анализом. Потому что время фиксировано. Поэтому я не проверял функцию variogramST. Скорее, я пытался найти, что с помощью цикла или применения семейства я могу это сделать или нет. Но не добился успеха!   -  person Orpheus    schedule 01.08.2015
comment
Должен ли я отредактировать свой вопрос и сделать его кратким? Я просто поражен в своей работе для этой проблемы.   -  person Orpheus    schedule 02.08.2015
comment
Или я должен разместить этот вопрос на любом другом форуме? пожалуйста, дайте мне знать?   -  person Orpheus    schedule 02.08.2015
comment
a<-lapply(unique(seoul1to7$time), function(x) subset(seoul1to7, time==x)). С помощью этого кода я могу получить весь фрейм данных в виде списка. Затем я могу увидеть каждый кадр данных, вызвав a[1], a[2]... таким образом. Но если я хочу построить вариограмму для каждого кадра данных (161 вариограмма), должен ли я написать код вариограммы (который я показал выше) 161 раз? Есть ли другой способ?   -  person Orpheus    schedule 02.08.2015
comment
Вы хотите, чтобы каждая вариограмма находилась на отдельном графике?   -  person Edzer Pebesma    schedule 10.08.2015
comment
На самом деле я хочу вариограмму по времени. Например, вариограмма для 1:00 с 1 марта по 7 марта на одном графике. Это означает 7 вариограмм на одном графике. Спасибо за ответ.   -  person Orpheus    schedule 11.08.2015
comment
Уважаемая Pebesma, можно ли сделать это вкратце? Или для каждой вариограммы я должен написать код вариограммы выше? Теперь я пытаюсь сделать это, написав код вариограммы для каждой отдельной вариограммы, и я получаю вывод одной вариограммы на участок. Но весь код становится очень длинным (более 10000 строк) и неуклюжим. Что я должен делать?   -  person Orpheus    schedule 12.08.2015


Ответы (1)


library(sp)
library(gstat)
library(rgdal)
library(automap)

seoul1to7<-read.csv("seoul1to7.csv", row.names=1)
seoul1to7 <- na.omit(seoul1to7)
seoul1to7_split<-split(seoul1to7,seoul1to7$time) #a list contain 161 dataframe
seq(seoul1to7_split)

### now we loop (using lapply()) over each seoul1to7_split entry and calculate 
### variogram using autofitVariogram and return the variogram plot

vars<-lapply(seq(seoul1to7_split), function(i)
{
  dat<-seoul1to7_split[[i]]  # for list element [[]]
  coordinates(dat)<-~LON+LAT
  proj4string(dat) <- "+proj=longlat +datum=WGS84" 
  dat <- spTransform(dat, CRS("+proj=utm +north +zone=52 +datum=WGS84"))
  variogram<-autofitVariogram(log(PM10)~1,dat)
  plot<- plot(variogram,plotit=FALSE, asp=1)

  ### in case you do not want to fix xlim and ylim to be identical 
  ### for each plot just comment out the following line or change
  ### values as you see fit
  #plt <- update(plt, xlim = c(-1000, 35000), ylim = c(0, 1000))

  return(plot)
})

### now we actually have 23 * 7 variogram plots which we will combine 
### into 23 hourly plots using latticeCombineGrid()
library(raster)
library(devtools)
#install.packages("Rcpp")
install_github("environmentalinformatics-marburg/Rsenal")
library(Rsenal)

names(seoul1to7_split)
hours<-substr(names(seoul1to7_split),9,10) #substructuring 9th to 10th digit of every element
hours
unique(hours)
class(unique(hours))   #character
seq(unique(hours))

var7_per_plot<-lapply(seq(unique(hours)), function(j)
  {
  index<- hours %in% unique(hours)[j]  
  plot.hours <- vars[index]

  return(latticeCombineGrid(plot.hours, layout =c(3,3)))
})
var7_per_plot[[1]]
var7_per_plot[[2]]
.
.
.
var7_per_plot[[23]]

Отдельное спасибо Тиму Аппельхансу за то, что научил меня.

person Orpheus    schedule 18.08.2015