У меня есть кадр данных с именем 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
(используя цикл или любую другую функцию)? Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
variogramST
пространственно-временные вариограммы? - person Jared Smith   schedule 01.08.2015variogramST
. Скорее, я пытался найти, что с помощью цикла или применения семейства я могу это сделать или нет. Но не добился успеха! - person Orpheus   schedule 01.08.2015a<-lapply(unique(seoul1to7$time), function(x) subset(seoul1to7, time==x))
. С помощью этого кода я могу получить весь фрейм данных в виде списка. Затем я могу увидеть каждый кадр данных, вызвавa[1], a[2]...
таким образом. Но если я хочу построить вариограмму для каждого кадра данных (161 вариограмма), должен ли я написать код вариограммы (который я показал выше) 161 раз? Есть ли другой способ? - person Orpheus   schedule 02.08.2015