Gráficas de líneas y puntos. Modelos

Libreria

ggplot2, dplyr

Datos

obdung.csv, son los datos observados de emergencia de escarabajos estercoleros de la especie Euniticellus intermedius (Cruz Rosales M. et al. 2012. Effect of ivermectin on the survival and fecundity of Euniticellus intermedius (Coleotera: Scarabaeidae). Rev. Biol. Trop. 60(1): 333-345)

La estructura de los datos es como sigue:

Se hicieron lecturas de la emergencia de adultos a traves del tiempo (DIA) sujetos a tres tratamientos. TEST, TEST-A e IV-B (éste contenia ivermectina); SEXO es el sexo de los individuos. PROP es la proporción de emergencia de los adultos emergidos por día en relación al total emergido.

exdungb.csv, archivo con los valores esperados (=predichos) por el modelo de emergencia de escarabajos.

obELP.csv, son los datos observados de las tasas de desarrollo de la palomilla gitana Cydia pomonella (Aghdam et al. 2009. Temperature-dependent development and temperature thresholds of codling moth. Environ. Entomol. 38(3): 885-895).

La estructura de los datos es como sigue:

Se hicieron lecturas del tiempo desarrollo de los diferentes estados de la palomilla (Stage), aqui solamente se analyzan larvas y huevo-larva, a diferentes temperaturas constantes (Temp), la respuesta fue la tasa promedio de desarrollo (dev, =1/dias).

predELP.csv

Son los valores predichos por diferentes modelos para los datos de C. pomonella.

Scripts

emergModel1.R

Genera valores predichos y construye tabla de datos.

devmodels.R

Contiene las funciones que representan los modelos de las tasas de desarrollo. Esta lista no es exhaustiva, el lector se le recomienda seleccionar su modelo de acuerdo a sus requerimientos, de ser necesario.

Los archivos se encuentran aquí:

https://sites.google.com/site/digitcognem/workfiles

Desarrollo

En esta sección vamos a cubrir el proceso de elaborar gráficas de puntos (observados) y el traslape con gráficas de linea que representan valores predichos (= esperados) por algún modelo matemático.

Los pasos generales para hacer un análisis de este tipo y las gráficas son los siguientes:

1. Seleccionar el modelo o modelos que pueden representar nuestros datos

2. Estimar los parámetros de estos modelos

3. Si el modelo es Ok, calcular los valores predichos

4. Arreglar los valores predichos en la misma estructura que los valores observados.

5. Realizar las gráficas.

1. Seleccionar el modelo o modelos que pueden representar nuestros datos

En el paso 1 se seleccionó el modelo de Kostal & Havelka (2001. Cryobiology. 42: 112-120):

PROP = 1/(1 + 10^(s0*(e50 - DIA)))

Donde PROP es la proporción de adultos emergidos, en el DIA establecido. Los parámetros del modelo son s0 y e50, el primero es la pendiente de la curva y el segundo es el tiempo mediano a la emergencia.

2. Estimación de parámetros.

En este caso particular, puesto que es un modelo no lineal, se empleó la función nls() de R. El archivo ecum.csv se filtró (ver Manejo de Datos) para cada uno de los tratamientos y sexo. Con esto, se empleó la función previa con valores iniciales obtenidos de la observación de los datos y los publicados por Kostal & Havelka.

Como ejemplo, se estiman los parámetros del modelo para datos del testigo A y machos:

A) Selección del conjunto de datos (tiene que activar la libreria dplyr):

tam<-filter(obdungb,TRAT=="TEST-A",SEXO=="MACHO")

Los registros de la tabla anterior son los siguientes:

DIA,TRAT,SEXO,INDIVIDUOS,PROP

34 TEST-A MACHO 0

36 TEST-A MACHO 0.04

38 TEST-A MACHO 0.07

41 TEST-A MACHO 0.22

43 TEST-A MACHO 0.43

45 TEST-A MACHO 0.78

48 TEST-A MACHO 0.93

50 TEST-A MACHO 0.95

52 TEST-A MACHO 0.97

55 TEST-A MACHO 1

57 TEST-A MACHO 1

Ahora se procede a aplicar la función nls() y estimar los parámetros del modelo, como ejemplo se utiliza el conjunto de datos anteriores (tam):

