viernes, 17 de octubre de 2008

La aleatorización de Ensayos genéticos forestales

En las últimas décadas se comenzaron a utilizar los diseños experimentales de un árbol por parcela con el objetivo de convertir a los ensayos de pruebas de progenies en áreas productoras de semillas, luego del raleo genético de las familias de menor rendimiento. De este modo las plantas de distintas familias quedan distribuidas aleatoriamente en la superficie del ensayo, sin embargo, esto no impide que existan plantas que deban eliminarse porque están demasiado cercanas a otras de su misma familia, con lo cual aumenta las probabilidades de que se produzcan semillas con altos niveles de consanguinidad. Por esto es que se hace necesario generar algoritmos de aleatorización que excluyan de la vecindad de un individuo a plantas de la misma familia.

Como los inconvenientes más comunes en el establecimiento de Ensayos Genéticos Forestales se vinculan con:
  • necesidad de superficies relativamente grandes de terreno: cada planta necesita espacios grandes para desarrollarse (2-25 m*m) y a su vez se requieren de más de 10 réplicas por cada material a ensayar.
  • los algoritmos aleatorizadores trabajan con matrices, por lo que se pueden aprovechar sólo sectores rectangulares cuyas dimensiones cumplan con la restricción filas*columnas=réplicas*factores.
También se hace necesario generar algoritmos que permitan usar terrenos no rectangulares y que tengan discontinuidades como lagunas, arroyos, etc.
Todos estos requerimientos fueron posibles de satisfacer mediante el R y librerías como spatstat[*] que corren bajo el mismo.
El paquete aleat.espacial, aunque aún en etapa de documentación y desarrollo, es capaz de calcular grillas óptimas (cuadradas,rectangulares o triangulares) de distribución de plantas a partir de un polígono, identificar los individuos que corresponden a borduras (simples, dobles, etc) y distribuir las réplicas de las distintas familias de modo que los individuos de las mismas familias queden lo más alejados posibles unos de otros manteniendo una distribución aleatoria, incluso en las borduras.


[*]@Article{spatstat,
Author = {Adrian Baddeley and Rolf Turner},
Title = {Spatstat: an {R} package for analyzing spatial point
patterns},
Journal = {Journal of Statistical Software},
Pages = {1--42},
Number = {6},
Note = {{ISSN} 1548-7660},
Volume = {12},
url = {www.jstatsoft.org},
year = 2005
}

Aclarando dudas

Haceme llegar tus consultas sobre el uso de sistemas libres en la Ingeniería (particularmente en la Forestal) de:
Sistemas estadísticos
Sistemas de Información geográfica
GPS
Teledetección
Bases de datos relacionales (MySQL fundamentalmete)
Diseño asistido por computadora

El R como herramienta de trabajo

El R (http://www.r-project.org/) es un leguaje de programación de alto nivel muy útil y de una potencia extraordinaria. Aunque fue desarrollado para el cálculo estadístico (para lo cual es la mejor herramienta que haya conocido) tiene funcionalidades que superan ampliamente esos objetivos.
Una de las particularidades más sobresalientes es que, al ser GNU se crean y comparten librerías para las aplicaciones más diversas y específicas, estando más cerca linguísticamente hablando de nuestras aplicaciones en ingeniería. Además tiene soporte y librerías especializadas para ayudarnos a documentar nuestros desarrollos como comúnmente ocurre en los proyectos GNU.

Adjunto un código muy sencillo para el cálculo de propagación de errores y el cálculo de superficies y errores asociados en polígonos medidos con GPS. Se puede ver la sencillez para la definición de funciones y acceso a los resultados de las mismas.

Copiando lo que se encuentra entre "###" al panel interactivo del R se cargan las funciones definidas y se las puede probar con ejemplos propios.
###
# Copyright © 2008 Sergio Roldán
# Esta biblioteca es software libre, puede redistribuir-
# la o modificarla según los términos de la GNU
# Licencia Pública General, publicada por la Free
# Software Foundation; ya sea en su versión 3 o en cualquier versión posterior.
# Esta biblioteca se distribuye con la intención de que
# sea usada, sin embargo no TIENE GARANTÍA; incluídas
# la garantías de comerciabilidad y conveniencia para un
# propósito particular. Véase GNU Licencia Pública
# General para más detallles. (www.gnu.org/licenses/gpl.txt)
#
# Sergio Roldán
# roldan.sergio@gmail.com
# Cervantes (N) 126- G4300CAD- La Banda
# Santiago del Estero

#PROPAGACION DE ERRORES
error.sum<-function (a,b,ea,eb) {
#error.sum(a,b,ea,eb)
#ea,eb error absoluto respectivos
Eabs<-sqrt((ea/a)^2+(eb/b)^2);
return(Eabs)
}

error.prod<-function (a,b,ea,eb,div=1) {
#error.prod(a,b,ea,eb,div=[1][-1])
#ea,eb error absoluto respectivos
# div: 1 producto (a*b) -1 division (a/b)
#valor vector ( {[a*b][a/b]} Eabs Emin Emax)
if ((div!=1)&(div!=(-1))) stop("Parámetro div debe ser 1 o -1");
if ((div==(-1))&(b==0)) stop("Indeterminada!!!, denominador debe ser !=0");
Erel<-sqrt((ea/a)^2+(eb/b)^2);
res<-a*b^(div);
return(matrix(c(res,Eabs<-Erel*res,res-Eabs,res+Eabs),ncol=4))
}

Superficies<-function(vect,RMS){
# vect: matriz de 2 vectores de n elementos conteniendo las coordenadas X e Y de los vértices, sin repetitiendo el primer y último vértice
n<-(dim(vect))[1]
S<-0
Se<-0
P<-0
exis<-vect[,1]
yes<-vect[,2]
medX<-mean(exis)
medY<-mean(yes)
for (i in 2:n) {Se<-Se+(4*(exis[i]-exis[i-1])^2+((yes[i]-medY)+(yes[i-1]-medY))^2)}
for (i in 2:n) {S<-S+(0.5*((yes[i]-medY)+(yes[i-1]-medY))*(exis[i]-exis[i-1]))}
for (i in 2:n) {P<-P+sqrt((yes[i]-yes[i-1])^2+(exis[i]-exis[i-1])^2)}
Ep<-2*sqrt((n-1)*RMS)
Es<-sqrt(2)*RMS*sqrt(Se)/2
S<-abs(S)
return(list(Sup=S,ErrorSup=Es,NroVertices=n-1,Perim=P,ErrorPer=Ep))
}

#definición de un polígono de ejemplo
vect1<-t(matrix(c(2453533,6565046,2453525,6565032,2453514,6565034,2453485,6565045,
2453452,6565071,2453407,6565098,2453382,6565124,2453374,6565139,2453395,6565165,2453403,
6565170,2453421,6565213,2453414,6565257,2453428,6565275,2453438,6565268,2453438,6565244,
2453442,6565209,2453431,6565183,2453437,6565168,2453444,6565164,2453470,6565176,2453474,
6565180,2453533,6565046),nrow=2))
#Aplicacion de la funcion definida "Superficies"
eje1<-Superficies(vect1,15)
#acceso a los resultados
eje1
#calculo con los resultados
#error relativo en superficie
eje1$ErrorSup/eje1$Sup
#error relativo de perímetro
eje1$ErrorPer/eje1$Perim
###

Búsqueda personalizada