Está en la página 1de 20

TENDENCIA ANUAL de INDICADORES Índice de Calidad Ambiental

APRA
EJEMPLO: FE N2O ton N2O/MWh (GASES DE EFECTO
INVERNADERO)
Aplicación de la prueba de Mann-Kendall y estimaciones de la Pendiente de Sen.
Resumen:

El objetivo general de este tratamiento realizado sobre los datos disponibles del
inventario de gases de efecto invernadero (GEIs); es el de establecer cuál es la tendencia
alza o baja de las emisiones asociadas a las diferentes actividades antropogénicas
(generadas por el hombre); en el caso de la Ciudad se realizó tomando la serie histórica
de datos.
Dicho tratamiento se plantea como herramienta de control de cumplimiento de aquellas
metas de reducción planteadas, dado que permite observar la evolución de las emisiones
de GEIs; como así también lo pueden ser las series de datos que conforman el índice
de Calidad de agua superficial, el índice de Calidad de aire, energía, pobreza etc.; en la
Ciudad de Buenos Aires a través del tiempo.
Respecto del caso analizado; el aumento de la emisión de gases se deben a variadas
acciones del hombre; específicamente al aumento en la circulación del transporte
público y privado, el aumento de la actividad industrial y el consumo generalizado de
mercancías y residuos como parte de la misma actividad; es t o ha generado un aumento
sistemático de los gases de efecto invernadero.
La injerencia del Gobierno para su detección y estudio ha sido determinante a tal efecto;
Los análisis atmosféricos de corto plazo (en este caso de tendencia anual), son efectivos
para evaluar un alza o una baja en la tendencia en la concentración de determinados
contaminantes y su presencia en la atmósfera.
A medida que se desarrolló el análisis, se encontró que la concentración atmosférica de
Gases de efecto invernadero aunque monótona tiende al aumento con una marcada
tendencia.

Autor: Lic. Sociólogo (UBA). Ernesto Di Marco. F.M 429.588 (DGTAL-APRA)

Buenos Aires, 26 de Octubre de 2017

1
1.0 Prueba de Mann-Kendall y la magnitud de la tendencia anual de FE

CO2 realizado con el método de la pendiente de Sen.

La actual normativa de calidad de aire Argentina insta al estudio de tendencias de


Calidad de aire, sin que se determine la forma en que han de realizarse estos estudios.
Son numerosos los métodos estadísticos y matemáticos que se han utilizado a lo largo
de la historia para la detección y estimación de tendencia en estudios ambientales.
Uno de los más utilizados internacionalmente es el test estacional de Mann-
Kendall, que ya ha sido aplicado a datos de contaminación en EEUU (EPA), México
(Rama) y Europa (EEA).
En una planilla .xls se desarrolló la prueba no paramétrica de Mann-Kendall (prueba de
tendencia y estimaciones de una pendiente) para detectar y estimar la evolución del
promedio de la serie temporal de valores de FE CO2 (tCO2/MWh); FE CO2
(tCO2/M Wh);FE CH4 (ton CH4/M Wh) y FE N2O(ton N2O/M Wh) anuales en
su concentración atmosférica.
Además de los cálculos estadísticos, también se proporciona una interfaz gráfica
sencilla para facilitar la interpretación de la serie histórica y estadística de los
resultados, los detalles de las teorías que se involucran se pueden encontrar en los libros
de Gilbert y Sirois. Estos autores dan un resumen educativo de la aplicación de estos
métodos en los estudios químicos atmosféricos.
La prueba de Mann-Kendall es adecuada para los casos en los que la tendencia se
supone monótona y por lo tanto carece de los ciclos estaciónales que excedan el período
de un año, o de otro tipo de ciclo en los datos (Es decir que el comportamiento año tras
año sea el mismo).
El método de Sen utiliza un modelo lineal para estimar la tendencia de la pendiente y la
varianza de los residuos, ésta tendencia de los residuos debe tender a mantenerse
constante en el tiempo para obtener como resultado una posible tendencia en el
comportamiento año tras año.
La necesidad de uso de este tipo de herramienta se planteó en el marco de un proyecto
propio para la evaluación de la evolución de los gases de efecto invernadero como
consecuencia de la contaminación local, en el marco de la estadística descriptiva de los
Indicadores que forman parte del ICA (Índice de calidad ambiental) desarrollado por la
Agencia de Protección Ambiental.
Los serie de años evaluados son va desde el año 2000 a 2015; metodológicamente para
2
poder efectuar el tratamiento se requieren de al menos 4 años de serie de datos para
poder realizar el estudio de tendencia, donde se intercomparan periodos de iguales
características estacionales (años).
Los datos necesariamente validados tienen que representar el 75% de la muestra para la
realización del tratamiento, sino se podría incurrir en un error de tipo metodológico para
estimar la pendiente.

2.1 La prueba de Mann-Kendall

La prueba de Mann-Kendall es aplicable en los casos en que los valores de datos xi de


una serie temporal siguen el siguiente modelo:

xi = f (ti )+εi , (1)