modtam<- nls(PROP ~ 1/(1 + 10^(s0*(e50 -DIA))),data= tam, start= list(s0=0.5, e50= 43), trace= TRUE)

0.05210755 : 0.5 43.0

0.01366298 : 0.3228733 43.0997889

0.006146556 : 0.2525288 43.2287525

0.006142391 : 0.2512933 43.2273048

0.00614224 : 0.2510583 43.2270763

0.006142234 : 0.2510131 43.2270331

0.006142234 : 0.2510044 43.2270248

0.006142234 : 0.2510027 43.2270232

Las instrucciones de nls son como sigue;

PROP ~ 1/(1 + 10^(s0*(e50 -DIA)))

Es la especificación del modelo en notación de R y las variables de la tabla de datos, en este caso data= tam que es el segundo argumento de la función.

start=list(s0=0.5,e50= 43)

Aquí se declaran los valores iniciales de los parámetros. El lector debe consultar trabajos similares para asignar valores iniciales, lo que facilita que la función encuentre los parámetros. En este caso, s0 se obtuvo observando el trabajo de Kostal & Havelka (op. cit.) y la mediana a la emergencia observando los datos.

trace=TRUE

hace que R imprima en la consola la secuencia iterativa de la búsqueda de los parámetros. La lineal final son los parámetros del modelo.

Si escribimos modtam en la consola, R imprime el modelo, sus parámetros y la suma de cuadrados de los residuales, observe que los parámetros son los mismos que los impresos anteriormente con el trace:

modtam

Nonlinear regression model

model: PROP ~ 1/(1 + 10^(s0 * (e50 - DIA)))

data: tam

s0 e50

0.251 43.227

residual sum-of-squares: 0.006142

Number of iterations to convergence: 7

Achieved convergence tolerance: 6.253e-06

Si escribimos summary(modtam), se presenta la estimación de los parámetros y el error estándar de cada uno de ellos, junto con una prueba de t, para la hipótesis nula par=0, es decir, que el valor del parámetro respectivo es cero, así como el valor de probabilidad de la prueba:

summary(modtam)

Formula: PROP ~ 1/(1 + 10^(s0 * (e50 - DIA)))

Parameters:

Estimate Std. Error t value Pr(>|t|)

s0 0.25100 0.01744 14.39 1.62e-07 ***

e50 43.22702 0.12340 350.30 < 2e-16 ***

---

Signif. codes:

0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02612 on 9 degrees of freedom

Number of iterations to convergence: 7

Achieved convergence tolerance: 6.253e-06

De esta manera se calculan los parámetros de cada tratamiento y sexo, y se pueden registrar en el siguiente cuadro:

La última columna es el número de insectos original.

3. Si el modelo es Ok, calcular los valores predichos

En este paso, usualmente se calcular los valores predichos para el rango de valores de los observados, en este caso, son los días.

Para agilizar los cálculos, se puede escribir un script en R y escribir la secuencia de los instrucciones (script "emergModel1.R"):

# SCRIPT PARA CALCULAR VALORES PREDICHOS, EJEMPLO DE TEST-A MACHOS:

# escribir ecuación en lenguaje R

# En este caso es el modelo de Kostal & Havelka 2001

func.emerge<-function(dia, s0, e50){

result<- 1/(1+10^(s0*(e50-dia)));

return(result)

}

#Generar los valores de x, en el rango de los valores observados

DIA<-seq(36,57, by= 1)

#Generar los valores esperados aplicando la ecuación

# y con los parámetros estimados previamente

PROP<-func.emerge(DIA,0.251, 43.227)

# generar las etiquetas de las columnas de tratamiento y sexo

# La idea es tener una tabla con la estructura igual a la de

# los valores observados

# length(DIA) nos da el tamaño de la lista que contiene

# los valores predichos

TRAT<-rep("TEST-A",length(DIA))

SEXO<-rep("MACHO",length(DIA))

# Contruir la tabla =data frame, en el mismo orden que los observados

expTAM<-data.frame(TRAT,SEXO,DIA,PROP)

# Escribir tabla a archivo csv:

write.table(expTAM,"expTAM.csv",sep=',',row.names=FALSE)

