Sie sind auf Seite 1von 8

Procedimientos para obtener EOF’s y PCA’s

library(netCDF)
rm(list=ls(all=TRUE))
sst<-read.netCDF("C:/Tesis/PFEL/PFEL_2/sst_pfel.nc")
str(sst)
a<-sst$"SST"
a[a == attributes(a)$"missing_value"] <- NA
dimnames(a) <- list(sst$"TIME_SERIES",sst$"LAT125_128",sst$"LON351_355")

#Si queremos ver el mapa correspondiente a Enero de 1981 (1 en la serie):

#>contour(a[1,,])

#> (a[1,,])
# 350.5 351.5 352.5 353.5 354.5
#34.5 20.60 20.44 20.04 19.85 19.60
#35.5 20.21 20.06 19.70 19.54 19.34
#36.5 19.64 19.51 19.29 19.17 19.07
#37.5 19.00 18.95 19.05 19.03 18.93

#Si queremos ver la serie temporal correspondiente a una


determinada cuadrícula (ej. 34.5n/350.5e):

plot((a[,"34.5","350.5"]),type="l")

#Si queremos hallar los valores medios latitudinales:

#>lat.medias <- apply(a,c(1,2),mean)# c(1,2): 1 de la primera columna


#(tiempo) y 2 de la segunda columna
#(latitud)

#Y los longitudinales:

#>lon.medias <- apply(a,c(1,3),mean)# c(1,3): 1 de la primera columna


#(tiempo) y 3 de la tercera columna
#(longitud)

#Pero si queremos hallar la media para todo el periodo:

#>sst.medias <- apply(a,c(2,3),mean)# c(2,3): 2 de la segunda columna


#(latitud) y 3 de la tercera columna
#(longitud)

#Cuando tenemos columnas con NA’s la forma de calcular la media es:

#>sst.medias <- apply(a,c(2,3),mean,na.rm=T)

#Para seleccionar una determinada región:


> Q<-a.no.std[,25.5:28.5,31:35] # Corresponde a 34.5n:37.5n/9.5w:5.5w
>contour(t(apply(Q,c(2,3),mean)))

#Para extraer la serie temporal de una determinada región:

plot(a.no.std[,mean(1:50),mean(1:50)],type="l")

#Construimos una matriz para todos los puntos (4 x 5). Para ello #convertimos nuestro array “a” de
dimensiones (230,4,5)en una matriz de #dimensiones 20 X 230

F<-matrix(a,230,20) #donde 230 representa el número de meses y 20 el #número de


localizaciones
F<-t(F)

#Como las matrices COADS poseen valores NA habrá que reemplazarlos por
#un valor obtenido mediante el algoritmo EM en el paquete 'norm'

F<-t(F)

library(norm)

s<-prelim.norm(F)
thetahat <- em.norm(s)

theta <- da.norm(s,thetahat,steps=20,showits=TRUE)


rngseed(1232307)
F <- imp.norm(s,thetahat,F)
F<-t(F)

#En FERRET estandarizamos (anomalías/desviación estándar) los datos de la #matriz

svd<-svd(F);

eof1<-svd$u[,1];
eof2<-svd$u[,2];
eof3<-svd$u[,3];

E1<-array(eof1,c(50,50));
E2<-array(eof2,c(50,50));
E3<-array(eof3,c(50,50));

E1<-t(E1)
E2<-t(E2)
E3<-t(E3)

# Cálculo de la varianza

varianza<-(svd$d^2)*100/sum(svd$d^2)

# Fijamos las coordenadas del gráfico


x<-(-9.5:-5.5) # o x<-(350.5:353.5)
y<-(34.5:37.5)

contour(x,y,E1);
contour(x,y,E2);
contour(x,y,E3);

>contour(E1[31:35, 25.5:28.5])

# Hallamos los PCA's

D<-diag(svd$d)

pca<-D%*%t(svd$v)