Donde f(t) es una función monótona continua que aumenta o disminuye en función del
tiempo. Por lo tanto, si los residuos εi poseen distribución con media 0, indicará que la
varianza de la distribución y la varianza del residuo son constantes en el tiempo. Si el
residuo varía aleatoriamente a lo largo de la línea de tiempo indicará que no hay
tendencia en la serie temporal.
El primer paso es poner a prueba la hipótesis nula (H0), es decir, que no se observe
ninguna tendencia en la pendiente. La hipótesis alternativa H1, que también se pone a
prueba, verifica un posible aumento o disminución de tendencia de la pendiente. Si se
corrobora H1, se desestima automáticamente H0.
Los datos:

El número de valores anuales de la serie de datos estudiados se denota por n.

Los valores de años faltantes están permitidos debido a la función de la ecuación, como
a continuación se verá; por lo tanto n puede ser menor que el número de años en la serie
de tiempo estudiado. Para las series temporales con menos de 10 de datos, se utiliza la
prueba de S, y para las series temporales con 10 puntos o más en la aproximación
normal, se utiliza la prueba de Mann Kendall.

En la prueba de Mann-Kendall el estadístico S se calcula utilizando la fórmula


n−1 n

S= Σ Σsgn(xj − xk ), (2)
k =1 j=k +1

3
donde xj y xk son los valores anuales en los años j, k, j> k, respectivamente, y

1 Si x j - x k  0

sgn(x j - x k )  0 Si x j - x k  0 , (3)

-1 Si x j - x k  0

Si n es 9 o menos, el valor absoluto de S se compara directamente con la distribución


teórica de S obtenida por la prueba de Mann y Kendall (Gilbert, 1987).
La prueba de dos colas se utiliza para cuatro niveles diferentes de significación (α): 0,1,
0,05, 0,01 y 0,001. La H0 (Hipótesis nula) de cierto nivel de probabilidad es rechazada
en favor de H1 si el valor absoluto de S es igual o supera un determinado valor Sα / 2,
donde Sα / 2 es la más pequeña S y tiene la probabilidad de menos de α / 2 a aparecer en
caso de que no haya tendencia. Un resultado positivo, (negativo); el valor de S indica
una tendencia hacia arriba, (hacia abajo). Los valores mínimos de n con la que estos
cuatro niveles de importancia a que se puede llegar, se derivan de la tabla de
probabilidad de S como se muestra a continuación.

Nivel de significación en relación al n

Nivel de Requiere un
significancia n
α
0.1 ≥4

0.05 ≥5
0.01 ≥6
0.001 ≥7

El nivel de significación 0,001 significa que hay un 0,1% de probabilidad de que


cometemos un error al rechazar (H0) la hipótesis nula.
Así, que un nivel de significación 0,001 significa que la existencia de una tendencia
monotónica es muy probable. Respectivamente, el nivel de significación 0,1 significa
que hay un 10% de probabilidad de que cometemos un error al rechazar H0.

4
2.1.2 Número de valores de datos de 10 o más

Si n es al menos de 10 se utiliza la prueba de aproximación normal. Sin embargo, si hay


varios valores iguales en la serie de tiempo, se puede reducir la validez de la
aproximación normal cuando el número de valores de datos se aproxima a 10.
En primer lugar, la varianza de S se calcula mediante la siguiente ecuación:

1  q