4. Arreglar los valores predichos en la misma estructura que los valores observados.

Realmente, el arreglo de los datos comienza en el paso previo, construyendo las tablas con la misma estructura que el archivo de los datos observados (obdungb.csv), aunque se hizo por partes para cada tratamiento y sexo.

Una vez calculados los valores predichos de cada uno de los casos (tratamientos y sexo), los archivos de los valores predichos se combinan en uno solo empleando LIBREOFFICE u EXCEL y se guardan en un solo archivo csv, con el nombre exdunbg.csv.

5. Realizar las gráficas

Usualmente, cuando se grafican valores predichos por un modelo y los observados, los primeros (predichos) se representan con una línea y los observados con puntos. Por lo anterior, se requieren dos archivos de datos con la misma estructura (variables = columnas) y que tengan el mismo nombre las variables en el mismo orden ambos.

figCE<-ggplot(obdungb,aes(x=DIA,y=PROP,shape=TRAT)) + geom_point(size= 6,alpha= 0.7)+ theme_bw() + geom_line(data= exdungb, aes(x= DIA,y= PROP), size=1) + facet_grid(.~SEXO)

las instrucciones anteriores se interpretan de la siguiente manera:

ggplot(obdungb,aes(x=DIA,y=PROP,shape=TRAT))

Aquí, se toma la tabla obdungb para generar los puntos, con los valores de X=DIA y los de Y=PROP, instruyendo a ggplot que asigne diferentes símbolos a los tratamientos = TRAT

geom_point(size=6,alpha=0.7)

Genera la gráfica de puntos, con tamaño y opacidad definidas

theme_bw()

Es el fondo en blanco y negro de la gráfica

geom_line(data=exdungb,aes(x=DIA,y=PROP),size=1)

Esta es la instrucción para graficas los valores predichos, aquí es la parte importante pues el conjunto de datos a graficar la línea proviene de la tabla de valores predichos (=exdungb), especificando que graficar en X=DIA y en y=PROP. El tamaño de línea es 1.

facet_grid(.~SEXO)

Despliega dos paneles por tipo de sexo.

Si queremos ver la figura pero separada por tratamientos para distinguir el efecto de los sexos:

figCE2<-ggplot(obdungb,aes(x=DIA,y=PROP, shape=SEXO)) + geom_point(size=6,alpha=0.7) + theme_bw()+geom_line(data=exdungb,aes(x= DIA, y=PROP), size=1) + facet_wrap(~TRAT)

En este caso las instrucciones son similares, pero la forma de los puntos es por SEXO y los paneles es por TRAT.

II. Multiples modelos para un conjunto de datos

En esta sección se construyen gráficas con dos o mas modelos para un solo conjuntos de datos. La secuencia es similar a la anterior. Sin embargo, en este caso es necesario tener una estructura de datos como la siguiente (ver archivo obELP.csv):

Stage,Temp,dev,Modelo

larva,14,0.017140898183065,Observado

larva,20,0.03088326127239,Observado

larva,25,0.053276505061268,Observado

...

1. Selección de modelos

para este conjunto de datos, se van a estimar los parámetros de tres modelos (Briere, Davidson y Lactin; ver por ejemplo Kontodimas et al. 2004. Environ. Entomol., 33(1): 1-11 y Davidson. 1944. J. Anim. Ecol., 13(1): 26-38). Estos modelos están implementados en r en el script devmodels.R.

2. Estimación de parámetros

Se realiza para cada estado de desarrollo (larva y huevo-pupa) y se estiman los parámetros de los tres modelos, en este caso, puesto que el script devmodels. R contiene las funciones de los modelos, es posible correr el script y llamar la funcion nls() con la función respectiva. Por ejemplo, para seleccionar larvas:

larvdat<- filter(obELP, Stage=='larva')

Ahora se puede llamar la función nls(), con el ajuste del modelo de Davidson:

fit.lvdav<- nls(dev~func.davidson(Temp,aa,bb,K),data= larvdat, start= list(aa= 4, bb= 0.2,K= 10), trace= TRUE)

Lo mismo con el modelo de Briere:

fit.lvBr<- nls(dev~func.briere1(Temp,t1,t2,c1),data= larvdat, start= list(t1=10, t2= 35,c1= 0.01), trace= TRUE)

