用马尔可夫空间过程生成飓风

9月30日,二千零一十四
通过

(本文首次发表于 Freakonometrics»R-英语,并对 188bet appR博主

国家飓风中心(NHC)收集了北大西洋所有风暴的数据集,这个北大西洋飓风数据库(HurdAT)。为了所有的悲伤,我们知道风暴的位置,每六焦耳(午夜,上午六点,中午和下午六点)。注意我们还有日期,6小时窗口的最大风速和风暴眼的压力。

可以运行以下功能

library(xml)extract.track=函数(year=2012,p=true){

第一,我们需要提取所有风暴的清单

loc<-paste(“http://weather.unisys.com/hurricane/atlantic/”,year,“/index.php”,sep=“)tabs<-readhtmltable(htmlparse(loc))storms<-unlist(strsplit(as.character(tabs[[1]]$name),split=“))index<-storms%in%c(“热带”,“风暴”,paste(“飓风-”,1:6,sep=“),“洼地”,“亚热带”,“温带”,“低”,paste(“风暴-”,1:6,sep=“),“S风暴!索引

然后,对于所有的风暴,我们转到相应的页面,我们提取数据集,

track=nullfor(i in length(nstyms):1)loc=paste(“http://weather.unisys.com/hurricane/atlantic/”,year,“/”,nstyles[i],“/track.dat”,sep=“)track=read.fwf(loc,skip=3,widths=c(4,6,8,12,4,6,20))name(track=c(“adv lat”,“lon”,“time”,“wind”,“pr”,“stat”)track$lat=as.numeric(as.character(track$lat))track$lon=as.numeric(as.character(track$lon=as.numeric(as.character(track$wind))track$pr=as.numeric(as.character(track$pr))track$year=year track$name=nstrems[i]track=rbind(track,track)if(p==true)cat(year,i,nstrems[i],nrow(track),“n”)return(track)

例如,对于二千零一十二,我们有

>M=Extract.Track(2012)2012 19 Tony 20 2012 18 Sandy 45 2012 17 Rafael 56 2012 16 Patty 11 2012 15 Oscar 13 2012 14 Nadine 96 2012 13 Michael 42 2012 12 Leslie 60 2012 11 Kirk 22 2012 10 Joyce 12 2012 9 Isaac 51 2012 8 Gordon 26 2012 7 Helene 38 2012 6 Florence 21 2012 5 Ernesto 39 2012 4 Debby 18 2012 3 Chris 31 2012 2 Beryl 33 2012 1 Alberto 20>头部(M)ADV LAT LON TIME WIND PR STAT YEAR NAME1 1 1 20.1-50.8 10/21/18Z 25 1011 LOW 2012 TONY2 20.4-51.2 10/22/00Z 25 1011 LOW 2012 TONY3 3 20.8-51.5 10/22/06Z 25 1010 LOW 2012 TONY4 4 21.3-51.7 10/22/12Z 30 1009 LOW 2012 TONY

通过一个简单的循环,我们可以提取所有年份的数据(请注意,一些手动更正是必要的,因为名单上大约有十个打字错误,金宝搏网址关于飓风的名字)。

totrack=nullfor(2012:1851中的y)totrack=rbind(totrack,extract.track(y))

我们可以看到所有这些轨迹,

图书馆(地图)地图(“世界”,xlim=c(-80,-40),ylim=c(10,50),col=“淡黄色”,fill=true),用于(n in unique(totrack$name))行(totrack$lon[totrack$name==n],totrack$lat[totrack$name==n],lwd=.5,col=“red”)

如果我们看看这些点的分布,我们有

库(ks)u=totrack[,c(“lon”,“lat”)]u=u[!is.na(u$lon),]h=diag(c(.2,.2))fat=kde(u,h,xmin=c(min(u[,1]),min(u[,2]),xmax=c(max(u[,1]),max(u[,2]))z=fat$estimateImage(z)map(“world”,add=true)

差不多一年前,克里斯托夫·德内斯·拜伦精算论文–建议使用马尔可夫空间过程。我不想拟合参数模型,但对于所有地点,可以使用非参数方法。对于所有地点,在给定的网格上,有可能得到所有过去的动作(如果有的话)。更具体地说,给定位置(截短的纬度和
截断经度)让我们提取两个信息,

  • 在该地点结束的轨迹比例
  • 对于所有没有在这个位置结束的轨迹,我们可以提取6小时后的位置,在这个地方之后。

代码将是

mttransition=函数(i,j)移动=nasumstop=0p=1idx=哪个((totrack$lon>=gridx[i])和(totrack$lon
       
        =gridy[j])&(总计$lat
        
         0)movement=data.frame(lon=rep(na,length(idx)),lat=rep(na,length(idx)),d=rep(na,length(idx)),for(s in 1:length(idx))stops=trueif((is.na(totrack$name[idx[s]+1])==false)&(is.na(totrack$name[idx[s])==false)stops=totrack$name[idx[s]+1]!=TOTTRACK$name[idx[s]]}if(stops==TRUE ){sumstop=sumstop+1}if(stops==FALSE){d=(TOTTRACK$LON[idx[s]+1]-TOTTRACK$LON[idx[s]])^2+(TOTTRACK$LAT[idx[s]+1]-TOTTRACK$LAT[idx[s]])^2locx=locy=NAif((d<90)& TOTTRACK$LON[idx[s]+1]<0){locx=floor(TOTTRACK$LON[idx[s]+1]/pasgrid)locy=floor(TOTTRACK$LAT[idx[s]+1]/pasgrid)}MOVEMENT[s,]=c(locx,locy,d)}}p=sumstop/length(idx)返回(list(listemouv=移动,probstop=p))
        
       

为了方便,对于网格上的所有值,让我们把所有这些值存储在一个大列表中

listsTransmat=list()liststopmat=list()for(i in 1:(length(gridx)-1))for(j in 1:(length(gridy)-1))nom=abs(gridx[i])*1000+abs(gridy[j])m=矩阵变换(i,j)listsTransmat[[nom]]=m$listemouvliststopmat[[nom]]=m$probstop

现在我们可以启动一些代码来生成轨迹。第一,我们需要一个起点,从我们观察到的一个。

n=nrow(totrack)idx=which(totrack$name[1:(n-1)]!=totrack$name[2:n])开始值=totrack

如果我们把它们标在上面的地图上,我们有

abline(v=gridx,col=“white”,lwd=0.5)abline(h=gridy,col=“white”,lwd=0.5)点(startingvalue$lon,startingvalue$lat,pch=19,col=“blue”)

从那个位置我们可以看到可能的轨迹,然后,我们生成两个随机变量。一个看我们是否移动,或者如果轨道结束了。如果我们搬家,我们画
在过去的轨迹中随机选择。想法如下。从某个特定位置开始

然后,使用上一个函数,你可能是,6小时后,

画一个可能的位置,从以前的观察来看(注意我们可能会在同一个方格内重新开始)

sim.mouv=函数(loc)lon=loc[1]lat=loc[2]nom=as.数值(abs(lon)*1000+abs(lat))m=liststransmat[[nom]]m=m[!is.na(m$lon),]stop=liststopmat[[nom]]u=runif(1)if(u<=stop)loc2=na if(u>stop)loc2=m[样本(1:nrow(m),大小=1),c(“lon”,“lat”)]返回(loc2)

然后,从那个新地点

我们再次移动(根据之前的轨迹,过去的观察)

事实上,记住,也有可能在这里停留。代码大致如下

sim.traj=function()i=sample(1:nrow(startingvalue),size=1)loc=round(startingvalue[i,])mloc=loc stop=falsewhile(stop=false)loc2=sim.mouv(loc)if(is.na(loc2))stop=trueif(!是.na(loc2))loc=loc2;MLOC=RBind(MLOC,LOC)返回(MLOC)

下面,我们可以看到两个可能的轨迹,对于我们造成的飓风,

很好,不是吗?现在我们需要添加更多信息,金宝搏网址关于飓风的强度,再次利用过去的经验…但让我们把它留到另一个岗位上!

留下评论作者,请关注他们博客上的链接和评论: Freakonometrics»R-英语.

188bet appR博客提供 每日电子邮件更新金宝搏网址 R新闻与 教程关于以下主题: 数据科学大数据, r作业,可视化(可视化) GGPROTT2箱形图地图动画)程序设计(程序) 演播室斯威夫特乳胶SQL日食吉特哈多普刮网)统计 回归主成分分析时间序列交易还有更多…



如果你走这么远,为什么不 订阅更新 从站点?选择您的口味: 电子邮件推特1188bet app,或 脸谱网

注释已关闭。

搜索R-Blo188bet appggers


赞助商

千万不要错过更新!
订阅R-Bloggers188bet app接收
最新R帖子的电子邮件。
(您将不再看到此消息。)

单击此处关闭(此弹出窗口将不再出现)