Manual Cap1 36 Pags
Manual Cap1 36 Pags
de apoyo
Curso de Dasometría
Por:
Alvaro J. Duque M.
Profesor Asociado
Departamento de Ciencias Forestales
Universidad Nacional de Colombia Sede Medellín
2021
Presentación
Esta manual de apoyo para el curso de Dasometría (código 3000447) que se dicta en el quinto
semestre de Ingeniería Forestal, tiene como principal objetivo proveer independencia en el
desarrollo de las actividades de los estudiantes. En el ejercicio docente y profesional actual, la
disponibilidad de herramientas muy versátiles como los computadores y programas
altamente eficientes, han potenciado un rápido avance en las áreas del conocimiento
asociadas con la medición forestal en lo que respecta al manejo de información y
procesamiento de datos. Es en éstos dos temas en particular que este manual de apoyo busca
prestar asistencia. Por este motivo, es importante aclarar que no se busca elaborar un nuevo
libro de texto con contenidos teóricos exahustivos, los cuales abundan en cantidad y calidad
en los mercados de libros especializados.
El manual busca principalmente introducir y orientar los análisis y métodos básicos de los
temas que se presentan en el curso. Para ello, se hace uso del software R. Por este motivo, es
preferible haber visto el curso previo de “Introducción a la Modelación Forestal”, que aún no
aparece como pre-requisito de este curso, pero que esta en camino de serlo. Tener bases de R
ayudará ostensiblemente a un más rápido acople con los temas concernientes a la medición
forestal. Sin embargo, es importante aclarar de nuevo que este NO ES UN CURSO DE R, sino
más bien un curso que usa R para poderlo implementar. Las principales razones para el uso
de este software son: i) es libre; ii) abre y promueve posibilidades de análisis de gran ayuda al
estudiante para otros cursos; iii) algunos de los análisis que aquí se posibilitan son difíciles de
encontrar en los paquetes comerciales de menú.
En conclusión, con este manual lo que se espera sembrar una semilla de un material didáctico
que vaya evolucionando y creciendo de la misma manera que lo ha venido haciendo el curso.
La intención final no es más que avanzar en las posibilidades de que el estudiante tenga tanta
autonomía como sea necesaria para que se potencie su capacidad de auto-aprendizaje. Es
evidente que en el mundo actual, el papel del docente debe cumplir cada vez más una función
de guía que de referente absoluto, lo cual implica la generación de nuevas dinámicas de
comunicación que se espera se faciliten por medio de este tipo de materiales de ayuda.
Esperamos por tanto que el manual que aquí se presenta, ayude a llenar vacíos en lo que se
refiere a las destrezas básicas requeridas en el oficio de la medición y cuantificación en los
bosques, pero además esperamos estimular el proceso de auto-aprendizaje que debe
continuar a lo largo de la vida.
2
Capítulo I: Introducción al R.
En este capítulo sólo se dan algunos apuntes iniciales claves para poder empezar a familiarizarse
con el programa. Todas las notas son tomadas del libro de Crawley (2007).
1.1 Instalación de R.
Para instalar R se debe ingresar a la página [Link] y seguir las instrucciones que
allí se dan. En la web abundan manuales que instruyen acerca de la instalación del programa en
caso de algún problema siguiendo las instrucciones de la página oficial de R. El programa se puede
instalar en cualquier sistema operativo (Windows, Mc Os, Linux), pero debe tenerse presente con
las especificaciones del equipo (Hardware) en lo que respecta a las últimas versiones.
Se recomienda usar un manejador de R. El programa R studio, disponible en
[Link] es el que se empleará para los ejercicios del curso. Este es también de
libre acceso y existe para todas las plataformas.
2.1 Leyendo un archivo en R.
Lo primero y más importante para leer un archivo es poner a R a leer el archivo en el folder en el
cual se tiene. La función set working directory,(wd) me permite hacer esto, así:
setwd(“Desktop”)
En R studio, se puede automáticamente ejecutar este comando, yendo a la pestaña Session, donde se
encuentra Set Working Directory. ES EL PRIMER PASO ESCENCIAL PARA PODER INICIAR MI
TRABAJO CON DATOS EN R.
Los dos formatos más usados para leer un archivo en R son el formato texto (.txt) y el formato de
valores separados por comas (.csv). Se van a introducir los dos, pero se recomienda más el uso del
formato .csv.
En los ejercicios de clase, todos los archivos originales provienen usualmente de Excel. En Excel, los
archivos se deben guardar como Texto delimitado por tabulaciones (.txt) o Valores separados por
comas (.csv). Este último formato varía para Windows y para McOs, así que se debe chequear cual
se usa. En el primero usualmente separa por comas y en el segundo por punto y coma.
Para evitar problemas de lectura del archivo, se recomienda:
• No usar tildes, paréntesis, signos matemáticos (incluido el guión de separación que en R el
programa lo lee como menos), porcentajes, etc, ni en los nombres de las variables ni en los
contenidos de los campos.
• En las variables numéricas (DAP, H, etc) no incluir NINGÚN espacio, símbolo o carácter en
las casillas para las que no existen datos (simplemente dejarlas vacías). Es diferente no
tener dato a que el dato sea igual a cero.
• Tener presente que para R las mayúsculas y las minúsculas SON DIFERENTES.
• Para evitar la aparición de columnas o filas ¨fantasma¨, se recomienda seleccionar y copiar
todo el archivo que tiene datos en Excel, pegarlo en una hoja nueva como valores y grabarlo
como txt o csv.
R es un lenguaje que trabaja sobre el concepto de “objetos”. Esto facilita mucho las operaciones que
rigen el ambiente de trabajo.
Por ejemplo, para crear un objeto (en este caso un vector) yo puedo proceder de la siguiente forma:
x <- c(3,5,9,12)
El operador estándar de asignación en R es <-. También se puede usar = pero no es recomendable
ya que este puede no operar en algunos casos especiales. Aquí le estamos asignando el vector a x
construido por medio de la función concatenar (c).
Los elementos individuales de un vector los podemos obtener por medio de [ ]. Esto se conoce como
el índice o subscript. Por ejemplo, para obtener el tercer elemento de x:
x[3] <- 9
Podemos luego por ejemplo pensar en crear un nuevo vector que se compone y basa en el objeto x;
por ejemplo:
q = c(x,x,9,17)
Podemos además obtener estadísticos de estos objetos, como por ejemplo:
# Calculemos la media y desviación estándar
>mean(x)
[1] 7.25
> sd(x)
[1] 4.031129
Los comentarios de texto se hacen usando el signo #. Cualquier texto o número que se localiza a la
derecha del símbolo no será analizado como comando de R.
2.1.1. Leyendo un archivo con datos en R
El archivo que vamos a usar como referencia para el componente de estructura horizontal y
estimación de altura de los árboles (H), emplea datos colectados en el Departamento de Antioquia.
En el ejemplo, usamos un archivo que posee datos de 4 localidades.
Para traer un archivo, que en R lo llamaremos datos, el cual se llama estruct_2020.txt el comando a
emplear es:
datos <- [Link]("estruct_2020.txt", head = TRUE, sep = “\t”)
En el comando anterior se puede leer lo siguiente:
A datos asígnele estruct_2020.txt, el cual tiene un encabezado en la primera fila y es un archivo
separado por tabulaciones.
Dado que algunos archivos poseen separación de decimales por comas y no puntos, al comando
anterior se le debe agregar dentro del paréntesis: , dec = “,”.
Cuando el archivo es estruct_2020.csv (que usualmente proviene de Excel), el cual ha sido grabado
como “comma separated values” (csv) para Windows, es cuando se usa el csv2 para leerlo, como
sigue:
datos <- read.csv2(“estruct_2020.csv”)
Verificar que el archivo no esta separado por punto y coma. Si es así, se debe adicionar el comando
separado por (sep = “;”). Adicionalmente, si usted ha dejado ñ, tildés, o algún símbolo/vocablo
no propio del inglés y si del español, debe adicionar el comando encoding = ”latin1” (o
“latin8”). El ejemplo en este caso también muestra los comandos necesarios cuando los
decimales están delimitados por comas y no puntos, que es lo que asume el programa:
.
datos <- read.csv2(“estruct_2020.csv”, sep= “;”,dec = “,”, encoding =
“latin1”)
El csv2 esta asociado con los formatos del sistema operativo de Windows y por eso se usa csv2 en
esos casos. Cuando requerimos dar las especificaciones de que archivo tipo .csv se esta leyendo, no
es necesario siempre su uso (el de csv2). Aquí estamos diciendo que los decimales están
delimitados por comas y no puntos, que es lo que asume el paquete, y las variables separadas por
punto y coma y no coma.
A partir de acá, usted ya asoció su archivo en Excel a este OBJETO denominado datos en R. Por
favor, entienda que el nombre estruct_2020.csv ya no existe en R. Existe datos.
Para ver las primeras 5 filas del archivo
head(datos)
Distancia_m: distancia en metros a la que se tomó cada uno de los ángulos para medir la altura total
del árbol.
V_menos_grados: ángulo en grados (°) desde el punto del observador a la base del árbol.
V_mas_grados: ángulo en grados (°) desde el punto del observador al ápice del árbol.
tbosque: tipo de bosque. Se refiere a bosques en tierras bajas (< 1700 m snm) o tierras altas
(> 1700 m snm)
Para ver las primeras 20 (9, 12, 22, 31, etc) filas del archivo, pongo al número de filas que quiero
ver a la derecha.
head(datos, 20)
Para ver las primeras 6 filas y las 3 primeras columnas del archivo
datos[1:6,1:3]
X Localidad Parcela
1 1547 Angelopolis 1
2 1548 Angelopolis 1
3 1549 Angelopolis 1
4 1550 Angelopolis 1
5 1551 Angelopolis 1
6 1552 Angelopolis 1
Este es el primer uso de lo que llamamos subíndices, los cuales son EXTREMADAMENTE útiles en el
manejo de datos en R. Dentro de los CORCHETES, lo que hay detrás de la coma se refiere a las filas
del documento, lo que hay después de la coma, a las columnas.
Por ejemplo, para leer las primeras 10 filas o columnas
datos[1:10,]
datos[,1:10]
Para ver las últimas 5 filas del archivo (similar a head)
tail(datos)
Hay ciertos comandos que son de USO GENERAL en R y tienen aplicación para manejar archivos. El
primero de ellos es str , el cual permite ver la estructura del archivo. Este es un comando muy
importante. Nos permite diferenciar cual es la naturaleza de cada vector, lo cual es esencial para el
análisis de datos. Los tipos de vectores de mayor uso en nuestro curso que debemos identificar en
R, son; numérico (num); entero (int), que también es una categoría de numérico; factor (Factor),
que se refiere a una variable no numérica pero que opera como una unidad; carácter (chr), que se
refiere al que esta conformada por una “sarta” de letras o símbolos independientes concatenados
entre sí. Por ejemplo:
str(datos)
[1] 2988 8
Quiere decir que el archivo que estamos usando tiene 2988 filas y 8 columnas (o variables).
Otro comando de MUCHA UTILIDAD es el comando summary, el cual nos permite hacer un resumen
de lo que contienen los archivos.
summary(datos)
Función subset
Es una forma alternativa y en ocasiones más eficiente de substraer datos de un archivo. Por
ejemplo, veamos como obtener los datos de sólo 2 de las localidades:
levels(datos$Localidad)
La definición del [Link], se puede asociar con el de una hoja de cálculo de Excel: es un
archivo que contiene filas y columnas de la misma o diferente naturaleza. En R, [Link]
es diferente de matrix.
Respuesta: uso el signo $. Algunas de las posibles formas son:
datos$ABasal<-(pi/4)*datos$DAP_cm^2
datos$ABasal.2<-with(datos, (pi/4)*DAP_cm ^2)
10
Figura 1. Esquematización de los significados de sesgo y exactitud o precisión. a) Resultado preciso
e insesgado. b) Resultado de alta precisión pero insesgado. c) Resultado de alta imprecisión, pero
insesgado. d) Resultado impreciso e insesgado (Tomado de West 2009).
2.2 Introducción a las variables aleatorias
Aunque ya mencionamos la existencia de variables continuas y discretas, no establecimos que estas
pueden a su vez ser definidas como variables aleatorias. Una variable aleatoria puede definirse
como una cantidad que puede tomar diferentes valores y que están determinados por un proceso
estocástico. Las variables aleatorias pueden ser descritas por una distribución de probabilidad. La
11
distribución de probabilidad de una variable aleatoria es una función que asigna a cada valor
posible de dicha variable aleatoria una probabilidad. Por ejemplo, al DAP de un árbol en un rodal es
una variable aleatoria, que puede ser definida como X. Si nosotros vamos a ese rodal y observamos
que el DAP de ese árbol es x, hemos obtenido la observación X = x. De esta manera podemos pensar
que el DAP de un árbol es un número fijo, cuya variación emerge de la selección aleatoria de ese
árbol, que hace parte de una población finita de árboles dentro del rodal. Se puede también por
ejemplo pensar que, el DAP de el árbol i (Xi), es una variable aleatoria. En este caso,
asumimos que el proceso subyacente que genera el DAP del árbol i, y el diámetro esperado
de este árbol (Xi), es el resultado de este proceso aleatorio (Mehtätalo 2013). Es decir, hay
varias formas bajo las cuales podemos definir que el valor obtenido de una medición
específica es una cantidad que se asocia con una variable aleatoria.
2.2.1 Distribución de una variable aleatoria
[Link] Distribución univariada
La probabilidad de una variable de obtener un valor específico es descrita por la distribución de
una variable aleatoria. La distribución de una variable aleatoria se determina por la función de
distribución acumulada (FDA) de dicha variable, la cual expresa la probabilidad de que una variable
aleatoria X obtenga un valor menor o igual que x. Lo anterior se expresa como:
F(x) = P(X ≤ x) para todo x
Quizás la función de distribución de probabilidad (FDP) mejor conocida es la distribución normal
estándar. Desafortunadamente, la FDA de la normal es compleja en su forma explícita. No obstante,
su evaluación numérica usando R es bastante simple (Fig. 2).
x<-seq(-8,8,0.01)
y<-pnorm(x)
plot(x,y,type="l",xlab="x",ylab="Densidad acumulada", las=1)
12
𝑝𝑖 = 1
!!!
xi P[X=xi]=pi
x 1 p 1
x 2 P 2
x 3 P 3
13
… …
Para el caso continuo, la FDA y FMP se expresa como:
!
𝑃 𝑋 ≤ 𝑥 = 𝐹 𝑥 = !∝ 𝑓 𝑡 𝑑𝑡 ecuación (2)
Lo que quiere decir que la función densidad de probabilidad (FDP) de una variable aleatoria continua x se
define como la primer derivada de F(x).
𝑑
𝑓 𝑥 = 𝐹(𝑥)
𝑑𝑥
Una importante distinción entre la FDP y la FMP, es que el valor de la FMP para x da la probabilidad para la
variable aleatoria X de obtener el valor x. Con la distribución continua, la probabilidad de cualquier valor es 0.
Por ejemplo, la probabilidad de tener un árbol con un DAP que sea exactamente 20 cm es siempre cero. Sin
embargo, se tiene una probabilidad positiva de obtener un árbol con DAP entre 19.95 y 20.05 cm, la cual
puede ser clasificada como 20 cm usando un calibrador con 1 mm de precisión. Para calcular esta
probabilidad se requeriría integrar la FDP usando intervalos de clase de 1 mm. Lo anterior conduce en la
práctica al uso de la ecuación (1).
Por ejemplo, definamos una variable X (DAP) con distribución normal que posea media 65 y desviación
estándar 15. La probabilidad P (X ≤ 83), se calcula como (Fig. 3A):
x1<-seq(10,120,0.01)
sum(dnorm(60:83,65,15)) #0.5213485
sum(fx1)
14
FDA FMP
1.0
0.025
0.8
0.020
Densidad acumulada
0.6
0.015
f(x)
0.4 0.010
0.2 0.005
0.0 0.000
x x
Figura 3. Función de probabilidad acumulada (FDA) y función de distribución de probabilidad
(FDP) de la distribución de DAP (x) cuando sigue una normal con media 65 y desviación estándar
15. El área en verde define P[60 ≤ X ≤ 83] y el área en rojo P[60 ≤ f(x) ≤ 83] .
Note que la función de distribución cuando proviene de una variable discreta tiene saltos con relación a los
valores posibles de la variable aleatoria (Fig. 4), siendo constante a lo largo de su valor. En contraste, la
distribución de una función de distribución de una variable aleatoria continua es continua (Fig. 4).
FDA FPM
0.30
1.0
0.8
0.25
0.6
0.20
F(y)
f(y)
0.4
0.15
0.2
0.10
0.0
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6
y y
Figura 4. Función de probabilidad acumulada (FDA) y función masa de probabilidad (FPM) del
número de especies encontrado en 6 parcelas.
La FDA de variable aleatoria continua, de hecho, no necesariamente necesita ser diferenciable
15
desde su versión continua y puede en cambio ser definida por partes. Este cálculo asociado con una
distribución de tamaños que es definida por el tamaño o diámetro que corresponden con un valor
pre-definido de la FDA se conoce como percentil. Por ejemplo:
quantile(x1, probs=c(seq(0,1,0.25)))
16
Note que bajo esta distribución, si esa es la tendencia que siguen los DAP en el bosque, la
probabilidad de tener árboles entre 60 y 83 cm es mucho menor que bajo la normal (Fig. 5).
La FDP se da por:
1.0 0.025
0.8 0.020
Densidad acumulada
0.6 0.015
f(x)
0.4 0.010
0.2 0.005
0.0 0.000
17
Description
Density, distribution function, quantile function and random generation
for the normal distribution with mean equal to mean and standard
deviation equal to sd.
Usage
dnorm(x, mean = 0, sd = 1, log = FALSE)
pnorm(q, mean = 0, sd = 1, [Link] = TRUE, log.p = FALSE)
qnorm(p, mean = 0, sd = 1, [Link] = TRUE, log.p = FALSE)
rnorm(n, mean = 0, sd = 1)
Arguments
x, q vector of quantiles.
p vector of probabilities.
n number of observations. If length(n) > 1, the length is taken
to be the number required.
mean vector of means.
sd vector of standard deviations.
log, log.p logical; if TRUE, probabilities p are given as log(p).
[Link] logical; if TRUE (default), probabilities are P[X ≤ x],
otherwise, P[X > x].
Details
If mean or sd are not specified they assume the default values of 0and 1,
respectively.
The normal distribution has density
Value
dnorm gives the density, pnorm gives the distribution function, qnorm
gives the quantile function, and rnorm generates random deviates.
The length of the result is determined by n for rnorm, and is the maximum
of the lengths of the numerical arguments for the other functions.
The numerical arguments other than n are recycled to the length of the
result. Only the first elements of the logical arguments are used.
For sd = 0 this gives the limit as sd decreases to 0, a point mass
at mu. sd < 0 is an error and returns NaN.
18
19
Donde: ABp: área basal de la parcela en m2 ha-1. Note que si se desea convertir el área de la parcela
en m2, sólo se debe reemplazar 1 ha = 10000 m2.
Altura tocón: altura del remanente de tronco que queda enraizado después del apeo
Altura de fuste (Hf): esta definición puede ser bastante variable según dependa el tipo de estudio.
En algunos casos se asocia con la primera rama de la copa, en otros se define según los
requerimientos comerciales (asociada con un diámetro mínimo). La altura de los árboles se dan
normalmente en metros (m).
Altura total (H): distancia vertical desde el suelo donde enraíza el fuste hasta el último o más alto de
los ápices que componen el árbol.
Diámetro de copa (DC): se refiere al área transversal de la proyección de los extremos de la copa.
Usualmente se da en metros. Se puede calcular como:
𝑑!! + 𝑑!!
𝐷𝐶 =
2
De donde, área de copa (m2) queda como:
𝜋 𝜋 𝑑!! + 𝑑!! ! 𝜋 𝜋
𝐴𝐶 = 𝐷𝐶 ! = × = × 𝑑!! + 𝑑!! ! = × 𝑑!! ! + 2𝑑!! 𝑑!! + 𝑑!! !
4 4 2 16 16
Diámetro cuadrático medio (Dq): es una medida de ocupación del rodal que se define por el
diámetro asociado con al árbol de AB promedio. Se define por
!
1
𝐷𝑞 = 𝐷𝐴𝑃! !
𝑛
!!!
2.2.1 Histogramas y tablas de frecuencia
Los histogramas de frecuencia nos permiten analizar las estructuras de tamaño en un bosque. Como
una primera generalización, podemos decir que estructuras de tipo unimodal representan rodales o
bosques coetáneos (individuos con edad similar), mientras que estructuras de J-invertida
representan rodales o bosques disetáneos (de edades disimiles) (Fig. 4). No obstante, la
distribución de tamaños puede seguir muchas formas, la cual en muchos de los casos se pueden a su
vez representar por modelos estadísticos teóricos, como por ejemplo Weibull, log-normal,
exponencial negativa, etc. Este análisis se desarrollará en una sección aparte dado que no hace
parte en este momento del curso (se dicta actualmente dentro del curso de Modelación).
20
Unimodal J-invertida
Bosque
coetáneo
Frecuencia
Bosque
disetáneo
Figura 6. Esquema de las dos estructuras generales de representación de la distribución de
tamaños en rodales o bosques naturales y/o plantados.
Cualquier variable dasométrica que pueda ser cuantificada a escala de rodal, localidad, región, etc,
puede ser analizada en distribuciones de frecuencia.
La forma más simple es usar la función histograma (hist)sobre un vector. Por ejemplo, si en el
archivo datos tenemos una variable que se llame DAP_cm, podemos visualizar su distribución de
frecuencias.
hist(datos$DAP_cm, las =1, col="red", border="black", angle=45,
right=T, density=30, freq=TRUE, main="DAP (cm)")
Puedo incluir líneas conectoras si lo deseo para visualizar el patrón de cambio continuo de las
frecuencias discretas.
lines(hh$mids, hh$counts, lty=2)
Figura 7: histograma producido automáticamente por la función hist.
21
Por defecto, se supone que la primera opción que usa R para definir el número de clases se hace por
lo que se denomina la regla de Sturges, definida por:
𝑐 = 1 + 3.322 ∗ 𝐿𝑜𝑔10(𝑁),
Donde N = la cantidad de datos; c = número de clases (es común redondearlo al entero más
cercano).
Ahora, si queremos definir 10 clases, usamos dentro de la función hist, el comando breaks, así:
hist(datos$ DAP_cm, breaks=10)
Figura 8: histograma producido definiendo 10 intervalos.
Sin embargo, el uso del comando breaks en R dentro de la función hist, cuando se le propone un
número dado de clases, se considera como “una sugerencia” que el programa no siempre asume.
Por ejemplo, si evaluamos lo que obtenemos en la línea de comandos usada arriba y cambiamos 10
por 6,7,8,9 ó 11, vamos a ver que obtenemos el mismo gráfico y los mismos valores. Por eso, lo que
para nuestro curso en primera instancia se recomienda, es hacer uso de la descripción de los
intervalos de clase usando un vector. Para hacerlo, podemos proceder de la siguiente forma:
range(datos$DAP_cm)
[1] 10.03 88.49
str(h1)
List of 6
$ breaks : num [1:17] 10 15 20 25 30 35 40 45 50 55 ...
$ counts : int [1:16] 1484 733 356 184 97 48 38 18 14 8 ...
$ density : num [1:16] 0.09933 0.04906 0.02383 0.01232 0.00649
$ mids : num [1:16] 12.5 17.5 22.5 27.5 32.5 37.5 42.5 47.5..
$ xname : chr "datos$DAP_cm"
$ equidist: logi TRUE
- attr(*, "class")= chr "histogram"
22
Sin embargo, note que esta grafica no posee las marcas de clase, así que podemos usar otra función
para introducirlas y editar nuestro histograma.
Figura 9: histograma generado usando la función barplot.
Favor haga el mismo ejercicio generando clases equidistantes de 2 cm cada una, usando la
función seq.
Lo primero que debo definir es las marcas de clase asociadas con cada uno de estos
intervalos. En R, las funciones asumen que el límite inferior del intervalo es cerrado en cada
clase y abierto (o que no incluye) el límite superior dentro de ésta. Por supuesto, esto es
modificable dentro de la función con los comandos [Link] = FALSE, right = TRUE,
solamente cuando se usa un vector para definir las clases dentro del comando breaks.
23
24
Los limites de los intervalos asociados con estas marcas de clase son:
[Link]=signif(seq(10, 90, [Link]), 4)
[1] 10.00 16.15 22.31 28.46 34.62 40.77 46.92 53.08 59.23 65.38 71.54 77.69 83.85 90.00
length([Link])
[1] 14
Para poder definir las frecuencias vamos a usar la función cut y table:
Primero, si quiero definir un número de clases equidistantes entre los valores del rango, uso la
función cut de forma similar a como se uso la función hist con breaks
fr=cut(datos$DAP_cm, breaks=13)
length(fr)
[1] 2988
fr
[1] (9.95,16.1] (16.1,22.1] (16.1,22.1] (9.95,16.1]…..
fr2=table(fr)
(9.95,16.1] (16.1,22.1] (22.1,28.1] (28.1,34.2] (34.2,40.2] (40.2,46.2] (46.2,52.3]
1699 707 286 143 69 43 20
(52.3,58.3] (58.3,64.3] (64.3,70.4] (70.4,76.4] (76.4,82.5] (82.5,88.6]
11 3 4 1 1 1
names(fr2)
1] "(9.95,16.1]" "(16.1,22.1]" "(22.1,28.1]" "(28.1,34.2]" "(34.2,40.2]"……
Dependiendo de la gráfica, lo ideal sería tener, por ejemplo, las marcas de clase diamétricas como
encabezado. Le incluyo estos valores como encabezado al vector fr2, haciendo lo siguiente:
names(fr2)= [Link](signif([Link], digits=4))
13.08 19.23 25.38 31.54 37.69 43.85 50 56.15 62.31 68.46 74.62 80.77 86.92
1699 707 286 143 69 43 20 11 3 4 1 1 1
Luego, para ver los histogramas, uso la función barplot:
barplot(fr2, las=2, xlab= "DAP (cm)", ylab="Número de individuos",
col="red", border="black", space=0.2, ylim=c(0,2000))
lines([Link](fr2), lty=2)
El comando las define la forma como se posicionan los valores en los ejes (las = 1,2 ó 3)
25
Figura 10. Usando barplot y aplicando la ley de Sturges para definir los intervalos de clase.
Con la función cut, se pueden definir los intervalos de clase de la forma en que yo lo desee. Repita
por ejemplo todo lo hecho con relación a la creación del histograma generando intervalos de clase
entre 0,5,10, 20, 30, 40, >60. El comando base para hacerlo es:
fr.1=cut(datos$DAP_cm, breaks=c(0,5,10, 20, 30, 40, 60))
Vamos ahora a usar funciones que nos permiten sacar datos síntesis por parcela
2.2.2. Función tapply
La función tapply le aplica a un vector numérico, una función sobre una variable “tipo factor”. Es
decir, por ejemplo al vector DAP (numeric) le aplico una suma (sum) en cada una de las parcelas
(Parc).
En nuestro caso, vamos a aplicar la función en cada una de los parcelas existentes. Para ello
debemos crear una nueva variable parcela que por ahora denominaremos nombre_parcela uniendo
la localidad y el numero de la parcela en cada localidad. Esto es necesario para tener un indicador o
marcador independiente para cada parcela, ya que en cada localidad hay 25 parcelas de 0.04 ha
numerdas de 1 a 25 cada una. Es decir, si usamos la variable Parcela, todas as que tienen una misma
designación (por ejemplo la parcela 1 en cada localidad), van a aparecer como una misma entidad
en los análisis
datos$nombre_parcela <- [Link](with(datos, paste(Localidad,Parcela)))
Si quisiera sumar todos los diámetros (algo poco útil como métrica) de todos los árboles que hay en
cada una de las parcelas, aplico la función tapply (DAP_ cm, nombre_parcel, sum). Se puede
aplicar cualquier función existente en R o que uno mismo construya.
Cálculos del número de individuos por hectárea.
n_ind <- with(datos, tapply(DAP_cm, nombre_parcela, length))*1/0.04
26
Cálculos de área basal por parcela (m2 ha-1):
n_AB_m2 <- with(datos, tapply((pi/40000)*DAP_cm^2, nombre_parcela, sum))*1/0.04
head(n_AB_m2)
Angelopolis 1 Angelopolis 10 Angelopolis 11 Angelopolis 12 Angelopolis 13
31.16786 7.07081 28.29443 28.28544 18.09890
Diámetro cuadrático (Dq)
n_Dq <- sqrt (with(datos, tapply(DAP_cm^2, nombre_parcela, mean)))
head(n_Dq)
Angelopolis 1 Angelopolis 10 Angelopolis 11 Angelopolis 12 Angelopolis 13
20.17466 14.14436 18.98041 16.80666 16.00147
Note que para el análisis de Dq no se requiere factor de expansión ni conversión, ya que es
simplemente una unidad que representa un promedio.
Analicemos los histogramas provenientes de estas 3 variables (No individuos (ha-1), Área Basal (m2
ha-1) y diámetro cuadrático medio (cm):
Nro individuos Area Basal (m2 ha−1) Dq (cm)
15 25
20
20
15
10
Frecuencia
Frecuencia
Frecuencia
15
10
10
5
5
0 0 0
27
𝐶𝑂𝑉!"
𝜌!" =
𝜎! 𝜎!
donde: 𝐶𝑂𝑉!" : es la covarianza entre X y Y; 𝜎! : es la desviación estándar de X; 𝜎! : es la desviación
estándar de Y.
Analíticamente, el coeficiente de correlación de Pearson se denota como r y se puede calcular sobre
el estadístico muestral:
𝑥! 𝑦! − 𝑛𝑥𝑦 𝑛 𝑥! 𝑦! − 𝑥! 𝑦!
𝑟= =
𝑛 − 1 𝑆! 𝑆! ! ! ! !
𝑛 𝑥! − 𝑥! 𝑛 𝑦! − 𝑦!
El coeficiente r varía entre -1 y 1, siendo los extremos correlaciones negativas y positivas perfectas,
respectivamente. Cuando r = 0 significa ausencia de correlación lineal, pero no necesariamente
ausencia de correlación no-lineal.
En R, usamos la función cor para calcular la correlación. Sin embargo, usando la función [Link]
podemos indagar no sólo acerca de la correlación, si no además, acerca de la significancia de la
misma.
La hipótesis nula (Ho) del coeficiente r es que no existe asociación entre X y Y.
Usando las variables número de individuos y área basal, calculemos la correlación entre ellas:
[Link](n_ind, AB_m2)
Para incluir la línea de tendencia uso la función lm, la cual hace uso de la virgulilla (~) como
indicadora de un modelo lineal.
28
lm(AB_m2~n_ind)
Call:
lm(formula = AB_m2 ~ n_ind)
Coefficients:
(Intercept) n_ind
8.79393 0.01803
Sin embargo, la función pairs me permite ver la correlación entre varias variables. Sin embargo,
debemos primero poner todas las variables en mismo objeto o archivo, usando en este caso la
función [Link]. Un [Link] se puede asemejar a una hoja de cálculo de Excel, ya que es
un archivo que contiene variables o vectores en las columnas y sus valores en las filas. Puede
contener variables de diferente tipo (por ejemplo numéricas, character, etc).
pairs(res.1)
29
Figura 13. Diagramas de dispersión entre más de dos variables.
Esta función puede incluso producir diagramas de dispersión y sus valores al mismo tiempo, si uso
la siguiente función:
[Link] <- function(x, y, digits = 2, prefix = "", [Link], ...)
{
usr <- par("usr"); [Link](par(usr))
par(usr = c(0, 1, 0, 1))
r <- abs(cor(x, y))
txt <- format(c(r, 0.123456789), digits = digits)[1]
txt <- paste0(prefix, txt)
if(missing([Link])) [Link] <- 0.8/strwidth(txt)
text(0.5, 0.5, txt, cex = [Link] * r)
}
pairs(res.1, [Link] = [Link], [Link] = [Link],
gap=0, row1attop=FALSE)
Figura 13. Diagramas de dispersión entre más de dos variables incluyendo el valor de su
correlación.
30
𝑁 − 𝐽 𝑁−𝐽
Total ! N-1 !
𝑌!" − 𝑌 𝑌!" − 𝑌
𝑁 − 1
Una importante definición: una varianza se define como una suma de cuadrados dividido
por sus grados de libertad. De ahí que la distribución de F, usada para definir la
significancia, se defina como el cociente entre cuadrados medios (o varianzas). Para su
evaluación, el mayor valor siempre va en el numerador y el menor en el denominador.
Veamos ahora como aplicarlo en R. Usemos el archivo res.1
Incluimos el vector con el nombre de la parcela en el archivo res.1
res.1$nombre_parcela <- [Link](res.1)
31
Lo anterior lo hacemos para poder incluir la localidad, que es la variable sobre la que identificamos
cada bosque y sobre la cual tenemos REPLICAS que permiten hacer estimaciones de medias y
varianzas. Para incluir la Localidad en res.1 vamos a usar las funciones unique y merge.
loc <- with(datos, unique([Link](Localidad, nombre_parcela)))
$Localidad
32
Todos los casos para los cuales la p adj ≤ 0.05 significa que hay diferencias entre ellas. Para al
caso del número de individuos, lo que aquí podemos ver es Caucasia tiene diferencias significativas
con todas las otras localidades, las cuales no difieren entre sí. Sin embargo, si aproximamos la p
adj. entre Valdivia-Maceo, deberíamos concluir que entre ellas también hay diferencias
significativas. Dado que sabemos que p adj > 0.05, mejor o definimos como no significativa.
La prueba de Tukey, gráficamente se puede ver como:
Figura 14. Representación gráfica de la prueba de Tukey HSD. Los valores que no pasan por
cero, son los que representan localidades con diferencias significativas entre sí.
Se deja como ejercicio hacer los anavas y el análisis de Tukey para las variables área basal y
diámetro cuadrático medio.
La representación del anava y Tukey, se puede hacer como sigue:
windows(w=5, h=9)
par(mfrow=c(3,1))
par(mar=c(6,6,4,4)) # modifica los margenes
with(res.2, plot(Localidad,n_ind, ylab=expression(paste("Nro
individuos"~"("~ha^{-1},")")), las=2))
# incluyendo las diferencias
text(1,900, "a")
text(2,500, "b")
text(3,830, "a")
33
text(4,950, "a")
# ab
with(res.2, plot(Localidad,AB_m2, ylab=expression (paste("Area Basal"~ "(",
m^{2} ~ ha^{-1},")")), las=2))
# incluyendo las diferencias
text(1,26, "a,b")
text(2,25, "a")
text(3,24, "b")
text(4,23, "a,b")
# Dq
with(res.2, plot(Localidad,Dq, ylab="Dq (cm)", las=2))
# incluyendo las diferencias
text(1, 16.5, "a")
text(2, 23.5, "b")
text(3, 20, "b")
text(4, 16.5, "a")
par(mfrow=c(1,1))
1200
Nro individuos ( ha−1)
1000
a
a
800 a
600
b
400
Angelopolis
Caucasia
Maceo
Valdivia
40
Area Basal (m2 ha−1)
30
a,b a b a,b
20
10
Angelopolis
Caucasia
Maceo
Valdivia
30
25
b
Dq (cm)
20 b
a a
15
Angelopolis
Caucasia
Maceo
Valdivia
34
Figura 15. Representación de loa anava y la prueba de Tukey. Letras similares representan
localidades en las que las medias no difieren entre sí, mientras que letras diferentes
representan localidades con diferencias significativas en su respectiva variable.
2.2.5 Notas complementarias
R cada día nos facilita mucho más las cosas con nuevas librerías. Librerías como Tydiverse y doBy
ganan cada vez más terreno en la idea de facilitar estos procesos. Como ilustración, veremos la
simpleza de generar estas tablas usando doBy, para obtener la tabla de área basal
Usando la libreria doBy
library(doBy)
names(datos)
Incluimos área basal
datos$ABasal_cm2 <- with(datos, (pi/4)*DAP_cm^2)
Calculando A BAsal x localidad y parcela
ab_cm2 <- summaryBy(ABasal_cm2~nombre_parcela+Localidad, data=datos,
FUN=sum, [Link] = TRUE)
Estos valores están en cm2 y no han sido extrapolados a ha
ab_cm2$ab_m2_ha <- with (ab_cm2,(ABasal_cm2/10000)*(1/0.04))
Calculando número de individuos por localidad y parcela
N_ind <- summaryBy(DAP_cm~nombre_parcela+Localidad, data=datos,
FUN=length, [Link] = TRUE)
Debemos cambiar el nombre de la variable (aparece DAP_cm) por N_ind
colnames(N_ind) <- c("nombre_parcela", "Localidad", "N_ind")
Estos valores están referenciados a 0.04 ha y no han sido extrapolados a ha
N_ind$N_ind_ha <- with (N_ind,N_ind*(1/0.04))
Calculando el Dq
Debemos incluir una variable DAP2
datos$DAP_cm2 <- datos$DAP_cm^2
Dq <- summaryBy(DAP_cm2~nombre_parcela+Localidad, data=datos,
FUN=mean, [Link] = TRUE)
Debemos cambiar el nombre de la variable (aparece DAP_cm2) y aplicarle sqrt
colnames(Dq) <- c("nombre_parcela", "Localidad", "Dq")
Dq$Dq <- sqrt(Dq[,3])
Confirmando que los valores son los mismos que calculamos antes
plot(Dq[,3], res.2[,5])
Ahora armo un sólo archivo
res.3 <- [Link](N_ind[,-3],ab_cm2[,4] ,Dq[,3])
res.3 <- res.3[,c(2,1,3:5)]
colnames(res.3) <- c("Localidad","nombre_parcela", "N_ind_ha", "AB_m2_ha",
"Dq_cm")
35
head(res.3)
Localidad nombre_parcela N_ind_ha AB_m2_ha Dq_cm
1 Angelopolis Angelopolis 1 975 31.16786 20.17466
2 Angelopolis Angelopolis 10 450 7.07081 14.14436
3 Angelopolis Angelopolis 11 1000 28.29443 18.98041
4 Angelopolis Angelopolis 12 1275 28.28544 16.80666
5 Angelopolis Angelopolis 13 900 18.09890 16.00147
6 Angelopolis Angelopolis 14 875 15.10552 14.82582
36