ホーム  •  ニュース  •  フォーラム  •  アカウント情報  •  サイト内検索  •  新規登録
 ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
 カウントダウンブロック
カウントダウンイベントはありません
 メニュー

メイン
   地球科学のための R
     定義に沿ったAOの計算
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
投稿日時: 2005-4-20 11:41
登録日: 2004-7-29
居住地: 地球
投稿: 303
定義に沿ったAOの計算
北極振動を TW98 に沿って計算し直す。

1. CD-ROM データからの切り出し
#! /bin/bash
ROOTDIR=/DATA/DL/NCEP_NCAR/
FILENAM=data/monthly/other/pres.msl
#
for dir in ${ROOTDIR}??
do
    wgrib $dir/$FILENAM | grep 'd=..[01][1-4]' | wgrib $dir/$FILENAM -i -bin -nh -o ${dir##*/}.bin
done

各年 252288 = 144 x 73 x 6 x 4 バイトのファイルができる。

2. R で読み込んで保存する。
2.1 取り込み
# 1. データの読み込み
#
data <- NULL
for ( year in c(50:99, "00", "01", "02" )){
    zz   <- file(paste(year,".bin",sep=""), "rb")
    data <- c( data, readBin(zz, "double", n=3564928, size=4)) # 多めに指定
    close(zz)
}
rm(zz)
dim(data) <- c(144,73,6,53)
data      <- data[,seq(73,1,-1),,]
data      <- data[,seq(45,73),,]

2.2 とりあえずテスト表示
source("~/lib/R/MAP/map.R")
source("~/lib/R/filledcontour.R")
filled.contour(seq(0,357.5,2.5),seq(20,90,2.5),data[,,1,1])
map("/home/mori/lib/R/MAP/coast_world.asc")

2.3 保存
save(data, file="NHSLPWIN.rdata")


3. 解析
3.1 アノマリ

for( month in 1:6 ){
  meandata  <- data[,,1,1]*0
  for( year in 1:53 ){
    meandata <- meandata + data[,,month,year]
  }
  meandata <- meandata / 53
  for( year in 1:53 ){
    data[,,month,year] <- data[,,month,year] - meandata
  }
}


3.2 重みづけ
data   <- data[,seq(1,28),,]
weight <- diag(sqrt(cos( ( 20 + seq(0,27)*2.5 ) /180*pi ) ))
for( month in 1:6 ){
  for( year in 1:53 ){
    data[,,month,year] <- data[,,month,year] %*% weight
  }
}


3.3 主成分分析
dim(data) <- c(144*28,6*53)
EOFresult <- prcomp(t(data))
save(EOFresult, file="EOFresult.rdata")


3.4 主成分分析の結果の吟味
#
# http://jisao.washington.edu/analyses0302/ との比較
#
refdata   <- t(matrix(scan("slpanompc.ascii.txt"),5))
AOI       <- EOFresult$x[,1] ; dim(AOI)  <- c(6,53)
PC2       <- EOFresult$x[,2] ; dim(PC2)  <- c(6,53)
PC3       <- EOFresult$x[,3] ; dim(PC3)  <- c(6,53)

plot(AOI[1,], refdata[refdata[,2]==1,][3:55,3])
plot(AOI[2,], refdata[refdata[,2]==2,][3:55,3])

plot(PC2[1,], refdata[refdata[,2]==1,][3:55,4])

plot(PC3[1,], refdata[refdata[,2]==1,][3:55,5])

※ 今回の場合、第一成分の符号を変えるべきだということがわかる。


# PC1 について符号を変更
EOFresult$x[,1]   <- - EOFresult$x[,1]
EOFresult$rot[,1] <- - EOFresult$rot[,1]
#  Pa -> hPa
EOFresult$x       <- EOFresult$x/100


3.5 空間分布の表示

source("00_Functions.R")
eigenplot(EOFresult$rot[,1])
eigenplot(EOFresult$rot[,2])
ここで、00_Functions.R の中で、次のような関数を定義している。
###################################################################################
#
#  Polar の等値線図を描く関数
#
eigenplot <- function( eigenvector, zlim=c(-0.1,0.1), title="" )
{
  library(akima)
  phi    <- matrix(  seq(  0,357.5, 2.5),144,28)
  the    <- t(matrix(seq( 20, 87.5, 2.5),28,144))
  weight <- diag(sqrt( cos( 2 * pi / 360 * ( 20 + seq(0,27)*2.5 )) ))
  
  polardata <- interp((90-the) * ( -sin(2*pi/360 * phi) ),
                      (90-the) * (  cos(2*pi/360 * phi) ),
                      matrix(eigenvector,144) %*% diag(1./diag(weight)))
  filled.contour(polardata, zlim=zlim, nlevels=15, plot.axes={} )
  contour(       polardata, zlim=zlim, nlevels=15, add=T )

###############
  if( is.na(file.info("/home/mori/lib/R/MAP/coast_world.rdata")$size) )
    saveworldmapdata()
  load("/home/mori/lib/R/MAP/coast_world.rdata")
###############
  
  for( i in seq(1,mapdata$max) )
    lines( -(90 - mapdata$data[[i]]$lat) * sin(2*pi*mapdata$data[[i]]$lon/360),
          (  90 - mapdata$data[[i]]$lat) * cos(2*pi*mapdata$data[[i]]$lon/360))
  
  title(title)
}

###################################################################################
#
#  汎用
#  世界地図の海岸線データを保存するための関数
#
saveworldmapdata <- function(file="/home/mori/lib/R/MAP/coast_world.asc"){
  buff <- scan(file)
  
  max  <- length(buff)
  sfx  <- 1
  cnt  <- 0
  mapdata <- list(list())

  while( sfx <= max ){
    cnt        <- cnt + 1
    length     <- buff[sfx]
    mapdatatmp <- list(num     = buff[sfx]/2,
                       unknown = buff[sfx+1],
                       north   = buff[sfx+2],
                       south   = buff[sfx+3],
                       east    = buff[sfx+4],
                       west    = buff[sfx+5],
                       lat     = buff[sfx+4+2*c(1:(length/2))],
                       lon     = buff[sfx+5+2*c(1:(length/2))])
    mapdata[[cnt]] <- mapdatatmp
    sfx <- sfx + 6 + length
  }
  mapdata <- list(max=cnt,data=mapdata)
  save(mapdata, file=("/home/mori/lib/R/MAP/coast_world.rdata"))
}


4. 独立成分分析
4.1 やるだけ。
library(fastICA)
ICAresult <- fastICA(EOFresult$x[,1:3],3,v=T,tol=1e-14,maxit=2000)


4.2 空間分布の表示
eigenplot( (EOFresult$rot[,1:3] %*% t(ICAresult$A))[,1],zlim=c(-1000,1000) )
規格化などをしたので、独立成分1σに対する気圧変動量(1hPa)の図になる。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


WWW を検索 meteorology.jp を検索

Powered by XOOPS 2.0 © 2001-2006 The XOOPS Project, Maitained by A. Mori
FI Theme :: XOOPS 2 Theme by ImageSquare :: Costomized by matchan and A.Mori