VAR ( S )   n ( n  1)( 2 n  5 ) 
18 
 t (t p p  1)( 2 t p  5  (4)
p 1 



Aquí, q es el número de promedios anuales y tp es el número de valores de datos en
el pésimo del grupo.
Los valores de S y VAR (S) se utilizan para calcular el estadístico de prueba Z de la
siguiente manera:
 S 1
 VAR if s  0
 (S )

Z  0
 if s  0 (5)
 S 1
 if s  0
VAR ( S )

Se utiliza el valor Z para evaluar la presencia de una tendencia estadísticamente


significativa. Un resultado positivo/negativo del valor de Z indica una tendencia hacia
arriba / abajo. El estadístico Z tiene una distribución normal. Para probar la tendencia,
ya sea una tendencia monótona es que se realiza la prueba de dos colas con α nivel de
significancia.
La H0 rechaza si el valor absoluto de Z que es mayor que Z1-α/ 2, donde:
Z1-α/ 2 se obtiene del n acumulado en tablas de distribución normal.

2.2 Método de Sen

Para estimar la pendiente de una tendencia existente (como una variación anual), se
utiliza el método no paramétrico de Sen. El método se puede utilizar en los casos en que
se asume que la tendencia es lineal. Esto significa que f(t) en la ecuación (1) es igual a:

f (t) = Qt + B (5)

Donde Q es la pendiente y B es una constante.

5
Para obtener la estimación de la pendiente Q en la ecuación (1), primero calculamos las
estimaciones de todos valores de datos pares:

− xk
Qi=xj
j− k , (6)

Donde j<k.

Si hay n valores de xj en la serie de tiempo, para estimar la pendiente Qi se calcula


mediante la formula N = n (n-1) / 2. El estimador de la pendiente Sen es la mediana de
estos N valores de Qi . Los N valores de Qi se clasifican del más bajo al más alto y el
estimador Sen es:

Q =Q[(N +1) / 2] (7), si N es impar

o,
1
2
Q= (Q [N / 2]+Q [(N 2) / 2]) (8), si N es par.

Un intervalo de confianza bilateral de 100 (1-α) % sobre la estimación de la pendiente


se obtiene mediante la técnica no paramétrica basada en la distribución normal. El
método es válido para valores n tan pequeños como 10.
El procedimiento estima el intervalo de confianza a dos niveles diferentes; α = 0,01 y α
= 0,05.
Al principio calcula:

Ca=Z1-a/2 VAR(S) , (9)

Donde:

VAR (S) ya fue definida en la ecuación (4), y Z1-a/ 2 se obtiene de la distribución


estándar normal. Luego se calcula: M1 = (N - Cα) / 2 y M2 = (N + Cα) / 2 se calculan
los límites inferior y superior del intervalo de confianza, Qmin y Qmax, es decir,
los M1ésimo más Alto y (M2 +1)ésimo más grande de las estimaciones de las pendientes N
ordenadas (Qi).

6
Para obtener una estimación de B en la ecuación (6) el n valores de las diferencias xi -
Qti se calculan. La mediana de estos valores se obtiene una estimación de B (Sirois,
1998). Las estimaciones de la constante B de las líneas del 99% y 95% intervalo de
confianza se calculan mediante un procedimiento similar.

Los valores (datos) se toman directamente del cálculo anual GEIS, ubicados en la
columna datos en el gráfico de la hoja.
http://www.buenosaires.gob.ar/agenciaambiental/cambioclimatico/mitigacion/inventario
-de-geis

Factores de emisión de GEI del SADI


FE CO2 (tCO2/MWh) FE CH4 (ton CH4/MWh) FE N2O(ton N2O/MWh)
2000 0,237 4,43E-06 7,17E-07
2001 0,173 3,16E-06 4,41E-07
2002 0,15 2,71E-06 3,06E-07
2003 0,189 3,45E-06 3,92E-07
2004 0,239 4,84E-06 7,38E-07
2005 0,252 5,17E-06 8,91E-07
2006 0,267 5,67E-06 9,57E-07
2007 0,301 6,84E-06 1,17E-06
2008 0,329 7,55E-06 1,35E-06
2009 0,305 6,79E-06 1,21E-06
2010 0,311 7,57E-06 1,42E-06
2011 0,334 8,21E-06 1,56E-06
2012 0,345 8,39E-06 1,55E-06
2013 0,332 8,14E-06 1,48E-06
2014 0,332 7,98E-06 1,47E-06
2015

Primer año (2000): El año de partida de cada serie de tiempo (a partir de los datos
anuales).
El último año (2015): El año final de cada serie de tiempo (a partir de los datos
anuales)
N (n): el número de valores anuales en el cálculo con exclusión de los valores perdidos
(De todos los promedios de datos anuales).
Prueba de S (columna E): Si n es 9 o menos, la estadística de prueba S se muestra. El
valor absoluto de S se compara con las probabilidades de la prueba no paramétrica de
Kendall-Mann para la tendencia (Gilbert 1987) para definir si hay una tendencia
monótona o no en el ά nivel de significación.

7
Un resultado positivo (negativo) el v a l o r d e S indica un a l z a ( Hacia abajo)
l a tendencia. Aunque, como n es mayor que 9, esta celda está vacía.

Prueba Z (): Si n es mayor que 10, la estadística de prueba Z se mostrará en la celda


anteriormente indicada. El valor absoluto de Z se compara con el valor normal de de la
distribución acumulada para definir si hay una tendencia o no en el nivel
seleccionado α de significación. Un resultado positivo / (negativo) el valor de Z indica
una hacia arriba (hacia / abajo) la tendencia. Si n es 9 o menos, esta celda está vacía.

Significancía (): el nivel ά de significación más pequeño con el que la prueba


demuestra que la hipótesis es nula y que no tiene ninguna tendencia y debería ser
rechazada. Si n es de 9 o menos, la prueba se basa en prueba de S. Y si n es al menos
10, la prueba se basa en el estadístico Z (normal).

Para los cuatro niveles de significación se utilizan en la planilla:

*** Si la tendencia a α = 0,001 nivel de significación

**si la tendencia a α = 0,01 nivel de significación

*si la tendencia a α = 0,05 nivel de significación

+si la tendencia a α = 0,1 nivel de significación

El nivel de significación de acuerdo al n es para FE CO2 (tCO2/MWh) α = 0,001

Sen pendiente estimación Q (): O estimador Sen de la pendiente de modo lineal.


Es decir, que es posible cambiar también la tendencia por unidad de tiempo que uno
desee calcular (en este caso un año).

Qmin99 (): el límite inferior del intervalo de confianza del 99% de Q α = 0,1)
Qmax99 (): el límite superior del intervalo de confianza del 99% de Q α = 0,1)
Qmin95 (): el límite inferior del intervalo de confianza del 95% de Q α = 0,05)
Qmax95 (), el límite superior del intervalo de confianza del 95% de Q α = 0,05)
B (): estimación de la constante B en la ecuación (6) f (años) = Q * (año-primer año) +
B para una tendencia lineal

Bmin99 (): estimación de la Bmin99 constante en la ecuación.


f (años) = * Qmin99 (año-primer año) Bmin99 + el 99% nivel de confianza de tendencia
lineal
8
Bmax99 (): estimación de la Bmax99 constante en la ecuación.
f (años) = * Qmax99 (año-último año) Bmax99 + el 99% nivel de confianza de
tendencia lineal:

Bmin95 (): estimación de la Bmin95 constante en la ecuación.


f (años) = * Qmin95 (año-último año) Bmin95 + el 95% nivel de confianza de una
tendencia lineal:

Bmax95 (columna Q): estimación de la Bmax95 constante en la ecuación.


f (años) = * Qmax95 (año-primer año) Bmax95 + el 95% nivel de confianza de una
tendencia lineal

En el cálculo de las constantes B en la vez que se usa en forma t. t = primer


año, donde primer año es el primer año de todos los datos en los datos anuales de la
hoja de cálculo.

3.3 Visión de los datos y resultados

Los resultados numéricos del cálculo estadístico de series temporales se muestran en el


área=B14: C26. TsNumber 'es el número ordinal de la serie de tiempo en las tablas del
grupo Anual de datos y hojas. Los demás valores se derivan de la tabla 'Tendencia!
Estadísticas E6.
El primer y último año se combinan a la misma celda B6:C6. Todos estos valores se
actualizan además cuando se oprime en la planilla de cálculo el botón Next Time
Series o Before Time Series (anterior y posterior de la serie de tiempo).
La tabla de valores de puntos para el gráfico se muestra en las columnas F: M, desde la
fila 29 hacia abajo.
Los años en la columna F y los valores de datos en la columna G se derivan de los datos
anuales de la hoja de cálculo.
La columna H contiene los valores de punto de la línea del estimador de la pendiente de
Sen para una tendencia lineal calculada con la ecuación f (años) = Q * (año-firstYear) +
B.
En las columnas I: L son los valores de puntos correspondientes de las líneas del 99% y
95% intervalo de confianza para la estimación de la pendiente de Sen.
Los residuos calculados se muestran en la última columna, columna M en la planilla
xls.

9
Cabe recordar que el residuo es la distancia o diferencia de cada dato 0 -/+ respecto de
la pendiente ajustada.

