Primeros pasos con R

Author
Affiliation

Javier Martínez-López

Departamento de Ecología, Universidad de Granada

Published

January 10, 2025

Introducción a R

¿Qué es RStudio?

RStudio es un entorno de desarrollo integrado (IDE) para R y Python.

¿Qué es R?

R es un lenguaje de programación principalmente orientado al análisis estadístico y visualización de información cuantitativa y cualitativa y publicado como software libre.

citation()
To cite R in publications use:

  R Core Team (2024). _R: A Language and Environment for Statistical
  Computing_. R Foundation for Statistical Computing, Vienna, Austria.
  <https://www.R-project.org/>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2024},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it
when using it for data analysis. See also 'citation("pkgname")' for
citing R packages.

Librerías

  • Las funciones se agrupan por paquetes o librerías
  • Las Funciones más habituales se incluyen por defecto en R (base)
  • Las librerías se pueden instalar y cargar fácilmente (install.packages() y library())

Librerías

Por ejemplo ggplot2

install.packages('ggplot2')  # Instala el paquete 'ggplot2'

library(ggplot2)  # Carga el paquete 'ggplot2' para usar sus funciones

library(help=ggplot2)  # Muestra la ayuda disponible para el paquete 'ggplot2'

browseVignettes()

Hay conjuntos de librerías según su temática llamadas Task Views

Fuentes de información

Ayuda

help("aov") ## Ayuda sobre una función específica

help('+') ## Ayuda sobre operadores matemáticos

help.search('linear model') ## Búsqueda de palabras clave

Elementos de R

Variables, constantes y operadores

a <- 3.25  # Asigna el valor 3.25 a la variable 'a'

a = 3.25  # Otra forma de asignar valores

nombre <- 'Pepe'  # Asigna una cadena de texto a la variable: nombre
as.Date('2000-01-01')  # Convierte un texto en un objeto de tipo fecha
[1] "2000-01-01"
as.Date('2000-01-01') + 2  # Suma días a una fecha
[1] "2000-01-03"

Constantes

NULL ## Representa un objeto vacío
NULL
NA ## Representa un valor faltante
[1] NA
NaN ## Representa un valor no numérico (ejemplo: 1/0)
[1] NaN
pi ## Constante matemática predefinida
[1] 3.141593

Operadores

a == 3.25  # Compara si 'a' es igual a 3.25
[1] TRUE
a == 6  # Compara si 'a' es igual a 6
[1] FALSE
nombre != 'Juan'  # Verifica si 'nombre' no es igual a 'Juan'
[1] TRUE
nombre == 'Pepe'  # Verifica si 'nombre' es igual a 'Pepe'
[1] TRUE
a != 2  # Verifica si 'a' no es igual a 2
[1] TRUE
5 < 6  # Verifica si 5 es menor que 6
[1] TRUE
10 >= 5  # Verifica si 10 es mayor o igual a 5
[1] TRUE

Operadores aritméticos

1 + 2  # Suma
[1] 3
1 - 2  # Resta
[1] -1
5 / 3  # División
[1] 1.666667
2 ^ 3  # Potencia
[1] 8
sqrt(10)  # Raíz cuadrada
[1] 3.162278
runif(5, min = 0, max = 100) # Números aleatorios
[1] 46.64904 95.09400 31.31702 44.98306 57.43678

Vectores

a <- NULL # Crea un vector vacío

a <- 1:10 # Crea un vector con valores del 1 al 10

c <- seq(1, 10, by = 0.5) # Crea un vector secuencial con incrementos de 0.5

d <- c(0, 1, 1, 2, 3) # Crea un vector con valores específicos

e <- c('b1', 'b2', 'b3') # Crea un vector de cadenas de texto

f <- rep(5, 6) # Crea un vector repitiendo el número 5 seis veces

d[1] # Obtiene el primer elemento del vector 'd'
[1] 0
d[-1] # Excluye el primer elemento del vector 'd'
[1] 1 1 2 3

Matrices

mat <- matrix(1:12, 3, 4) # Crea una matriz con valores del 1 al 12, dispuestos en 3 filas y 4 columnas

mat
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
matrix(1:12, 3, 4, byrow = TRUE) # La matriz se rellena por filas
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
rbind(1:5, 11:15, 21:25) # Une vectores como filas
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]   11   12   13   14   15
[3,]   21   22   23   24   25
cbind(1:5, 11:15, 21:25) # Une vectores como columnas
     [,1] [,2] [,3]