El modelo de Lactin:

fit.lvlact<- nls(dev~func.lactin2(Temp,c1,c2,c3,c4),data= larvdat, start= list(c1= 0.003, c2= 41, c3= 2.5,c4= -1 ), trace= TRUE)

En este caso, el procedimiento no tuvo convergencia, asi que no se llevó a cabo el ajuste.

Para el caso de huevoPupa si se pudo realizar el ajuste de los tres modelos.

Los parámetros estimados fueron:

Modelo de Davidson:

Modelo de Briere:

Modelo de Lactin:

* Para el estado de larva no solución en el procedimiento de estimación de los parámetros del modelo de Lactin.

3 y 4. Calcular los valores predichos y construir las tablas

Se procedió a calcular los predichos y construir las tablas de datos de acuerdo con las instrucciones anteriores. Las tablas con los valores observados y predichos son los archivos obELP.csv y predELP.csv.

Para la tabla de predichos y larva:

# generar predichos para dos modelos de cydia p

# Estado de desarrollo: LARVA

# Advertencia: predichos DEBE usar valores de x =temp

# para los cuales y= fx tenga solución

# Generar valores de temperatura, que es x

tx<- seq(from= 10, to= 35, by = 0.10)

# Generar predichos por modelos de Briere y Davidson

prL1<- func.briere1(tx,8.869,36.35,0.00004024)

prL2<- func.davidson(tx,5.0333,0.2609,0.065)

#Generar columnas adicionales

stage<- rep("larva",length(tx))

nmB<- rep("Briere",length(tx))

nmD<- rep("Davidson",length(tx))

# Construir tabla predichos Briere para larva

predL1<- data.frame(stage,tx,prL1,nmB)

colnames(predL1)<- c("Stage","Temp","dev","Modelo")

# Construir tabla predichos Davidson para larva

predL2<- data.frame(stage,tx,prL2,nmD)

# Renombrar las columnas

colnames(predL2)<- c("Stage","Temp","dev","Modelo")

#Unir las dos tablas para larva

predLarva<- rbind(predL1,predL2)

De la misma manera se construyen las tablas de predichos para el estado huevo-pupa y se unen con la función rbind().

5. Construir las figuras

Teniendo las dos tablas, de observados (obELP) y predichos (predELP) se construye gráfica compuesta. Las instrucciones son las siguientes:

# October 13, 2017

# Plot observed against MULTIPLE predicted

# Composite chart

figELV<-ggplot(obELP,aes(x= Temp,y= dev, shape= Stage)) + geom_point(size= 5,col='black') + theme_bw() + geom_line(data= predELP, aes(x= Temp,y= dev,linetype= Modelo, col=Modelo), size= 1.5) + labs(x='TEMPERATURA', y='DESARROLLO 1/D') + theme(text= element_text(size= 16)) + scale_colour_manual(values=c("#8856a7","#f03b20","#31a354")) + guides(shape=guide_legend("OBSERVADOS"), col= guide_legend("PREDICHOS"),linetype= FALSE) + facet_wrap(~Stage)

En este caso la solución es tener dos columnas, una con los estados de desarrollo para graficar cada conjunto de datos,es decir, los estados de desarrollo, y otra columna (Modelo) que contenga los valores predichos; para la tabla de datos observados, esta columna tiene un valor "dummy" que es Observado y no aparece en la leyenda pues no hay ningún dato observado en la tabla de predichos, pero en esta tabla se encuentran los predichos de los tres modelos (Briere, Davidson y Lactin). La leyenda de los tipos de lineas se suprime (linetype=FALSE) en la opción guides() y permanece la de los colores de las lineas.

Si se quiere que aparezcan los tipos de lineas de los valores predichos, entonces hay que eliminar linetype=FALSE, sin embargo, sería redundante con los colores, que seguirían apareciendo. La moraleja es utilizar un solo tipo de clasificador visual para los modelos, usualmente es el tipo de linea y los colores se omiten (todas las lineas negras).

La figura compuesta es:

Para conocer mas con relación al ajuste de modelos no lineales, puede consultar la referencia:

Ritz, C. & J.C. Streibig. 2008. Nonlinear regression with R. Springer. New York.