pca1<-pca[1,];
pca2<-pca[2,];
pca3<-pca[3,];
pca4<-pca[4,];

#Normalizamos, tanto los E’s como los PCA’s

E1<-E1*sqrt(svd$d[1])
E2<-E2*sqrt(svd$d[2])
E3<-E3*sqrt(svd$d[3])

pca1<-pca1/sqrt(svd$d[1])
pca2<-pca2/sqrt(svd$d[2])
pca3<-pca3/sqrt(svd$d[3])

#Para saber si cada modo es significativo, aplicamos la regla de North et


al:

1
 2 2
    
N

En el caso de los eigenvalues () como son los ‘singular values’


obtenidos mediante svd, la relación k = k2 debe cumplirse. En R

>eigenvalue1<-svd$d[1]^2

Y para hallar los modos significativos:

 = svd$d[1]^2*(2/230)^0.5 #donde 230 representa la longitud de


la serie

Entonces,

de1<- svd$d[1]^2*(2/437)^0.5
de2<- svd$d[2]^2*(2/437)^0.5
de3<- svd$d[3]^2*(2/437)^0.5
Como la distancia  (1-2)debe ser mayor que 1 se debe cumplir que:

de1 < svd$d[1]^2- svd$d[2]^2


de2 < svd$d[2]^2- svd$d[3]^2
de3 < svd$d[3]^2- svd$d[4]^2

pca1<-ts(pca1,start=c(1981,1),frequency=12)
pca2<-ts(pca2,start=c(1981,1),frequency=12)
pca3<-ts(pca3,start=c(1981,1),frequency=12)

pca1.spec<-spectrum(pca1,method="pgram",kernel("daniell",m=c(5,7)),taper=0.1)
pca2.spec<-spectrum(pca2,method="pgram",kernel("daniell",m=c(5,7)),taper=0.1)
pca3.spec<-spectrum(pca3,method="pgram",kernel("daniell",m=c(5,7)),taper=0.1)

pca1.nao.spec<-spectrum(ts.union(pca1,nao),
method="pgram",kernel("daniell",m=c(5,7)),taper=0.1,na.action=na.omit)
pca2.nao.spec<-spectrum(ts.union(pca2,nao),
method="pgram",kernel("daniell",m=c(5,7)),taper=0.1,na.action=na.omit)
pca3.nao.spec<-spectrum(ts.union(pca3,nao),
method="pgram",kernel("daniell",m=c(5,7)),taper=0.1,na.action=na.omit)

pca1.mei.spec<-spectrum(ts.union(pca1,mei),
method="pgram",kernel("daniell",m=c(5,7)),taper=0.1,na.action=na.omit)
pca2.mei.spec<-spectrum(ts.union(pca2,mei),
method="pgram",kernel("daniell",m=c(5,7)),taper=0.1,na.action=na.omit)
pca3.mei.spec<-spectrum(ts.union(pca3,mei),
method="pgram",kernel("daniell",m=c(5,7)),taper=0.1,na.action=na.omit)

# Los mapas de correlación de cada EOF

corr.map1<-array(cor(pca1,t(F)),c(50,50))
corr.map2<-array(cor(pca2,t(F)),c(50,50))
corr.map3<-array(cor(pca3,t(F)),c(50,50))

corr.map1<-t(corr.map1)
corr.map2<-t(corr.map2)
corr.map3<-t(corr.map3)

# Para colocar los EOF's en un contexto geográfico

library(fields)
world(ylim=c(34,38), xlim=c(-10, -6),xaxt = "s", yaxt = "s" )
x<-(-9.5:-6.5)
y<-(34.5:37.5)
contour(x,y,E1,add=T)

postscript(file="U_fnmoc.ps")