[1,]    1   11   21
[2,]    2   12   22
[3,]    3   13   23
[4,]    4   14   24
[5,]    5   15   25
mat[1:2, 2:3] # Selecciona valores de las filas 1 y 2, columnas 2 y 3
     [,1] [,2]
[1,]    4    7
[2,]    5    8
mat[, -2] # Excluye la segunda columna de la matriz
     [,1] [,2] [,3]
[1,]    1    7   10
[2,]    2    8   11
[3,]    3    9   12
t(mat) # Transpone la matriz
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12

Data frames

mat <- matrix(1:30, 10) ## Crea una matriz con valores del 1 al 30 en 10 filas

mat
      [,1] [,2] [,3]
 [1,]    1   11   21
 [2,]    2   12   22
 [3,]    3   13   23
 [4,]    4   14   24
 [5,]    5   15   25
 [6,]    6   16   26
 [7,]    7   17   27
 [8,]    8   18   28
 [9,]    9   19   29
[10,]   10   20   30
df_mat <- as.data.frame(mat) ## Convierte la matriz en un 'data.frame'
names(df_mat) # Muestra los nombres de las columnas
[1] "V1" "V2" "V3"
df_mat[2, 1] # Selecciona un elemento específico (fila 2, columna 1)
[1] 2
df_mat$V1 # Selecciona una columna por su nombre
 [1]  1  2  3  4  5  6  7  8  9 10

Gestión del espacio de trabajo

data(cars) # Carga un conjunto de datos de ejemplo

ls() # Lista los objetos en el entorno actual (en RStudio no hace falta)

rm(a) # Borra el objeto 'a'

rm(list = ls()) # Borra todos los objetos del entorno

Importar y manejar mis datos

data(iris) # Carga el conjunto de datos 'iris'

head(iris) # Muestra las primeras filas del conjunto de datos
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
tail(iris) # Muestra las últimas filas del conjunto de datos
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
145          6.7         3.3          5.7         2.5 virginica
146          6.7         3.0          5.2         2.3 virginica
147          6.3         2.5          5.0         1.9 virginica
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica
dim(iris) # Muestra las dimensiones (filas y columnas)
[1] 150   5
names(iris) # Muestra los nombres de las columnas
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
attach(iris) # Hace las columnas de 'iris' accesibles directamente

by(Sepal.Length, Species, summary) # Genera resúmenes por especie
Species: setosa
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  4.300   4.800   5.000   5.006   5.200   5.800 
------------------------------------------------------------ 
Species: versicolor
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  4.900   5.600   5.900   5.936   6.300   7.000 
------------------------------------------------------------ 
Species: virginica
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  4.900   6.225   6.500   6.588   6.900   7.900 
by(Sepal.Length, Species, mean) # Genera la media por especie
Species: setosa
[1] 5.006
------------------------------------------------------------ 
Species: versicolor
[1] 5.936
------------------------------------------------------------ 
Species: virginica
[1] 6.588
head(Sepal.Length) # Muestra las primeras observaciones de una columna
[1] 5.1 4.9 4.7 4.6 5.0 5.4
# detach(iris) # Desvincula el conjunto de datos

Primeros pasos

names(df_mat) # Muestra los nombres de las columnas
[1] "V1" "V2" "V3"
names(df_mat) <- c('B1', 'B2', 'B3') # Renombra las columnas

rownames(df_mat) # Muestra los nombres de las filas
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
rownames(df_mat) <- LETTERS[1:10] # Renombra las filas con letras en mayúscula

head(df_mat) # Muestra las primeras filas del 'data.frame'
  B1 B2 B3
A  1 11 21
B  2 12 22
C  3 13 23
D  4 14 24
E  5 15 25
F  6 16 26

Seleccionar de mis datos

iris[, 1] # Selecciona la primera columna
  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1
 [19] 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0
 [37] 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5
 [55] 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1
 [73] 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5
 [91] 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3
[109] 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2
[127] 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8
[145] 6.7 6.7 6.3 6.5 6.2 5.9
iris[1:6, -1] # Selecciona las primeras 6 filas excluyendo la primera columna
  Sepal.Width Petal.Length Petal.Width Species
