---
title: "Práctica 8. Intervalos de Confianza con R"
subtitle: "Intervalos para medias, varianzas y proporciones"
output:
  html_document:
    highlight: pygments
    theme: cerulean
    toc: yes
    toc_float: yes
  pdf_document:
    toc: yes
  word_document:
    toc: yes
---

<style type="text/css">
 .tab{ text-indent: 40px; }
 body{ font-size: 170%; }
 .question{background-color: #ffffcc; font-size: 110%; font-weight: bold;}
 .resalta{background-color: #ffff99; font-size: 110%; }
</style>

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, eval=TRUE, message=FALSE, warning=FALSE)
```


\  

\  

\  

# Objetivos

1. Continuar utilizando las funciones del conjunto de librerías [__tidyverse__](https://www.tidyverse.org/) para la manipulación y análisis de datos, y la librería [__flextable__](https://davidgohel.github.io/flextable/articles/overview.html) para la presentación de resultados.
  
2. Usar la función `str()` para explorar la estructura de un objeto en R.

3. Aprender a acceder a las variables contenidas en `data.frames` y `tibbles`.

4. Conocer el concepto de lista en R, y aprender a acceder a sus componentes.

5. Utilizar `BinomCI` del paquete `DescTools` para calcular intervalos de confianza para proporciones.

6. Utilizar `t.test` para calcular intervalos de confianza para medias.

7. Utilizar `varTest` para calcular intervalos de confianza para varianzas y desviaciones típicas.

8. Conocer la función `do()` para integrar el cálculo de intervalos de confianza en cadenas de comandos de `tidyverse` enlazados por tuberías

9. Aprender a construir tablas resumen con estadísticos e intervalos de confianza para varias variables.

\  

\  

\  

\  


# Preliminares: carga de las librerías que utilizaremos en esta práctica.

```{r}
library(readxl)
library(tidyverse)
library(flextable)
library(janitor)
library(DescTools)
library(broom)
library(EnvStats)
```

\  

\  

\  

\  

# 1. Objetos en R para el almacenamiento de datos y resultados: data.frames, tibbles y listas

\  

Como ya hemos visto en prácticas anteriores, un `data.frame` o un `tibble` son las estructuras que utiliza R normalmente para archivar bases de datos. En ambos casos se trata de estructuras rectangulares en forma de matriz, donde cada fila representa un objeto y cada columna una variable. Las columnas (variables) tienen nombres diferentes, y los tipos de datos pueden ser distintos para cada columna: una columna puede contener datos numéricos, otra contener fechas, una tercera contener caracteres, etc.

\  

## Data.frames

Comenzamos por cargar el archivo de datos que hemos utilizado en las prácticas anteriores, correspondiente a un muestreo de nidos de tortugas en la isla de Boa Vista del archipiélago de Cabo Verde:

```{r}
tortugas <- read.csv2("tortugas.csv", fileEncoding="UTF-8")
```
  
  
<div class="resalta">
__NOTA Codificación de caracteres en un archivo (`fileEncoding`)__: en elcomando anterior hemos utilizado la opción `fileEncoding="UTF-8"` para que R interprete correctamente los caracteres típicos del español: la ñ, las tildes, diéresis, etc. Ello es debido a que el archivo de las tortugas se codificó originalmente en un sistema operativo Linux, que usa esa codificación específica de caracteres; si no se especifica "UTF8" y el archivo se lee en un sistema Windows, los caracteres citados no serán legibles. Si la lectura se hiciera en un Mac no habría problemas, ya que Mac utiliza también codificación UTF8. Si un usuario de un Mac quisiera leer archivos que contienen caracteres codificados en Windows, debería usar la opción `fileEncoding="latin1"`.
</div>

\  

La función `str()` nos da información sobre el tipo de objeto que es `tortugas`, y sobre cuál es su contenido:

```{r}
str(tortugas)
```

Como podemos observar, en la primera linea se nos indica que `tortugas` es un objeto de tipo `data.frame` con 1277 observaciones de 13 variables, cuyos nombres figuran a continuación. Para cada variable se indica su tipo (numérico, factor, entero) y se muestran por defecto sus 10 primeros valores.

Para extraer los valores de una variable concreta de este `data.frame`, por ejemplo los valores de LCC, podríamos usar cualquiera de las siguientes expresiones equivalentes: `tortugas$LCC`, `tortugas[["LCC"]]` o `tortugas[,"LCC"]`, como podemos ver a continuación:

```{r eval=FALSE}
tortugas$LCC
```

```{r echo=FALSE}
tortugas$LCC[1:28]
```

\  

```{r eval=FALSE}
tortugas[["LCC"]]
```

```{r echo=FALSE}
tortugas[["LCC"]][1:28]
```

\  

Ello nos permitiría, por ejemplo, calcular rápidamente la media (o cualquier otro estadístico descriptivo) de esta variable:

```{r}
mean(tortugas$LCC)
```

sin usar las cadenas de tuberías típicas del ámbito del `tidyverse`.

\  

Cuando se usa Rstudio es más cómodo usar la notación del `$`, ya que una vez que escribimos `tortugas$`, Rstudio nos muestra las distintas variables en una caja para que podamos elegir el nombre de la que queremos extraer:

<center>
![](imagenes/ayudaRstudio.png)
</center>

\  

\  

\  

## Tibbles 

De modo alternativo, en lugar de leer el archivo de tortugas con la función `read.csv2()`, podemos leerlo con la función equivalente `read_csv2()` (nótese que hemos sustituido el punto por la barra baja) del paquete `tidyverse`; la sintaxis para especificar la codificación de caracteres del archivo es ligeramente distinta: 

```{r}
tortugas <- read_csv2("tortugas.csv",locale=locale(encoding="UTF-8"))
```

Nuevamente, si analizamos la estructura del objeto `tortugas` mediante la función `str()` obtenemos:

```{r}
str(tortugas)
```

\  

Como vemos, al leer los datos con `read_csv2()` la estructura de los datos es ligeramente distinta; la primera linea del resultado anterior nos indica que `tortugas` es un objeto de varias clases: _Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame'_, con 1277 observaciones y 13 variables. El acrónimo `tbl` se refiere a la palabra `tibble` que suena parecido a `table` (tabla). Los objetos de clase `tibble` pueden ser algo más complejos que los `data.frames`, si bien al nivel que los utilizaremos en este curso, podemos considerar que son iguales: tablas rectangulares de datos.

\  

Las únicas diferencias en la estructura de datos según se lean con `read.csv2()` o con `read_csv2()`, son que todas las variables numéricas son del mismo tipo (no se distinguen variables enteras de no enteras), y las variables tipo carácter no se convierten automáticamente en factores (obsérvese que la variable `playa` al leerla con `read.csv2()` se ha leido como factor, mientras que al leerla con `read_csv2()` se ha leido como carácter). Estas diferencias, en cualquier caso no son relevantes. 

\  

Con los `tibbles` también podemos usar la sintaxis `tortugas$LCC` o tortugas[["LCC"]] para extraer los valores de una variable concreta.

\  

\  

\  

## Listas

Las listas constituyen otro tipo de estructura de datos que utiliza R para guardar información relacionada que no tiene por qué tener necesariamente una estructura rectangular como una tabla. Muchas funciones de R para el análisis estadístico devuelven sus resultados en forma de lista.

Podemos imaginar una lista como un contenedor de objetos de distinta naturaleza. En el ejemplo siguiente definimos una lista que contiene unos datos experimentales medidos en tres sujetos, el nombre del laboratorio que hizo las medidas, la fecha de su realización, y si el resultado para cada sujeto es positivo o negativo:

```{r}
analiticas <- list(datos = data.frame(sujeto1=c(10,12,11.2,9.8),
                                      sujeto2=c(5.4,6.9,7.8,4.6), 
                                      sujeto3=c(8.7,7.5,6.2,0.3)),
                    laboratorio="X Labs SL",
                    fecha="23-08-2019",
                    resultado=c("positivo","negativo","positivo"))
```

Como vemos, dentro de la lista `analíticas` hemos introducido un `data.frame` con datos, dos variables con un único valor (`laboratorio` y `fecha`), y una tercera variable (`resultado`) que es un vector con 3 valores de tipo carácter. Si pedimos a R que nos enseñe en contenido de esta lista nos lo muestra de la forma siguiente:

```{r}
analiticas
```

\  

Y si le pedimos que nos muestre la estructura, R nos indica que `analiticas` es una lista y nos muestra de qué clase en cada uno de los elementos que contiene:

```{r}
str(analiticas)
```

\  

Del mismo modo que ya hemos visto con `data.frames` y `tibbles` podemos extraer una parte de una lista mediante el uso del símbolo `$` o el doble corchete:

```{r}
analiticas$laboratorio
```

```{r}
analiticas[["resultado"]]
```

\  

\   

Es conveniente conocer el concepto de lista en R, así como la manera de acceder a su contenido, ya que R devuelve el resultado de muchos procedimientos de inferencia estadística en forma de lista, en particular los que vamos a utilizar aquí para calcular intervalos de confianza, así como los que utilizaremos más adelante en contrastes de hipótesis y en modelos lineales.

\  

\  

\  

# 2. Intervalo de confianza para una proporción

\  

## Ejercicio 1

<div class=question>

Construir un  intervalo de confianza al 95% para la proporción de nidos afectados por cangrejos.

</div>
  
\  

Para construir un intervalo de confianza para una proporción utilizamos la función `BinomCI` de la librería `DescTools`. Para aplicar esta función necesitamos saber cuántos nidos se revisaron y en cuántos había cangrejos. Para ello podemos usar la función `tabyl` aplicada a la variable `cangrejos`.

Como no todos los nidos de Boa Vista se revisaron para ver si tenían cangrejos, eliminamos en primer lugar todos los valores perdidos de la variable cangrejos (que están codificados como NA) y a continuación aplicamos la función `tabyl`, calculando una fila adicional con los totales:

```{r}
tortugas %>% 
  filter(!is.na(cangrejos)) %>%  
  tabyl(cangrejos) %>% 
  adorn_totals("row")
```

Por tanto, vemos que en total se revisaron 900 nidos de los cuales tenían cangrejos 595; la proporción estimada de nidos con cangrejos es entonces:

$$\hat{p}=\frac{595}{900}=0.6611$$
que corresponde al porcentaje calculado por `tabyl` en la última columna. Ahora, para calcular el intervalo de confianza usamos la función `BinomCI`, que recibe como argumentos el número de nidos con cangrejos, el número total de nidos revisados y el nivel de confianza:

```{r}
BinomCI(595,900,conf.level=0.95)
```


Por tanto, podemos asegurar con un 95% de confianza que de _todos_ los nidos de la isla, entre un 62.95% y un 69.12% están afectados por la presencia de cangrejos.

\  

### Mejora de la presentación del resultado

Si queremos incluir el cálculo del intervalo de confianza en una cadena de comandos enlazados por tuberías para conseguir una mejor presentación final del resultado, podemos empezar por calcular el número de éxitos (número de nidos con cangrejos) y el número total de observaciones que necesita la función `BinomCI`. Téngase en cuenta que como la variable `cangrejos` vale 0 cuando no hay cangrejos y 1 cuando sí hay, la suma de valores de esta variable es igual al número total de nidos que tienen cangrejos.

```{r}
tortugas %>% 
  filter(!is.na(cangrejos)) %>% 
  summarize(nE=sum(cangrejos),n=n())
```

 Obtenemos así solo los valores que necesitamos para `BinomCI()`, con una presentación más simple que la tabla calculada por `tabyl`. Ahora, para poder enlazar `BinomCI()` con este resultado, debemos usar la función `do()`. Esta función permite incluir en una cadena de tuberías el cálculo de cualquier otra función; se deben tener en cuenta las siguientes restricciones:

  * Si la función que se incluye usa variables procedentes de la "tubería" anterior, dichas variables deben ir precedidas por el símbolo "`.$`".
  
  * El resultado de la función debe ser un `data.frame` o un `tibble`. Podemos averiguar de qué clase es el resultado de la función `BinomCI()` mirando su estructura mediante `str()`:
  
```{r}
str(BinomCI(595,900))
```

  Como vemos, el resultado es una matriz numérica de una fila y una columna. Para convertir una matriz `m` en un data.frame utilizamos `data.frame(m)`. Por tanto, podemos obtener el resultado de `BinomCI()` al final de nuestra cadena de tuberías mediante:
  
```{r}
tortugas %>% 
  filter(!is.na(cangrejos)) %>% 
  summarize(nE=sum(cangrejos),n=n()) %>% 
  do(data.frame(BinomCI(.$nE,.$n,conf.level=0.95)))
```

  Por último, podemos mejorar la presentación final creando una función que le dé formato al estimador y al intervalo de confianza (esta función es genérica y la podremos utilizar posteriormente con otros intervalos). __IMPORTANTE: Si se va a utilizar esta función, es preciso incluirla en el documento Rmd antes de llamarla por primera vez__)
  
```{r}
# La función recibe como argumentos, el estimador del parámetro y los límites 
# inferior y superior del intervalo de confianza. Por defecto se redondean los
# valores a 4 dígitos y se considera que el nivel de confianza el 0.95. El valor
# del nivel de confianza se usa solamente para poner nombre a la variable que 
# designa el intervalo, como suele ser habitual en publicaciones científicas
# La función devuelve un data.frame con el estimador y el intervalo formateados
# con el número de dígitos indicado.
formatInterval <- function(est, inf, sup, digits=4, conf.level=0.95){
  CI <- sprintf("(%s, %s)",round(inf,digits),round(sup,digits))
  estimate <- round(est,digits)
  df <- data.frame(estimate,CI, stringsAsFactors = FALSE)
  names(df)[2]=paste("CI",100*conf.level,"%",sep="")
  return(df)
}
```
 
\  
 
Por último integramos todo en un cadena de "tuberías" y generamos la salida con `flextable`:

```{r}
tortugas %>% 
  filter(!is.na(cangrejos)) %>% 
  summarize(nE=sum(cangrejos),n=n()) %>% 
  do(data.frame(BinomCI(.$nE,.$n,conf.level=0.95))) %>% 
  do(formatInterval(.$est,.$lwr.ci,.$upr.ci)) %>% 
  flextable() %>% 
  fontsize(size=14, part="all") %>% 
  autofit() 
```

\  

\  

\ 

## Ejercicio 2

<div class=question>

Construir un  intervalo de confianza al 95% para la proporción de nidos que tienen más de 100 huevos.

</div>

\   

Primero definimos una variable que vale 1 si el nido tiene más de 100 huevos y 0 en caso contrario:

```{r}
tortugas %>% 
  mutate(masDe100=ifelse(Huevos>100,1,0)) %>% 
  tabyl(masDe100) %>% 
  adorn_totals("row")
```

Por tanto, la proporción estimada de nidos con más de 100 huevos es el 8.69%. Calculamos el intervalo de confianza con `BinomCI()`:

```{r}
BinomCI(111, 1277,conf.level=0.95)
```

Por tanto, con un 95% de confianza podemos asegurar que entre un 7.27% y un 10.37% de los nidos de tortuga de Boa Vista tienen más de 100 huevos.

Si queremos el intervalo con mejor presentación:

```{r}
tortugas %>% 
  mutate(masDe100=ifelse(Huevos>100,1,0)) %>% 
  summarize(nE=sum(masDe100),n=n()) %>% 
  do(data.frame(BinomCI(.$nE,.$n,conf.level=0.95))) %>% 
  do(formatInterval(.$est,.$lwr.ci,.$upr.ci)) %>% 
  flextable() %>% 
  fontsize(size=14, part="all") %>% 
  autofit() 
```


\  

\  

\  

## Ejercicio 3

<div class=question>

Construir un  intervalo de confianza al 95% para la proporción de tortugas que pesan más de 70 kg.

</div>
  
\  

Creamos en primer lugar una variable que vale 1 si la tortuga pesa más de 70 kg y 0 en caso contrario:


```{r}
tortugas %>% 
  mutate(masDe70=ifelse(peso>70,1,0)) %>% 
  tabyl(masDe70) %>% 
  adorn_totals("row")
```

Por tanto, la proporción estimada de tortugas que pesan más de 70 kg es el 3.52%. Calculamos el intervalo de confianza con `BinomCI()`:

```{r}
BinomCI(45, 1277,conf.level=0.95)
```

Por tanto, con un 95% de confianza podemos asegurar que entre un 2.64% y un 4.68% de las tortugas que anidan en Boa Vista pesan más de 70 kg.

Si queremos el intervalo con mejor presentación:

```{r}
tortugas %>% 
  mutate(masDe70=ifelse(peso>70,1,0)) %>% 
  summarize(nE=sum(masDe70),n=n()) %>% 
  do(data.frame(BinomCI(.$nE,.$n,conf.level=0.95))) %>% 
  do(formatInterval(.$est,.$lwr.ci,.$upr.ci)) %>% 
  flextable() %>% 
  fontsize(size=14, part="all") %>% 
  autofit() 
```


\  

\  

\  

## Ejercicio 4: Construcción de tabla resumen.

<div class=question>

Construir una tabla resumen con las proporciones e intervalos de confianza calculados en los tres ejercicios anteriores.

</div>  

\  

Podemos construir una tabla resumen repitiendo los cálculos anteriores y "pegando" los resultados obtenidos mediante la función `bind_rows()` (que significa algo así como pegar por filas):

```{r}
ejerc1 <- tortugas %>% 
  filter(!is.na(cangrejos)) %>% 
  summarize(nE=sum(cangrejos),n=n()) %>% 
  do(data.frame(BinomCI(.$nE,.$n,conf.level=0.95))) %>% 
  do(formatInterval(.$est,.$lwr.ci,.$upr.ci))

ejerc2 <- tortugas %>% 
  mutate(masDe100=ifelse(Huevos>100,1,0)) %>% 
  summarize(nE=sum(masDe100),n=n()) %>% 
  do(data.frame(BinomCI(.$nE,.$n,conf.level=0.95))) %>% 
  do(formatInterval(.$est,.$lwr.ci,.$upr.ci))
  
ejerc3 <- tortugas %>% 
  mutate(masDe70=ifelse(peso>70,1,0)) %>% 
  summarize(nE=sum(masDe70),n=n()) %>% 
  do(data.frame(BinomCI(.$nE,.$n,conf.level=0.95))) %>% 
  do(formatInterval(.$est,.$lwr.ci,.$upr.ci))

tabla <- bind_rows(ejerc1,ejerc2,ejerc3)
tabla
```

Ahora añadimos a la tabla una primera columna con los nombres de las variables, para poder identificar a qué corresponde cada proporción, y presentamos el resultado con `flextable`:

```{r}
tabla %>% 
  mutate(variable=c("Nidos con cangrejos","Nidos con más de 100 huevos", 
                "Tortugas de más de 70 kg")) %>% 
  select(variable, estimate, `CI95%`) %>% 
  flextable() %>% 
  fontsize(size=14, part="all") %>% 
  set_caption("Proporciones estimadas e Intervalos de Confianza al 95%") %>% 
  autofit() 
```

\  

También podía haberse construido la tabla de una manera más eficiente utilizando `pivot_longer()` (ver sección 2 en el documento de complementos a las prácticas en http://estadistica-dma.ulpgc.es/estadFCM/complementos-Practicas.html)


```{r}
tortugas %>% 
  mutate(masDe100=ifelse(Huevos>100,1,0),
         masDe70=ifelse(peso>70,1,0)) %>% 
  select(cangrejos,masDe100,masDe70) %>% 
  pivot_longer(1:3,names_to="Variable",values_to = "Valor") %>% 
  group_by(Variable) %>% 
  summarize(nE=sum(Valor,na.rm=TRUE),n=length(which(!is.na(Valor)))) %>% 
  do(data.frame(BinomCI(.$nE,.$n,conf.level=0.95))) %>% 
  do(formatInterval(.$est,.$lwr.ci,.$upr.ci)) %>% 
  mutate(Variable=c("Nidos con cangrejos","Nidos con más de 100 huevos", 
                "Tortugas de más de 70 kg")) %>% 
  select(Variable, estimate, `CI95%`) %>% 
  flextable() %>% 
  fontsize(size=14, part="all") %>% 
  set_caption("Proporciones estimadas e Intervalos de Confianza al 95%") %>% 
  autofit() 
```

\  

\  

\  

\  

# 3. Intervalo de confianza para una media

\  

## Ejercicio 5

<div class=question>

Construir un  intervalo de confianza al 95% para la longitud media del caparazón de las tortugas de Boa Vista.

</div>
  
\  

Para construir un intervalo de confianza para la media utilizamos la función `t.test`:

```{r}
t.test(tortugas$LCC,conf.level = 0.95)
```

Esta salida nos informa de que el valor medio de la variable `LCC` observado en la muestra ha sido de 81.91457 cm, y por tanto este es el valor que estimamos para la media de la población; el intervalo de confianza al 95% es (81.66133, 82.16780), lo que nos indica que podemos estar seguros en un 95% de que el valor medio de `LCC` en la población de tortugas que anida en Boa Vista está comprendido entre 81.66 y 82.17 cm.

\  

## Mejora de la presentación del resultado

Como vemos, esta función devuelve más cosas aparte del intervalo de confianza; ello es así porque la misma función nos sirve también para realizar contrastes de hipótesis sobre la media (lo veremos en el siguiente capítulo). Podemos analizar la estructura del objeto que devuelve `t.test` mediante la función `str()`:

```{r}
str(t.test(tortugas$LCC,conf.level = 0.95))
```

Así pues, el resultado de `t.test` es una lista, en la que podemos ver que hay una componente (`estimate`) en el que se muestra el valor medio de la variable LCC (81.9 cm) y otra componente (`conf.int`) que contiene el intervalo de confianza. Podemos extraer estas componentes sencillamente mediante.

```{r}
ttLCC <- t.test(tortugas$LCC,conf.level = 0.95)
ttLCC$estimate
ttLCC$conf.int
```

\  

No obstante, para poder utilizar estos valores dentro de una cadena de tuberías de `tidyverse` lo más cómodo es convertir la lista producida por t.test en un `data.frame`. La función `tidy` de la librería `broom` se encarga precisamente de esta tarea:

```{r}
library(broom)
tortugas %>% 
  do(tidy(t.test(.$LCC,conf.level=0.95)))
```

Como solo nos interesan la media y el intervalo de confianza, podemos usar nuestra función `formatInterval` (téngase en cuenta que el nombre que pone `tidy` a los extremos del intervalo de confianza son, como puede verse en la salida anterior, `conf.low` y `conf.high`):

```{r}
tortugas %>% 
  do(tidy(t.test(.$LCC,conf.level=0.95))) %>% 
  do(formatInterval(.$estimate, .$conf.low, .$conf.high)) %>% 
  flextable() %>% 
  fontsize(size=14, part="all") %>% 
  autofit() 
```

\  

\  

\  

## Ejercicio 6

<div class=question>

Construir intervalos de confianza al 99% para los valores medios de:

- ACC: Anchura curva del caparazón.

- profNido: profundidad del nido.

- distancia: distancia desde el nido hasta la orilla.

- Huevos: número de huevos en cada nido

</div>
  
\  

Para resolver este problema podemos ir variable a variable:

* ACC

```{r}
ttACC <- t.test(tortugas$ACC, conf.level=0.99)
ttACC$estimate
ttACC$conf.int
```

\  

* Profundidad del nido

```{r}
ttProf <- t.test(tortugas$profNido, conf.level=0.99)
ttProf$estimate
ttProf$conf.int
```

\  

* Distancia a la orilla

```{r}
ttDist <- t.test(tortugas$distancia, conf.level=0.99)
ttDist$estimate
ttDist$conf.int
```

\ 

* Número de huevos de la puesta

```{r}
ttHuevos <- t.test(tortugas$Huevos, conf.level=0.99)
ttHuevos$estimate
ttHuevos$conf.int
```

\  

### Tabla con todas las medias e intervalos de confianza

Podemos usar las herramientas del `tidyverse` en combinación con `t.test` para sacar todos los resultados en una única tabla:

```{r}
tortugas %>% 
  select(LCC, ACC, profNido, distancia, Huevos) %>% 
  pivot_longer(1:5,names_to="Variable",values_to = "Valor") %>% 
  group_by(Variable) %>% 
  do(tidy(t.test(.$Valor, conf.level=0.99))) %>% 
  do(formatInterval(.$estimate,.$conf.low,.$conf.high,digits=2,conf.level = 0.99)) %>% 
  flextable() %>% 
  fontsize(size=14, part="all") %>% 
  set_caption("Medias estimadas e Intervalos de Confianza al 99%") %>% 
  autofit() 
```

\  

\  

\  

## Ejercicio 7. Tabla de intervalos para cada año.

<div class=question>

Construir los intervalos de confianza del ejercicio anterior para cada año.

</div>

\  

Para construir un intervalo de confianza para cada año bastará simplemente con añadir `Año` en el `group_by()`. Para ello debemos incluir `Año` en la lista de variables que seleccionamos inicialmente:

```{r}
tortugas %>% 
  select(LCC, ACC, profNido, distancia, Huevos,Año) %>% 
  pivot_longer(1:5,names_to="Variable",values_to = "Valor") %>% 
  group_by(Año,Variable) %>% 
  do(tidy(t.test(.$Valor, conf.level=0.99))) %>% 
  do(formatInterval(.$estimate,.$conf.low,.$conf.high,digits=2,conf.level = 0.99)) %>% 
  flextable() %>% 
  fontsize(size=14, part="all") %>% 
  set_caption("Medias estimadas e Intervalos de Confianza al 99%") %>% 
  autofit() 
```

\  

Podemos mejorar un poco la presentación de esta tabla si añadimos unas lineas horizontales entre los datos de los distintos años; esto se consigue con la función `hline` del paquete `officer`. Si además queremos evitar que se repita varias veces el valor de `Año` en la tabla, usamos `merge_v()` también del paquete `officer` como se muestra a continuación:

```{r}
library(officer)
tortugas %>% 
  select(LCC, ACC, profNido, distancia, Huevos,Año) %>% 
  pivot_longer(1:5,names_to="Variable",values_to = "Valor") %>% 
  group_by(Año,Variable) %>% 
  do(tidy(t.test(.$Valor, conf.level=0.99))) %>% 
  do(formatInterval(.$estimate,.$conf.low,.$conf.high,digits=2,conf.level = 0.99)) %>% 
  flextable() %>% 
  fontsize(size=14, part="all") %>% 
  set_caption("Medias estimadas e Intervalos de Confianza al 99%") %>% 
  hline(i = seq(5,25,by=5), part = "body",
        border = fp_border(color = "grey70", width = 2) ) %>% 
  merge_v(j = ~Año) %>% 
  fix_border_issues() %>% 
  autofit() 
```

\  

Nótese que para colocar las lineas hemos utilizado la función `seq(5,25,by=5)` que selecciona los números del 5 al 25 de 5 en 5 (es decir, selecciona los números 5, 10, 15, 20 y 25), que son las posiciones donde queremos colocar las lineas separadoras horizontales.

\  

\  

# 4. Intervalo de confianza para una desviación típica

\  

## Ejercicio 8

<div class=question>

Construir un  intervalo de confianza al 95% para la desviación típica de la longitud del caparazón de las tortugas de Boa Vista.

</div>


El procedimiento es muy similar al del cálculo del intervalo de confianza para la media, con la única diferencia de que ahora deberemos usar la función `varTest()` de la librería `EnvStats`:

```{r}
library(EnvStats)
varTest(tortugas$LCC, conf.level=0.95)
```

Téngase en cuenta que esta librería proporciona el estimador de la varianza y su intervalo de confianza; el estimador de la desviación típica y su intervalo de confianza pueden obtenerse simplemente hallando la raiz cuadrada:

- Desviación típica:

```{r}
vtLCC <- varTest(tortugas$LCC, conf.level=0.95)
sqrt(vtLCC$estimate)
``` 

(aunque en realidad nos muestra la desviación típica, R sigue escribiendo _variance_ porque ese es el nombre que tenía originalmente el valor de `vtLCC$estimate`, y la función raiz cuadrada `sqrt()` no altera ese nombre). Para eliminar el nombre podemos utilizar `as.numeric()`:

```{r}
as.numeric(sqrt(vtLCC$estimate))
```


- Intervalo de confianza al 95%:

```{r}
sqrt(vtLCC$conf.int)
```

\  

Como en el caso del t.test podemos tener una mejor presentación usando las herramientas del `tidyverse`:

```{r}
tortugas %>% 
  do(tidy(varTest(.$LCC,conf.level=0.95)))
```

Nótese que los nombres para los extremos del intervalo son ahora `conf.low.LCL` y `conf.high.UCL`. Extraemos la varianza y los extremos del intervalo, hacemos su raiz cuadrada y pasamos los valores a `formatInterval` y `flextable`:

```{r}
tortugas %>% 
  do(tidy(varTest(.$LCC,conf.level=0.95))) %>% 
  do(formatInterval(sqrt(.$estimate), sqrt(.$conf.low.LCL), sqrt(.$conf.high.UCL))) %>% 
  flextable() %>% 
  fontsize(size=14, part="all") %>% 
  autofit() 
```

\  

\  

\  

## Ejercicio 9

<div class=question>

Construir intervalos de confianza al 99% para las desviaciones típicas de las variables:

- ACC: Anchura curva del caparazón.

- profNido: profundidad del nido.

- distancia: distancia desde el nido hasta la orilla.

- Huevos: número de huevos en cada nido

</div>
  
\  

Para resolver este problema podemos ir variable a variable:

```{r}
vtACC <- varTest(tortugas$ACC, conf.level=0.95)
as.numeric(sqrt(vtACC$estimate))
sqrt(vtACC$conf.int)
```

\  

o mejor, construir una tabla:

```{r}
tortugas %>% 
  select(LCC, ACC, profNido, distancia, Huevos) %>% 
  pivot_longer(1:5,names_to="Variable",values_to = "Valor") %>% 
  group_by(Variable) %>% 
  do(tidy(varTest(.$Valor, conf.level=0.99))) %>% 
  do(formatInterval(sqrt(.$estimate),sqrt(.$conf.low.LCL),sqrt(.$conf.high.UCL),
                    digits=2,conf.level = 0.99)) %>% 
  flextable() %>% 
  fontsize(size=14, part="all") %>% 
  set_caption("Desviaciones típicas estimadas e Intervalos de Confianza al 99%") %>% 
  autofit() 
```

\  

\  

\  

\  

