viernes, 24 de agosto de 2012

La PRCF ¿qué es y cómo se calcula?

Recientemente me he puesto a analizar unos datos de series temporales de dinámica de poblaciones de procesionaria (estimadas a partir de mediciones del grado de infestación de rodales) en Mora de Rubielos, Teruel, en el marco de una colaboración a tres bandas entre el Laboratorio de Sanidad Vegetal de Mora de Rubielos (Rodólfo Sánchez, Gerárdo Sánchez), la Universidad de Granada (José Antonio Hódar, Regino Zamora) y la Universidad Rey Juan Carlos (en mi humilde persona).

Para poder discernir entre factores endógenos y exógenos que podrían estar causando las oscilaciones de las series, una de las primeras cosas que hay que hacer es tratar de determinar si hay dependencia de la densidad y con cuantos retardos. Es decir, si el hecho de que, por ejemplo, uno, dos o tres años atrás, la población estuviera en un máximo, va a influir en que ahora, en tiempo t, la población haya sufrido un descenso en el número de individuos como consecuencia del agotamiento de los recursos u otros factores que podrían estar operando a nivel intraespecífico. Pues bien, para determinar con cuantos retardos la propia variable tiene un efecto sobre la observación de esta misma variable en tiempo t, Alan Berryman (1999) sugiere el uso de lo que llama la PRCF (partial rate correlation function), que no traduzco porque no se si lo haría bien. Para aquellos que estéis un poco familiarizados con la jerga de series temporales, no os será desconocido la función de autocorrelación (ACF) y la función de autocorrelación parcial (PACF). Estas son herramientas exploratorias básicas para identificar la estructura de una serie temporal. Pues bien, en el caso de dinámica de poblaciones, Berryman sugiere que es más apropiado utilizar la PRCF... ¿y qué es esto de la PRCF? Se trata de correlacionar la tasa de cambio poblacional en tiempo t, con la densidad poblacional en tiempo t-1, t-2 y así sucesivamente. La tasa de cambio de la población es lo que Berryman denomina como variable Rt, y que en realidad es el log(Nt/Nt-1). Es decir, una medida de cómo la población cambia entre un periodo y el siguiente.

En mi periplo analítico, me encontré con que no tenía ni idea de cómo calcular la PRCF en R, que es ya el único software con el que trabajo. Busqué en los foros y nada. Lo más que encontré fue la página de un software (PAS) que diseñó Alan Berryman ya hace tiempo y que explicaba con fórmulas cómo calcular la PACF y, a partir de ahí, la PRCF. Pero honestamente, no entendí mucho. Así que di en mis indagaciones con un artículo de Mauricio Lima publicado en PLoS ONE donde decía explícitamente que ellos habían calculado la PRCF con un código escrito en R. Escribí a Mauricio y este rápidamente me dirigió a Sergio Estay, quien con mucha diligencia me pasó el código, que con permiso suyo y agradeciéndole de antemano su enorme ayuda, pongo aquí a disposición de todos aquellos interesados (he modificado un par de cosas para generalizarlo, pero en esencia, todo el código es suyo).

Código para calcular la función PRCF en R 

Al final, y viendo el código de Sergio (y con alguna aclaración suya) entendí que era esto de la PRCF... y es bastante simple. Para más de un retardo la PRCF es equivalente a la PACF. Y para un retardo es simplemente la correlación entre Rt (la tasa de cambio) y Nt-1. La (última) pregunta que yo me hice fue ¿por qué para dos o más retardos la PRCF es igual a la PACF? Y dándole vueltas mientras volvía a casa en coche, llegué a una conclusión, que expongo a continuación y que no se si será más o menos acertada (si alguien conoce una respuesta más acertada por favor que me corrija).

Básicamente lo que se está diciendo es que para dos retardos (y generalizable a otros retardos por encima de uno):

r(Rt ~ Nt-2) habiendo quitado el efecto de Nt-1 sobre Rt 
r(Nt ~ Nt-2) habiendo quitado el efecto de Nt-1 sobre Nt 

¿Tiene esto algún sentido? Lo tiene si pensamos que Rt se calcula como el log(Nt/Nt-1). Por tanto si quitamos el efecto de Nt-1 sobre Rt, lo que nos queda es básicamente Nt. Por tanto, con dos o más retardos, la PRCF será equivalente a la PACF.

Y ya para terminar, incluyo aquí los resultados de la PRCF para las 11 parcelas con las que estamos trabajando en Mora de Rubielos, y en donde se ve que la dinámica de la procesionaria está regulada por efectos de densidad con un único retardo.

 

2 comentarios:

rosana Ferrero dijo...

Interesante post; vengo trabajando con el PRCF desde el 2005 aproximadamente y creo que las notas pueden ayudar a entenderlo.
The confounding effects of partial autocorrelation function (PACF) can be removed by calculating the partial rate correlation function (PRCF) between R and lnNt-d with the effects of lower lags removed (Berryman 1999). For example, it is statistically possible for some of the correlation at lag 3 to be carried over from lags 1 and/or 2, but it is not detected by a PACF.
The PRCF (Berryman and Turchin 2001), provide information about the ‘‘order’’ of, or number of lags involved in, the dynamic process (Royama 1977, 1992). Determining the order of dynamics is important because it provides information on the number of variables involved in feedback control of population density. For example, negative feedback of the first order usually results from intraspecific interactions, such as competition for food or space, while those of second order often result from interactions between species, particularly between consumers and their resources (Royama 1992, Berryman 1999, Turchin 2003).
También he hecho un código en R para su aplicación, que le puede servir a alguien:
fcf<-function(x1=serie,lagmax = 7)
{
a<-acf(x1, lag.max = lagmax, plot = FALSE)
aa<-a$acf[-1] #porque R pone en lag=0 un 1.
p<-pacf(x1, lag.max = lagmax, plot = FALSE)
pp<-p$acf
pp[1]<-cor(diff(x1),x1[-length(x1)])

names<-as.character(1:lagmax) #c("1","2","3","4","5","6","7","8","9","10")
#par(mfrow=c(2,1))
barplot(as.vector(aa), col="darkgrey", width = 0.9, axis.lty=1, space = 0.1, names.arg=names, ylim=c(-1,1), ylab="ACF", xlab="Lags", font.lab=2)
abline(h=0)
abline(h=-1)
abline(h=1.96/sqrt(a$n.used),lty=2, lwd=2)
abline(h=-1.96/sqrt(a$n.used),lty=2, lwd=2)
barplot(as.vector(pp)[-(lagmax+1)], col="darkgrey", width = 0.9, axis.lty=1, space = 0.1, names.arg=names, ylim=c(-1,1), ylab="PRCF", xlab="Lags", font.lab=2)
abline(h=0)
abline(h=-1)
abline(h=1.96/sqrt(p$n.used),lty=2, lwd=2)
abline(h=-1.96/sqrt(p$n.used),lty=2, lwd=2)
}


Saludos!
Rosana Ferrero

rosana Ferrero dijo...

Aquí está el mejor paper de Berryman sobre este tema:
http://ecologialit.tripod.com/sitebuildercontent/sitebuilderfiles/timeseriesdensitydependence.pdf

También es muy interesante el libro de Royama (1992):
http://books.google.es/books?id=_TRVHVx11bgC&printsec=frontcover&hl=es&source=gbs_ge_summary_r&cad=0#v=onepage&q&f=false

Otro saludo

Buscar entradas