1         3.5          1.4         0.2  setosa
2         3.0          1.4         0.2  setosa
3         3.2          1.3         0.2  setosa
4         3.1          1.5         0.2  setosa
5         3.6          1.4         0.2  setosa
6         3.9          1.7         0.4  setosa
iris[1:3, ] # Selecciona las primeras 3 filas
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
iris[-1:-140, ] # Excluye las primeras 140 filas
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
141          6.7         3.1          5.6         2.4 virginica
142          6.9         3.1          5.1         2.3 virginica
143          5.8         2.7          5.1         1.9 virginica
144          6.8         3.2          5.9         2.3 virginica
145          6.7         3.3          5.7         2.5 virginica
146          6.7         3.0          5.2         2.3 virginica
147          6.3         2.5          5.0         1.9 virginica
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica
iris[1:6, c(1, 3)] # Selecciona las columnas 1 y 3 de las primeras 6 filas
  Sepal.Length Petal.Length
1          5.1          1.4
2          4.9          1.4
3          4.7          1.3
4          4.6          1.5
5          5.0          1.4
6          5.4          1.7
iris[1:6, -c(1, 3)] # Excluye las columnas 1 y 3 de las primeras 6 filas
  Sepal.Width Petal.Width Species
1         3.5         0.2  setosa
2         3.0         0.2  setosa
3         3.2         0.2  setosa
4         3.1         0.2  setosa
5         3.6         0.2  setosa
6         3.9         0.4  setosa

Estadísticos descriptivos

table(Species) # Crea una tabla de frecuencia por especie
Species
    setosa versicolor  virginica 
        50         50         50 
summary(iris) # Resumen estadístico del conjunto 'iris'
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
       Species  
 setosa    :50  
 versicolor:50  
 virginica :50  
                
                
                
summary(cars) # Resumen estadístico del conjunto 'cars'
     speed           dist       
 Min.   : 4.0   Min.   :  2.00  
 1st Qu.:12.0   1st Qu.: 26.00  
 Median :15.0   Median : 36.00  
 Mean   :15.4   Mean   : 42.98  
 3rd Qu.:19.0   3rd Qu.: 56.00  
 Max.   :25.0   Max.   :120.00  
sd(iris$Sepal.Length) # Desviación estándar de una variable
[1] 0.8280661

Exportar datos

Exportar un ‘data.frame’ como archivo CSV (valores separados por ‘comas’).

write.table(df_mat, # data.frame
            'df_mat.csv', # nombre del archivo de salida
            sep=';', # Separador de columnas
            dec=',', # Separador decimal
            col.names=TRUE, # Mantener nombres de las columnas
            row.names=FALSE) # No guardar nombres de las filas

Funciones

nombre_función<-function(argumentos){expresión}

di_hola_mundo <- function() {
  print('¡Hola Mundo!') # Imprime un mensaje en la consola
}

di_hola_mundo() # Llama a la función
[1] "¡Hola Mundo!"
a_euros <- function(pesetas) {
  pesetas / 166.386 # Convierte pesetas a euros
}

a_euros(1000) # Convierte 1000 pesetas a euros
[1] 6.010121
a_pesetas <- function(euros) {
  euros * 166.386 # Convierte euros a pesetas
}

a_pesetas(6) # Convierte 6 euros a pesetas
[1] 998.316

¿Cómo se haría la función ‘Área del triángulo’?

area_triangulo <- function(b = 3, h = 5) { # valores por defecto
  b * h / 2 # Calcula el área de un triángulo
}

area_triangulo() # Usa los valores por defecto
[1] 7.5
area_triangulo(b = 4) # Especifica un valor diferente para la base
[1] 10

Gráficos

# Crea un gráfico con un título y etiquetas de ejes

plot(
  x = 1:10,
  y = 1:10,
  xlab = 'eje X',
  ylab = 'eje Y',
  main = 'Título' 
)

# Gráfico con líneas

plot(
  x = 1:10,
  y = 1:10,
  type = 'l',
  xlab = 'eje X',
  ylab = 'eje Y',
  main = 'Título' 
)

# Gráfico con puntos y líneas

plot(
  x = 1:10,
  y = 1:10,
  type = 'o',
  xlab = 'eje X',
  ylab = 'eje Y',
  main = 'Título' 
)

Leyendas (gráficos básicos)

# Crea un gráfico de dispersión coloreado por especie

plot(
  Sepal.Length,
  Petal.Length,
  col = as.factor(Species),
  xlab = 'Long. Sépalo',
  ylab = 'Long. Pétalo' 
)