4. Resultado ref (FE N2O(ton N2O/MWh)

GEIs BS AS

TsNumber 3
FE N2O(ton
Name N2O/MWh)
Years 2000 - 2014
n 14
Test S
Test Z 3,96
Signific. ***
Q 9,61E-08
Qmin99 5,43E-08
Qmax99 1,33E-07
Qmin95 6,57E-08
Qmax95 1,18E-07
B 3,80E-07
Bmin99 7,17E-07
Bmax99 9,40E-08
Bmin95 6,19E-07

Bmax95 2,47E-07

10
En resumen; el valor de la prueba Z define si hay una tendencia monótona o no según el
ά nivel de significación. Tal y como se demostró en el gráfico 1.1 no hay una tendencia
monótona. Sin embargo, el valor positivo de Z indica un alza hacia arriba de la
tendencia.
Los residuos muestran ser los una distribución aleatoria, (no son iguales, se mantienen
en valores aleatorios y lejanos respecto del eje X (lugar que grafica el residuo) si se
encontraran muy cercanos al eje X, encontraríamos una linealidad creciente monótona
de la tendencia; pero no es monótona dado la variación +-+- de los últimos años de
registro.
Por lo expuesto, se concluye que la tendencia aunque creciente es lineal aunque no
monótona, como lo indica su residuo.
No obstante puede encontrarse linealidad o monotonía desde el dato de 2000 a 2008 y
2012 a 2014 (ver residuo en Grafico 1.1). El caso de la concentración de gases de efecto
invernadero como lo es (FE N2O(ton N2O/MWh), es un ejemplo de series de tiempo en la que
la tendencia es no monótona, es decir, disminuye, aumenta, disminuye. Sin embargo en la
serie de tiempo 2000- 2015 la tendencia aumenta con una linealidad muy marcada.
Dado que el valor del estimador B 3,80E-07 positivo, indica que la tendencia de
datos creciente, por lo que no hay motivos metodológicos para rechazar la H0 de
ninguna tendencia, y se asume con una confianza del 99% la aceptación de H1 o
hipótesis de aumento de la tendencia en los datos en el período estudiado. Esta
conclusión también se puede hacer sobre la base de los residuos.
Teniendo en cuenta el resultado ofrecido por el estimador de la tendencia anual calculada
encontramos que de mantenerse, el valor futuro estimado a 2030 será de 3.264E-06 para FE
N2O(ton N2O/MWh); valor que de no modificar el escenario de tendencia debido a las
actividades antropogénicas actuales; dista y se aleja de las presunciones del Índice de
Calidad Ambiental Calculado.

11
Estimador tendencias de esenarios
Sen's 99 % conf. 99 % conf. 95 % conf. 95 % conf.
Año Data estimate min max min max Residual
2000 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2001 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2002 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2003 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2004 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2005 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2006 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2007 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2008 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2009 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2010 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2011 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2012 0,00 0,00 0,00 0,00 0,00 0,00 0,00
2013 0,00 0,00 0,00 0,00 0,00 0,00 0,00
1,47E- 1,726E-
2014 06 06 1,477E-06 1,96E-06 1,538E-06 1,904E-06 -2,56E-07
1,822E-
2015 06 1,531E-06 2,093E-06 1,604E-06 2,023E-06
1,918E-
2016 06 1,585E-06 2,226E-06 1,67E-06 2,141E-06
2,014E-
2017 06 1,639E-06 2,36E-06 1,736E-06 2,259E-06
2,111E-
2018 06 1,694E-06 2,493E-06 1,801E-06 2,378E-06
2,207E-
2019 06 1,748E-06 2,626E-06 1,867E-06 2,496E-06
2,303E-
2020 06 1,802E-06 2,759E-06 1,933E-06 2,614E-06
2,399E-
2021 06 1,856E-06 2,893E-06 1,998E-06 2,733E-06
2,495E-
2022 06 1,911E-06 3,026E-06 2,064E-06 2,851E-06
2,591E-
2023 06 1,965E-06 3,159E-06 2,13E-06 2,97E-06
2,687E-
2024 06 2,019E-06 3,293E-06 2,195E-06 3,088E-06
2,783E-
2025 06 2,073E-06 3,426E-06 2,261E-06 3,206E-06
2,88E-
2026 06 2,128E-06 3,559E-06 2,327E-06 3,325E-06
2,976E-
2027 06 2,182E-06 3,692E-06 2,393E-06 3,443E-06
3,072E-
2028 06 2,236E-06 3,826E-06 2,458E-06 3,562E-06
3,168E-
2029 06 2,29E-06 3,959E-06 2,524E-06 3,68E-06
3,264E-
2030 06 2,345E-06 4,092E-06 2,59E-06 3,798E-06

Lic. Sociólogo (UBA). Ernesto Di Marco. F.M 429.588

12
Referencia Bibliográfica:
Gilbert, R.O. de 1987. Métodos estadísticos para la vigilancia de la contaminación del
medio ambiente. Van Nostrand Reinhold, Nueva York.
Sirois, Allan, 1998. Una breve visión general y sesgada de análisis de series
temporales. En la OMM n º 133: OMM / EMEP taller de avanzada
Métodos estadísticos y su Aplicación al aire conjuntos de calidad de datos (Helsinki,
14-18 Septiembre de 1998). TFMM 2000. Acta de la Primera Reunión del Grupo de
trabajo (23-25 de octubre de 2000 Viena, Austria).
http://www.ubavie.gv.at/tfmm/pages/meet.htm
Quality Assurance Handbook for Air Pollution Measurement Systems Volume
II Ambient Air Quality Monitoring Program FINAL DRAFT.

5. Anexo. Macro xls de la planilla de cálculo.

'COMMON SETTINGS
Option Base 1 'Default indexing of arrays starts from 1
'Code for missing data in arrays:
Const MissingValue As Double = -999999#
'Maximum number of data in one time series:
Const MaxData As Integer = 100
'Codes for different significance levels:
'Minimum count of data to use normal approximation
' in Mann-Kendall test. Below this value the S statistics
' is used:
Const MinMannKendNorm As Integer = 10
'Minimum count of data to calculate confidence interval
'in Sen's method
Const MinSenConf As Integer = 10
Const S001 As String = "***" 'alpha = 0.001
Const S01 As String = "**" 'alpha = 0.01
Const S05 As String = "*" 'alpha = 0.05
Const S1 As String = "+" 'alpha = 0.1
'Arrays of critical values of Mann-Kendall statistic S
' for significance levels 0.001, 0.01, 0.05 and 0.1
' of two-sided test when n is between 4 and 10.
' The arrays will be filled by the subroutine fillS
Dim S_001(4 To 10) As Integer
Dim S_01(4 To 10) As Integer
Dim S_05(4 To 10) As Integer
Dim S_1(4 To 10) As Integer
Private Sub CB_CalculateStatistics_Click()
' The main program of calculation
' - Retrieves the data values from the sheet "Annual data" with
' the subroutine GetData
' - Calculates the statistics with the subroutines MannKendall
' and Sen and with the function calcB and saves the results into
' the sheet "Trend statistics"
' - Finally calls the workbook level routines makeCollection and
' drawFigure preparing the sheet Figure
Dim nofCol As Integer 'Number of columns i.e. time series
Dim colno As Integer 'Column number of a time series
13
Dim firstYear As Integer 'first year of a time series
Dim baseYear As Integer 'first year of all time series
Dim nYears As Integer 'number of years in a time series
27
Dim n As Integer 'true data values in a time series
'i.e. missing values are not considered
Dim x(MaxData) As Double 'Array for data values of a time series
Dim s As Integer 'Mann-Kendall test statistic for n=4..10
Dim Z As Double 'Mann-Kendall test statistic for n>10
Dim signif As String 'significance of trend
'Sen's slope estimator Q and its 99% and 95% confidence levels:
Dim Q As Double, Qmin99 As Double, Qmax99 As Double
Dim Qmin95 As Double, Qmax95 As Double
'Constants B for equation of lines of Sen's slope and conf. intervals:
Dim B As Double, Bmin99 As Double, Bmax99 As Double
Dim Bmin95 As Double, Bmax95 As Double
' The result cells are emptied before the calculation starts
Worksheets("Trend Statistics").Range("E6:Q30") = ""
nofCol = Worksheets("Annual data").Cells(8, 2).value
baseYear = Worksheets("Annual data").Cells(14, 1).value
Call fillS 'initializes arrays of Mann-Kendall probabilities
'Calculation of trend statistics for each time series at a time
For colno = 2 To nofCol + 1
If Not GetData(colno, baseYear, firstYear, nYears, n, x) Then
Exit Sub
End If
If n >= 2 Then 'nothing can be computed, if n<2
'First the existence of trend is tested using Mann-Kendall method.
Call MannKendall(nYears, x, s, Z, signif)
If n < MinMannKendNorm Then
Worksheets("Trend Statistics").Cells(4 + colno, 5) = s
Else
Worksheets("Trend Statistics").Cells(4 + colno, 6) = Z
End If
Worksheets("Trend Statistics").Cells(4 + colno, 7) = signif
'Evaluation of Sen's slope estimator and confidence intervals
Call Sen(nYears, x, Q, Qmin99, Qmax99, Qmin95, Qmax95)
Worksheets("Trend Statistics").Cells(4 + colno, 8) = Q
B = calcB(nYears, x, firstYear, baseYear, Q)
Worksheets("Trend Statistics").Cells(4 + colno, 13) = B
If n >= MinSenConf Then
Worksheets("Trend Statistics").Cells(4 + colno, 9) = Qmin99
Worksheets("Trend Statistics").Cells(4 + colno, 10) = Qmax99
Worksheets("Trend Statistics").Cells(4 + colno, 11) = Qmin95
Worksheets("Trend Statistics").Cells(4 + colno, 12) = Qmax95
'Coefficients B for equation of linear trend f(t)=Qt+B
Bmin99 = calcB(nYears, x, firstYear, baseYear, Qmin99)
Bmax99 = calcB(nYears, x, firstYear, baseYear, Qmax99)
Bmin95 = calcB(nYears, x, firstYear, baseYear, Qmin95)
Bmax95 = calcB(nYears, x, firstYear, baseYear, Qmax95)
Worksheets("Trend Statistics").Cells(4 + colno, 14) = Bmin99
Worksheets("Trend Statistics").Cells(4 + colno, 15) = Bmax99
Worksheets("Trend Statistics").Cells(4 + colno, 16) = Bmin95
Worksheets("Trend Statistics").Cells(4 + colno, 17) = Bmax95
End If
End If
Next colno
' Draw the figure of the first component
Sheets("Figure").Cells(9, 3).value = 1
Sheets("Figure").Cells(10, 3).value = Sheets("Annual data").Cells(13,
2).value
Application.Run "makeCollection"
14
Application.Run "DrawFigure"
End Sub 'CB_CalculateStatistics_Click
Private Function GetData(ByVal colno As Integer, ByVal baseYear As
Integer, firstYear As Integer, nYears As Integer, n As Integer, x() As
Double) As Boolean
' Retrieving of data of one time series into the array x()
' colno is the column of the worksheet "Annual data" where the
' values of the time series exist.
' The real number of annual values n in time series is calculated
' If the cell is empty it is understood as a missing value.
Dim rowno As Integer 'row of the data cell
Dim lastYear As Integer 'last year of the time series
Dim nVal As Integer 'counter for number of true data
Dim i As Integer 'counter for data loop
Dim Error As Integer
firstYear = Worksheets("Annual data").Cells(10, colno).value
lastYear = Worksheets("Annual data").Cells(11, colno).value
nYears = lastYear - firstYear + 1
nVal = 0
For i = 1 To nYears
If firstYear < baseYear Then
Error = MsgBox("For the time series """ + _
Worksheets("Annual data").Cells(13, colno).value + _
""" first year is too early!")
GetData = False
Exit Function
End If
rowno = 13 + i + firstYear - baseYear
If IsEmpty(Worksheets("Annual data").Cells(rowno, colno)) Then
x(i) = MissingValue
Else
nVal = nVal + 1
x(i) = Worksheets("Annual data").Cells(rowno, colno)
End If
Next i
n = nVal
GetData = True
End Function ' GetData
Private Sub MannKendall(ByVal nYears As Integer, x() As Double, s As
Integer, Z As Double, signif As String)
'Calculates the MannKendall test
'Calls the function tiedSum
'Uses the string constants S001, S01, S05 and S1
Dim absS As Integer 'value of absS
Dim varS As Double 'the variance of S
Dim absZ As Double 'value of abs(Z)
Dim k As Integer, j As Integer 'counters for slopes
Dim n As Long 'number of true values in x()
Z = MissingValue ' returns MissingValue for Z
' if they are not calculated
'Computing of the Mann-Kendall statistic S.
signif = ""
n = IIf(x(nYears) <> MissingValue, 1, 0)
s = 0
For k = 1 To nYears - 1
If x(k) <> MissingValue Then
n = n + 1
For j = k + 1 To nYears
If x(j) <> MissingValue Then
s = s + Sgn(x(j) - x(k))
End If

15
Next j
End If
Next k
If n < 4 Then
'If n is less than 4, the method can not be used at all
Exit Sub
ElseIf n < MinMannKendNorm Then
'If n is between 4 and 10, S is compared directly to Mann-Kendall
statistics for S
absS = Abs(s)
signif = Switch(absS >= S_001(n), S001, absS >= S_01(n), S01, absS >=
S_05(n), S05, absS >= S_1(n), S1, True, "")
Else 'n>=MinMannKendNorm
'If n is at least 10, the normal distribution is used
'Firstly the variance VAR(S) is calculated
'The correction term for ties is calculated by the function tiedSum
varS = (n * (n - 1) * (2 * n + 5) - tiedSum(nYears, x)) / 18#
'Calculation of test statistic Z using S and its variance VAR(S)
Z = Switch(s > 0, (s - 1) / Sqr(varS), s < 0, (s + 1) / Sqr(varS), s
= 0, 0#)
'The absolute value of Z is compared to critical value Z[1-alpha/2]
'which is obtained from the standard normal table. The presence and
'significance of the trend is evaluated by testing four different
'levels of significance: '0.001, 0.01, 0.05 and 0.1
absZ = Abs(Z)
signif = Switch(absZ > 3.292, S001, absZ > 2.576, S01, absZ > 1.96,
S05, absZ > 1.645, S1, True, "")
End If
End Sub 'MannKendall
Private Sub Sen(ByVal nYears As Integer, x() As Double, Q As Double,
Qmin99 As Double, Qmax99 As Double, Qmin95 As Double, Qmax95 As
Double)
'Calculates Sen's slope estimator Q and its 99% (Qmax99,Qmin99)
' and 95 % (Qmax95, Qmin95)confidence levels
' Calls the function tiedSum and the subroutine
CalulateConfidenceInterval
Dim nofQ As Integer 'number of value pairs
Dim Qarray(MaxData * (MaxData - 1) / 2) As Double 'Array for the
slopes
of value pairs
Dim k As Integer, j As Integer 'counters for loops
Dim n As Long 'number of true values in x()
Dim Calpha As Double 'C-alpha for calculation of conf.intervals of Q
'Computing of slopes of individual value pairs into Qarray
nofQ = 0 'used as counter for Qarray
n = IIf(x(nYears) = MissingValue, 0, 1)
For k = 1 To nYears - 1
If x(k) <> MissingValue Then
n = n + 1
For j = k + 1 To nYears
If x(j) <> MissingValue Then
nofQ = nofQ + 1
Qarray(nofQ) = (x(j) - x(k)) / (j - k)
End If
Next j
End If
Next k
'The median of individual slopes in Qarray is the Sen's
'slope estimator. The median is calculated by the function "median".
Q = median(nofQ, Qarray)
If n >= MinSenConf Then

16
'The confidence intervals are calculated only if n is at least 10.
'Computing of variance VAR(S) of Mann-Kendall statistics S.
'The correction term for ties is calculated by the function tiedSum
varS = (n * (n - 1) * (2 * n + 5) - tiedSum(nYears, x)) / 18#
'The 100(1-alpha)% two-sided confidence intervals for the
'Sen's slope are computed with two values of alpha: 0.01 and 0.05
'which means 99% and 95% confidence intervals. The values of
'Z[1-alpha/2] are obtained from the standard normal table.
'Case alpha=0.01: Z[1-alpha/2]=Z[0.995]=2.576
Calpha = 2.576 * Sqr(varS)
Call CalculateConfidenceInterval(Calpha, nofQ, Qarray, Qmin99,
Qmax99)
'Case alpha=0.05: Z[1-alpha/2]=1.96
Calpha = 1.96 * Sqr(varS)
Call CalculateConfidenceInterval(Calpha, nofQ, Qarray, Qmin95,
Qmax95)
Else
Qmin99 = MissingValue
Qmax99 = MissingValue
Qmin95 = MissingValue
Qmax95 = MissingValue
End If
End Sub 'Sen
Private Function tiedSum(n As Integer, x() As Double) As Integer
'Calculates sum related to tied groups(= two or more equal values)
' for the variance of Mann-Kendall statistics S
'n = number of values in the array x including missing values
'Function tiedSum is called by subroutines Sen and MannKendallNorm
Dim m As Integer ' number of tied groups
Dim tval() As Double ' data values of tied groups
ReDim tval(n)
Dim t() As Integer, nt As Integer ' number of data in tied groups
ReDim t(n)
Dim p, i As Integer 'indexes for the loops
Dim newValue As Boolean
Dim tSum As Integer
'Calculation of the number of tied groups m and the number of data
' in tied groups t()
m = 0
For i = 1 To n - 1
If x(i) <> MissingValue Then
newValue = True
If m > 0 Then
For p = 1 To m
If x(i) = tval(p) Then
newValue = False 'this value is alredy managed
Exit For
End If
Next p
End If
If newValue Then
nt = 1 'number of equal values x(i)
For p = i + 1 To n
If x(p) = x(i) Then
nt = nt + 1
End If
Next p
If nt > 1 Then ' new group only if nt>1
m = m + 1
t(m) = nt
tval(m) = x(i)

17
End If
End If
End If
Next i
'Calculating the sum related to tied groups for variance
tSum = 0
If m > 0 Then
For p = 1 To m
tSum = tSum + t(p) * (t(p) - 1) * (2 * t(p) + 5)
Next p
End If
tiedSum = tSum
End Function 'tiedSum
Sub CalculateConfidenceInterval(ByVal Calpha As Double, ByVal nofQ As
Integer, Qarray() As Double, lowerLimit As Double, upperLimit As
Double)
'Computes confidence interval for Sen's slope estimate.
'Input parameters: Calpha = Z[1-alpha/2],
' nofQ - number of slopes of all data pairs
' Qarray - array of slopes of all data pairs
'Subroutine returns the lowerLimit and upperLimit.
'Calls the subroutine SortArray
'Is called by the subroutine Sen
Dim M1 As Double 'M1:th largest ordered slope
Dim M2 As Double 'M2:th largest ordered slope
Dim M1int As Integer 'integer part of M1 (>0)
Dim M2int As Integer 'integer part of M2+1 (>0)
Dim QarraySort() As Double
ReDim QarraySort(nofQ)
'The array Qarray is sorted to the array QarraySort
Call SortArray(nofQ, Qarray, QarraySort)
M1 = (nofQ - Calpha) / 2
M2 = (nofQ + Calpha) / 2
If M1 > 1 Then
'to be sure that index does not point outside QarraySort
M1int = Int(M1) 'find the integer part of M1
'Interpolation of the lower limit
lowerLimit = QarraySort(M1int) + (M1 - M1int) * (QarraySort(M1int
+ 1) - QarraySort(M1int))
Else
lowerLimit = QarraySort(1)
End If
If M2 < nofQ - 1 Then
'to be sure that index does not point outside QarraySort
M2int = Int(M2 + 1) 'because the indexing of QarraySort begins
from zero
'Interpolation of the upper limit
upperLimit = QarraySort(M2int) + (M2 + 1 - M2int) *
(QarraySort(M2int + 1) - QarraySort(M2int))
Else
upperLimit = QarraySort(nofQ)
End If
End Sub 'CalculateConfidenceInterval
Public Function calcB(nYears As Integer, x() As Double, firstYear As
Integer, baseYear As Integer, Q As Double) As Double
' calculates the constant B for the equation of linear trend
f(t)=Q*t+b.
' The zero point of time axis is the "baseYear"
' Calls the function median
Dim n As Integer 'the number of true values in time series
Dim year As Integer 'the true year of the data value

18
Dim i As Integer 'index for loop
Dim val() As Double 'array of differences
ReDim val(nYears)
n = 0
For i = 1 To nYears
year = firstYear + i - 1
If x(i) <> MissingValue Then
n = n + 1
val(n) = x(i) - Q * (year - baseYear)
End If
Next i
' the estimate for B is median of the calculated differences
calcB = median(n, val)
End Function ' calcB
Private Function median(nofV As Integer, values() As Double) As Double
' calculates median of values in the array values(), indexed from 1 to
nofV
' calls the subroutine sortArray
' is called by the fuction calcB and by the subroutine Sen
Dim i As Integer
Dim sortedValues() As Double
ReDim sortedValues(nofV)
Call SortArray(nofV, values, sortedValues)
If nofV Mod 2 = 0 Then 'nofv is even
i = Int(nofV / 2)
median = (sortedValues(i + 1) + sortedValues(i)) / 2
Else 'nOfvalues is odd
median = sortedValues((nofV + 1) / 2)
End If
End Function 'median
Sub SortArray(ByVal nofV As Integer, values() As Double,
sortedValues()
As Double)
'This subroutine ranks the values of an array from smallest to
largest.
'The sorting method is SELECTION SORT
'The ranked values are stored into the other array called
sortedValues.
'Input parameters: nofV - number of values in the array values
' values - values to be ranked, indexed from 1 to nofV
'Subroutine returns the sorted array at sortedValues.
'Is called by the function median and by the subroutine
'CalculateConfidence interval
Dim ind As Integer, i As Integer, j As Integer
Dim minV As Double, maxV As Double
Dim carray() As Double 'the data is first copied to this array
ReDim carray(nofV)
Dim ignoreV As Double 'value that is ignored in carray when sorting
For i = 1 To nofV 'Copy the original array to carray
carray(i) = values(i)
Next i
'Find the smallest and largest value
ind = 1
minV = carray(1) 'initialize the smallest value
maxV = carray(1) 'initialize the largest value
For i = 2 To nofV
If carray(i) < minV Then
minV = carray(i)
ind = i
End If
If carray(i) > maxV Then

19
maxV = carray(i)
End If
Next i
sortedValues(1) = minV 'the smallest data value
ignoreV = minV - 10 'smaller value than the smallest data value
carray(ind) = ignoreV 'this value is later ignored in sorting
'now sort the values
For j = 2 To nofV
minV = maxV
For i = 1 To nofV
'find the minimum from the rest of the array
If carray(i) <= minV And carray(i) > ignoreV Then
minV = carray(i)
ind = i
End If
Next i
sortedValues(j) = minV
carray(ind) = ignoreV 'from now on this element is ignored
Next j
End Sub 'SortArray
Private Sub fillS()
'Fills the arrays S_nnn of probabilities for two-tailed
' Mann-Kendall test
'The index of tables is the number of data if n=4...10
'Each array entry is an absolute value of the Mann-Kendall
' statistic S, with which the probability that there is no trend
' is less than the probability level p related to the array:
' S_001: p=0.001, S_01: p=0.01, S_05: p=0.05 and S_1: p=0.1.
' Source of values: Gilbert, 1987, Table A18
'Value 9999 indicates that the probability level can not be
' reached with given number of data
Dim n As Integer
For n = 4 To 10
S_001(n) = 9999
S_01(n) = 9999
S_05(n) = 9999
S_1(n) = 9999
Next n
S_001(7) = 21
S_001(8) = 26
S_001(9) = 30
S_001(10) = 35
S_01(6) = 15
S_01(7) = 19
S_01(8) = 22
S_01(9) = 26
S_01(10) = 29
S_05(5) = 10
S_05(6) = 11
S_05(7) = 15
S_05(8) = 18
S_05(9) = 20
S_05(10) = 23
S_1(4) = 6
S_1(5) = 8
S_1(6) = 11
S_1(7) = 13
S_1(8) = 16
S_1(9) = 18
S_1(10) = 21
End Sub

20

También podría gustarte