world(ylim=c(34,38),xlim=c(-10,-6),xaxt="s",yaxt= "s",ylab="lat",xlab="lon")
contour(x,y,corr.map1,add=T)
title(“WIND eof1 correlation map\nexplained variance=17%")

world(ylim=c(34,38),xlim=c(-10,-6),xaxt="s",yaxt= "s",ylab="lat",xlab="lon")
contour(x,y,corr.map2,add=T)
title(“WIND eof2 correlation map\nexplained variance=9%")

world(ylim=c(34,38),xlim=c(-10,-6),xaxt="s",yaxt= "s",ylab="lat",xlab="lon")
contour(x,y,corr.map3,add=T)
title(“WIND eof3 correlation map\nexplained variance=8%")

world(ylim=c(34,38),xlim=c(-10,-6),xaxt="s",yaxt= "s",ylab="lat",xlab="lon")
contour(x,y,corr.map4,add=T)
title(“WIND eof4 correlation map\nexplained variance=7%")
plot(pca1,type="l",main="WIND PCA1",xlab="months since 16-01-1981")
plot(pca2,type="l",main="WIND PCA2",xlab="months since 16-01-1981")
plot(pca3,type="l",main="WIND PCA3",xlab="months since 16-01-1981")
plot(pca3,type="l",main="WIND PCA3",xlab="months since 16-01-1981")

dev.off()

#Para graficar filled.contour junto con contour

There is an easier solution. Try,

junk.mat <- matrix(rnorm(1600), 16, 100)


contour.mat <- ifelse(junk.mat < 2, 0, junk.mat)
filled.contour(junk.mat, color = terrain.colors, key.title=FALSE,key.axes=FALSE,
plot.axes = contour(contour.mat, levels = 1,
drawlabels = FALSE, axes = FALSE,
frame.plot = FFALSE, add = TRUE))

The 'plot.axes' argument to filled.contour() gives you access to the


coordinate system in the actual plotting area. However, you will notice
that the axes are missing. You need to add them explicitly, as in:

filled.contour(junk.mat, color = terrain.colors,


plot.axes = { contour(contour.mat, levels = 1,
drawlabels = FALSE, axes = FALSE,
frame.plot = FFALSE, add = TRUE);
axis(1); axis(2) } )

This also useful for adding titles, text annotations, points, etc.

En nuestro caso:

filled.contour(x,y,corr.map1, main="PFEL SST eof1",color = terrain.colors,


plot.axes = { contour(x,y,corr.map1,nlevels=15,
drawlabels = T, frame.plot = FFALSE, add = TRUE);
axis(1); axis(2);
world(col="red",add=T,lwd=2)},
key.title = title(main="variance %",cex.main=.5),
xlab="longitude",ylab="latitude" )
mtext(paste("generado con",R.version.string),
side = 1, line = 4, adj = 1, cex = .66)

world(ylim=c(34, 38), xlim=c(-7, -6),xaxt = "s", yaxt = "s",col="red")


contour(x,y,E1,add=T)

LON LON equiv R LAT equiv R


-39.5 320.5 1 10.5 1
-38.5 321.5 2 11.5 2
-37.5 322.5 3 12.5 3
-36.5 323.5 4 13.5 4
-35.5 324.5 5 14.5 5
-34.5 325.5 6 15.5 6
-33.5 326.5 7 16.5 7
-32.5 327.5 8 17.5 8
-31.5 328.5 9 18.5 9
-30.5 329.5 10 19.5 10
-29.5 330.5 11 20.5 11
-28.5 331.5 12 21.5 12
-27.5 332.5 13 22.5 13
-26.5 333.5 14 23.5 14
-25.5 334.5 15 24.5 15
-24.5 335.5 16 25.5 16
-23.5 336.5 17 26.5 17
-22.5 337.5 18 27.5 18
-21.5 338.5 19 28.5 19
-20.5 339.5 20 29.5 20
-19.5 340.5 21 30.5 21
-18.5 341.5 22 31.5 22
-17.5 342.5 23 32.5 23
-16.5 343.5 24 33.5 24
-15.5 344.5 25 34.5 25
-14.5 345.5 26 35.5 26
-13.5 346.5 27 36.5 27
-12.5 347.5 28 37.5 28
-11.5 348.5 29 38.5 29
-10.5 349.5 30 39.5 30
-9.5 350.5 31 40.5 31
-8.5 351.5 32 41.5 32
-7.5 352.5 33 42.5 33
-6.5 353.5 34 43.5 34
-5.5 354.5 35 44.5 35
-4.5 355.5 36 45.5 36
-3.5 356.5 37 46.5 37
-2.5 357.5 38 47.5 38
-1.5 358.5 39 48.5 39
-0.5 359.5 40 49.5 40
0.5 0.5 41 50.5 41
1.5 1.5 42 51.5 42
2.5 2.5 43 52.5 43
3.5 3.5 44 53.5 44
4.5 4.5 45 54.5 45
5.5 5.5 46 55.5 46
6.5 6.5 47 56.5 47
7.5 7.5 48 57.5 48
8.5 8.5 49 58.5 49
9.5 9.5 50 59.5 50

#Vamos a eliminar el ciclo estacional de las series:

f1<-ts(F[1,],start=c(1981,1),frequency=12)
f2<-ts(F[2,],start=c(1981,1),frequency=12)
f3<-ts(F[3,],start=c(1981,1),frequency=12)
f4<-ts(F[4,],start=c(1981,1),frequency=12)
f5<-ts(F[5,],start=c(1981,1),frequency=12)
f6<-ts(F[6,],start=c(1981,1),frequency=12)
f7<-ts(F[7,],start=c(1981,1),frequency=12)
f8<-ts(F[8,],start=c(1981,1),frequency=12)
f9<-ts(F[9,],start=c(1981,1),frequency=12)
f10<-ts(F[10,],start=c(1981,1),frequency=12)
f11<-ts(F[11,],start=c(1981,1),frequency=12)
f12<-ts(F[12,],start=c(1981,1),frequency=12)
f13<-ts(F[13,],start=c(1981,1),frequency=12)
f14<-ts(F[14,],start=c(1981,1),frequency=12)
f15<-ts(F[15,],start=c(1981,1),frequency=12)
f16<-ts(F[16,],start=c(1981,1),frequency=12)
f17<-ts(F[17,],start=c(1981,1),frequency=12)
f18<-ts(F[18,],start=c(1981,1),frequency=12)
f19<-ts(F[19,],start=c(1981,1),frequency=12)
f20<-ts(F[20,],start=c(1981,1),frequency=12)

#Extraemos los valores desestacionalizados para cada cuadrícula


#Abrir el archivo desestacionalizar.doc

F[1,]<-f1
F[2,]<-f2
F[3,]<-f3
F[4,]<-f4
F[5,]<-f5
F[6,]<-f6
F[7,]<-f7
F[8,]<-f8
F[9,]<-f9
F[10,]<-f10
F[11,]<-f11
F[12,]<-f12
F[13,]<-f13
F[14,]<-f14
F[15,]<-f15
F[16,]<-f16
F[17,]<-f17
F[18,]<-f18
F[19,]<-f19
F[20,]<-f20
rm(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20
,f1.split,f2.split,f3.split,f4.split,f5.split,f6.split,f7.split,f8.split,
f9.split,f10.split,f11.split,f12.split,f13.split,f14.split,f15.split,f16.
split,f17.split,f18.split,f19.split,f20.split,f1.cycle,f2.cycle,f3.cycle,
f4.cycle,f5.cycle,f6.cycle,f7.cycle,f8.cycle,f9.cycle,f10.cycle,f11.cycle
,f12.cycle,f13.cycle,f14.cycle,f15.cycle,f16.cycle,f17.cycle,f18.cycle,f1
9.cycle,f20.cycle)

Das könnte Ihnen auch gefallen