# Agrega una leyenda al gráfico

legend(7, # Posición en el eje X
       3, # Posición en el eje Y
       col = c(1:3),
       pch = 1, # Símbolo
       legend = unique(Species)) # Valores únicos de la variable Species

Usando ggplot2

library(ggplot2)

ggplot(data=iris,
       aes(x = Petal.Length,
           y = Petal.Width)) +
  geom_point(aes(color=Species))

Histogramas (gráficos básicos)

# Opción A

indice_versicolor <- Species == 'versicolor' # Índice lógico para filtrar por especie

hist(Sepal.Length[indice_versicolor]) # Histograma de longitudes de sépalo para 'versicolor'

# Opción B

sl_versicolor <- subset(Sepal.Length, Species == 'versicolor') # Otra forma de filtrar

hist(sl_versicolor) # Histograma del subconjunto filtrado

Exportación de gráficos (agrupados)

#jpeg('histogramas.jpg')

par(mfrow = c(1, 2)) # Divide la ventana gráfica en una cuadrícula de 1x2

hist(Sepal.Length) # Histograma de todas las longitudes de sépalo

hist(Sepal.Length[indice_versicolor]) # Histograma de longitudes de sépalo para 'versicolor'

#dev.off() # Cierra el dispositivo gráfico (= guarda el fichero)

Histogramas (ggplot2)

ggplot(data = iris,
       aes(x = Sepal.Length)) +
  geom_histogram() +
  labs( x = "Longitud del sépalo",
        y = "Frecuencia",
        title = "Histograma longitud del sépalo") +
  theme_light()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

# ggsave('histograma.png')

Diagramas de cajas (boxplots)

boxplot(Sepal.Length ~ Species) # Diagrama de cajas de longitudes de sépalo por especie

# boxplot usando ggplot2

ggplot(data = iris,
       aes(x = Species,
           y = Sepal.Length,
           fill = Species)) +
  geom_boxplot() +
  labs( x = "Especies",
        y = "Longitud del sépalo",
        title = "Gráfico de cajas y bigotes",
        subtitle = "Longitud del sépalo por especies")

Diagramas de barras y lectura de datos

Important
bar1_data <- read.table('data/bar1_data.csv',
                        sep = ',', # El separador de columnas es la coma
                        header = T) # La primera fila es el encabezado

str(bar1_data) # tipos de datos de las columnas del data.frame
'data.frame':   8 obs. of  3 variables:
 $ Site : chr  "S1" "S2" "S3" "S4" ...
 $ year : int  2000 2000 2000 2000 2000 2000 2000 2000
 $ value: num  0.755 0.43 0.977 0.959 1.414 ...
barplot(bar1_data$value, names.arg = factor(bar1_data$Site)) # Crea un gráfico de barras

# ggplot2

ggplot(bar1_data,
       aes(x = Site,
           y = value)) +
  geom_col()

Tip

Ejercicio adicional: ¿Cómo leemos el archivo iris.csv?

Gráficos de regresión lineal

lm_pl_sl <- lm(Petal.Length ~ Sepal.Length) # Ajusta un modelo lineal

shapiro.test(lm_pl_sl$residuals) # Comprueba la normalidad de los residuos del modelo

    Shapiro-Wilk normality test

data:  lm_pl_sl$residuals
W = 0.99437, p-value = 0.831
hist(lm_pl_sl$residuals) # Comprueba la normalidad de los residuos del modelo

summary(lm_pl_sl) # Resumen del modelo

Call:
lm(formula = Petal.Length ~ Sepal.Length)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.47747 -0.59072 -0.00668  0.60484  2.49512 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -7.10144    0.50666  -14.02   <2e-16 ***
Sepal.Length  1.85843    0.08586   21.65   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.8678 on 148 degrees of freedom
Multiple R-squared:   0.76, Adjusted R-squared:  0.7583 
F-statistic: 468.6 on 1 and 148 DF,  p-value: < 2.2e-16

Gráfico del modelo

# require(ggplot2) # Carga el paquete ggplot2

c <- ggplot(iris,
            aes(y = Petal.Length,
                x = Sepal.Length)) # Define un gráfico base

c + stat_smooth(method = lm,
                colour = "black") +
  geom_point(aes(col = factor(Species))) # Agrega capas al gráfico
`geom_smooth()` using formula = 'y ~ x'

# ggsave('iris_lm.png') # Guardar gráfico

Gráfico de barras agrupadas

Important

Lee el archivo ‘data/bar2_data.csv’ (contiene más años)

bar2_data.csv

bar2_data <- read.table('data/bar2_data.csv',
                        sep = '|',
                        header = T) 

str(bar2_data)
'data.frame':   20 obs. of  3 variables:
 $ Site : chr  "S1" "S2" "S3" "S4" ...
 $ year : int  2000 2000 2000 2000 2000 2000 2000 2000 2001 2001 ...
 $ value: num  0.755 -0.43 0.977 0.959 1.414 ...
ggplot(bar2_data,
       aes(x = Site,
           y = value,
           fill = factor(year)) # Agrupamos por año
       ) +
  geom_col(position = position_dodge(preserve = "single"))

Gráfico de barras en subfiguras

ggplot(bar2_data, aes(x = Site, y = value)) +
  geom_col() +
  facet_wrap( ~ year)

Preparar datos para ggplot2

Important
library(reshape2) # Carga la librería reshape

data<-read.table('data/data.csv',
                 sep = '\t',
                 header = T) # Lee un archivo de datos

head(data) # Muestra las primeras filas del conjunto de datos
  site       var1       var2
1    a  0.7549967  0.4457979
2    b -0.4297789 -0.5818249
3    c  0.9768700  0.1715152
4    d  0.9594651 -0.7068345
5    e  1.4142136  1.0907563
6    f  0.3863983  0.3364102
data_ggplot2 <- melt(data,
                     id = c('site')) 

data_ggplot2 # Muestra los datos transformados
   site variable      value
1     a     var1  0.7549967
2     b     var1 -0.4297789
3     c     var1  0.9768700
4     d     var1  0.9594651
5     e     var1  1.4142136
6     f     var1  0.3863983
7     g     var1  0.3980741
8     a     var2  0.4457979
9     b     var2 -0.5818249
10    c     var2  0.1715152
11    d     var2 -0.7068345
12    e     var2  1.0907563
13    f     var2  0.3364102
14    g     var2  0.4796152
data_orginal<-dcast(data_ggplot2, site ~ variable) # convertir niveles de una variable en columnas

head(data_orginal)
  site       var1       var2
1    a  0.7549967  0.4457979
2    b -0.4297789 -0.5818249
3    c  0.9768700  0.1715152
4    d  0.9594651 -0.7068345
5    e  1.4142136  1.0907563
6    f  0.3863983  0.3364102
help(dcast) # función de agregación (similar a tabla pivotante de Excel)

Test de tendencias de series temporales (Mann-Kendall)

Análisis de la serie de datos 1

Important

Datos: ts.csv

# devtools::install_github("nxskok/mkac")

library(lubridate)

Attaching package: 'lubridate'
The following objects are masked from 'package:base':

    date, intersect, setdiff, union
library(mkac)

# Cargar los datos
data<-read.table('data/ts.csv', sep=',', header = TRUE)

str(data)
'data.frame':   27 obs. of  2 variables:
 $ date : chr  "20/01/2024" "22/01/2024" "25/01/2024" "10/02/2024" ...
 $ value: num  0.1 0.5 0.6 0.3 0.5 0.6 0.4 0.8 0.2 0.7 ...
# Interpretar las fechas
data$date <- as.Date(data$date, format = '%d/%m/%Y')

str(data)
'data.frame':   27 obs. of  2 variables:
 $ date : Date, format: "2024-01-20" "2024-01-22" ...
 $ value: num  0.1 0.5 0.6 0.3 0.5 0.6 0.4 0.8 0.2 0.7 ...
plot(data$date, data$value)

# Extraer mes del año en una nueva columna

data$month <- month(data$date)

head(data)
        date value month
1 2024-01-20   0.1     1
2 2024-01-22   0.5     1
3 2024-01-25   0.6     1
4 2024-02-10   0.3     2
5 2024-02-24   0.5     2
6 2024-03-12   0.6     3
table(data$month)

 1  2  3  4  5  6  7  8  9 10 11 12 
 3  2  3  2  2  2  2  2  2  2  2  3 
# Nueva tabla de datos con medias mensuales

data_monthly_mean <- aggregate(value ~ month, data, mean)

plot(data_monthly_mean$month, data_monthly_mean$value)

kendall_Z_adjusted(data_monthly_mean$value)
$z
[1] 0.8228706

$z_star
[1] 0.8228706

$ratio
[1] 1

$P_value
[1] 0.4105816

$P_value_adj
[1] 0.4105816
theil_sen_slope(y = data_monthly_mean$value, x = data_monthly_mean$month)
[1] 0.01666667
# Alternativa (sin pendiente de Sen):

# library(Kendall)

# MannKendall(data_monthly_mean$value)

Análisis de la serie de datos 2

Important

Datos: ts2.csv

# Cargar los datos
data <- read.table('data/ts2.csv', sep = ',', header = TRUE)

str(data)
'data.frame':   27 obs. of  2 variables:
 $ date : chr  "20/01/2024" "22/01/2024" "25/01/2024" "10/02/2024" ...
 $ value: num  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 ...
# Interpretar las fechas
data$date <- as.Date(data$date, format = '%d/%m/%Y')

str(data)
'data.frame':   27 obs. of  2 variables:
 $ date : Date, format: "2024-01-20" "2024-01-22" ...
 $ value: num  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 ...
plot(data$date, data$value)

# Extraer mes del año en una nueva columna

data$month <- month(data$date)

head(data)
        date value month
1 2024-01-20   0.1     1
2 2024-01-22   0.2     1
3 2024-01-25   0.3     1
4 2024-02-10   0.4     2
5 2024-02-24   0.5     2
6 2024-03-12   0.6     3
# Nueva tabla de datos con medias mensuales

data_monthly_mean <- aggregate(value ~ month, data, mean)

plot(data_monthly_mean$month, data_monthly_mean$value)

kendall_Z_adjusted(data_monthly_mean$value)
$z
[1] 4.525788

$z_star
[1] 4.525788

$ratio
[1] 1

$P_value
[1] 6.017083e-06

$P_value_adj
[1] 6.017083e-06
theil_sen_slope(y = data_monthly_mean$value, x = data_monthly_mean$month)
[1] 0.2083333

Análisis de la serie de datos 2 (la manera tidyverse)

# Cargar las librerías necesarias

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr   1.1.4     ✔ stringr 1.5.1
✔ forcats 1.0.0     ✔ tibble  3.2.1
✔ purrr   1.0.4     ✔ tidyr   1.3.1
✔ readr   2.1.5     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(lubridate)

# Cargar los datos

# data <- read_csv('data/ts2.csv') # Crearía un tibble: https://cran.r-project.org/web/packages/tibble/vignettes/tibble.html

data <- read.table('data/ts2.csv', sep = ',', header = TRUE)

# Inspeccionar la estructura de los datos

glimpse(data)
Rows: 27
Columns: 2
$ date  <chr> "20/01/2024", "22/01/2024", "25/01/2024", "10/02/2024", "24/02/2…
$ value <dbl> 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3,…
# Interpretar las fechas

data <- data %>% 
  mutate(date = dmy(date))

glimpse(data)
Rows: 27
Columns: 2
$ date  <date> 2024-01-20, 2024-01-22, 2024-01-25, 2024-02-10, 2024-02-24, 202…
$ value <dbl> 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3,…
# Graficar la serie temporal

data %>% 
  ggplot(aes(x = date, y = value)) + 
  geom_point() + 
  labs(title = "Serie temporal", x = "Fecha", y = "Valor")

# Extraer mes del año en una nueva columna

data <- data %>% 
  mutate(month = month(date))

head(data)
        date value month
1 2024-01-20   0.1     1
2 2024-01-22   0.2     1
3 2024-01-25   0.3     1
4 2024-02-10   0.4     2
5 2024-02-24   0.5     2
6 2024-03-12   0.6     3
# Nueva tabla de datos con medias mensuales

data_monthly_mean <- data %>% 
  group_by(month) %>% 
  summarise(value = mean(value, na.rm = TRUE))

# Graficar las medias mensuales

data_monthly_mean %>% 
  ggplot(aes(x = month, y = value)) + 
  geom_point() + 
  labs(title = "Media mensual", x = "Mes", y = "Valor promedio")

# Análisis de tendencia con funciones de Kendall y Theil-Sen

kendall_Z_adjusted(data_monthly_mean$value)
$z
[1] 4.525788

$z_star
[1] 4.525788

$ratio
[1] 1

$P_value
[1] 6.017083e-06

$P_value_adj
[1] 6.017083e-06
theil_sen_slope(y = data_monthly_mean$value, x = data_monthly_mean$month)
[1] 0.2083333