Tarea: Análisis de Datos y Evaluación de Modelos

Aquí tienes una tabla de contenido con una breve explicación para cada paso de la tarea:


Tabla de Contenido

  1. Importar paquetes
    • En esta sección, importaremos los paquetes necesarios para realizar el análisis de datos y modelización.
  2. Cargar dataset
    • En este paso, cargaremos el dataset que utilizaremos para el análisis y modelización.
  3. Normalidad
    • Utilizaremos pruebas como shapiro.test() o ks.test() para evaluar la normalidad de las variables en el dataset.
  4. Análisis de correlación
    • Utilizaremos la función chart.Correlation() del paquete PerformanceAnalytics para realizar un análisis completo de correlación entre las variables del dataset.
  5. Regresiones lineales
    • En esta sección, ajustaremos modelos de regresión lineal simple para comprender las relaciones lineales entre variables.
  6. Pruebas de autocorrelación
    • Utilizaremos la función dwtest() del paquete lmtest para realizar pruebas de autocorrelación en los residuos de los modelos de regresión.
  7. Regresiones no lineales
    • Exploraremos modelos de regresión no lineal utilizando la función nls() en R y la función curve_fit() del paquete scipy en Python.
  8. Regresión Lineal Múltiple manual
    • Realizaremos un análisis de regresión lineal múltiple manualmente utilizando la función lm() en R.
  9. Regresión Lineal Múltiple con eliminación hacia atrás
    • Utilizaremos la función stepAIC() del paquete MASS para realizar la selección automática de variables en modelos de regresión lineal múltiple.
  10. Conclusiones
    • En esta sección, presentaremos las conclusiones obtenidas a partir del análisis y modelización realizados en el dataset.

Esta tabla de contenido proporciona una guía estructurada para la tarea, detallando cada paso y la acción a realizar en cada sección.

Integrantes:

Objetivo:

Aplicar técnicas de análisis de datos, pruebas de correlación, regresiones y visualización para evaluar la relación entre variables en el dataset [Nombre del Dataset].

1. Importar Paquetes

options(warn = -1)

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── 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(PerformanceAnalytics)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## 
## ######################### Warning from 'xts' package ##########################
## #                                                                             #
## # The dplyr lag() function breaks how base R's lag() function is supposed to  #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
## # source() into this session won't work correctly.                            #
## #                                                                             #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
## # dplyr from breaking base R's lag() function.                                #
## #                                                                             #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
## #                                                                             #
## ###############################################################################
## 
## Attaching package: 'xts'
## 
## The following objects are masked from 'package:dplyr':
## 
##     first, last
## 
## 
## Attaching package: 'PerformanceAnalytics'
## 
## The following object is masked from 'package:graphics':
## 
##     legend
library(lmtest)

2. Cargar Dataset del paquete Soils:

Soil Composiciones de características físicas y químicas. Variables:

  1. pH: pH del suelo
  2. N: Nitrógeno total en %
  3. Dens: densidad aparente en g/cm\(^3\)
  4. P: Fósforo total en ppm
  5. Ca: Calcio en me/100 gm.
  6. Mg: Magnesio en me/100 gm.
  7. k: Fósforo en me/100 gm.
  8. Na: Sodio en me/100 gm.
  9. Conduc: Conductividad (Variable dependiente)

Mostrar el dataset Boston y su estructura mediante la función str()

La función str() en R se utiliza para mostrar la estructura interna de un objeto de datos de una manera compacta y legible. Esta función es muy útil para obtener una visión rápida del tipo de datos, la dimensión y el contenido de un objeto, especialmente cuando se trabaja con estructuras de datos complejas como data frames, listas y matrices.

library(carData)
str(Soils)
## 'data.frame':    48 obs. of  14 variables:
##  $ Group  : Factor w/ 12 levels "1","2","3","4",..: 1 1 1 1 2 2 2 2 3 3 ...
##  $ Contour: Factor w/ 3 levels "Depression","Slope",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ Depth  : Factor w/ 4 levels "0-10","10-30",..: 1 1 1 1 2 2 2 2 3 3 ...
##  $ Gp     : Factor w/ 12 levels "D0","D1","D3",..: 9 9 9 9 10 10 10 10 11 11 ...
##  $ Block  : Factor w/ 4 levels "1","2","3","4": 1 2 3 4 1 2 3 4 1 2 ...
##  $ pH     : num  5.4 5.65 5.14 5.14 5.14 5.1 4.7 4.46 4.37 4.39 ...
##  $ N      : num  0.188 0.165 0.26 0.169 0.164 0.094 0.1 0.112 0.112 0.058 ...
##  $ Dens   : num  0.92 1.04 0.95 1.1 1.12 1.22 1.52 1.47 1.07 1.54 ...
##  $ P      : int  215 208 300 248 174 129 117 170 121 115 ...
##  $ Ca     : num  16.4 12.2 13 11.9 14.2 ...
##  $ Mg     : num  7.65 5.15 5.68 7.88 8.12 ...
##  $ K      : num  0.72 0.71 0.68 1.09 0.7 0.81 0.39 0.7 0.74 0.77 ...
##  $ Na     : num  1.14 0.94 0.6 1.01 2.17 2.67 3.32 3.76 5.74 5.85 ...
##  $ Conduc : num  1.09 1.35 1.41 1.64 1.85 3.18 4.16 5.14 5.73 6.45 ...
Soils[ ,c("pH", "N", "Dens", "P", "Ca", "Mg", "K", "Na", "Conduc")]

Secuencia de Análisis:

3. Normalidad:

Usar “Test de Shapiro-Wilk”, cuando la muestra es pequeña (generalmente menos de 50 observaciones). El “Test de Kolmogorov-Smirnov”, es más adecuado para muestras grandes (generalmente más de 50 observaciones).

# Espacio para el código de verificación de normalidad con shapiro.test porque hay 48 obs 

shapiro.test(Soils$pH)
## 
##  Shapiro-Wilk normality test
## 
## data:  Soils$pH
## W = 0.93978, p-value = 0.01591
shapiro.test(Soils$N)
## 
##  Shapiro-Wilk normality test
## 
## data:  Soils$N
## W = 0.85596, p-value = 3.141e-05
shapiro.test(Soils$Dens)
## 
##  Shapiro-Wilk normality test
## 
## data:  Soils$Dens
## W = 0.90927, p-value = 0.00127
shapiro.test(Soils$P)
## 
##  Shapiro-Wilk normality test
## 
## data:  Soils$P
## W = 0.84121, p-value = 1.281e-05
shapiro.test(Soils$Ca)
## 
##  Shapiro-Wilk normality test
## 
## data:  Soils$Ca
## W = 0.91748, p-value = 0.002425
shapiro.test(Soils$Mg)
## 
##  Shapiro-Wilk normality test
## 
## data:  Soils$Mg
## W = 0.97575, p-value = 0.4162
shapiro.test(Soils$K)
## 
##  Shapiro-Wilk normality test
## 
## data:  Soils$K
## W = 0.95276, p-value = 0.05157
shapiro.test(Soils$Na)
## 
##  Shapiro-Wilk normality test
## 
## data:  Soils$Na
## W = 0.92795, p-value = 0.005736
shapiro.test(Soils$Conduc)
## 
##  Shapiro-Wilk normality test
## 
## data:  Soils$Conduc
## W = 0.92367, p-value = 0.004016

4. Análisis de Correlación:

Si hay normalidad, usar las pruebas de correlación con el test de pearson, si falla la normalidad usar el test de spearman. Utilice la función chart.Correlation() del paquete PerformanceAnalytics. El siguiente es un ejemplo de cómo usar la función con el test de spearman: chart.Correlation(Boston, method = "spearman"). Si no se especifica el method, la prueba es de pearson y supone normalidad.

Puede utilizar visualizaciones y pruebas para pares de variables utilizando la función with().

Por ejemplo para ver el histograma de medv en Boston, use: with(Boston, hist(medv)). Por ejemplo, para hacer un test de correlación de spearman entre lstat y medv, use: with(Boston, cor.test(lstat,medv, method = "spearman")).

# Espacio para el código de pruebas de correlación (Pearson, Spearman o Kendall)

# Configurar la supresión de warnings
options(warn=-1)
library(PerformanceAnalytics)

chart.Correlation(mtcars)

chart.Correlation(
  R = Soils[ ,c("pH", "N", "Dens", "P", "Ca", "Mg", "K", "Na", "Conduc")],
  histogram = TRUE,
  method = "spearman"
)

5. Regresiones Lineales:

Realice regresiones lineales simples y luego verifique la autocorrelación de los residuos con el test de Durbin-Watson, con la función dwtest() del paquete lmtest.

Estadístico Durbin-Watson – Es una medida de la correlación serial en los residuos. Si los residuos varían aleatoriamente, éste valor puede ser cercano a 2. Un pequeño P-Value indica una tendencia no aleatoria en los residuos. Para unos datos que corren sobre el tiempo, un pequeño P-value podría indicar que alguna tendencia en el tiempo no ha sido tomada en cuenta. Para datos registrados en el tiempo, un valor-P pequeño podría indicar que alguna tendencia en el tiempo no ha sido explicada. (Statgraphics).

Si falla la No Autocorrelación, proceda a realizar regresión no lineal con la función nls() y decida cual modelo no lineal que considere de acuerdo a la visualización de R.

Funciones no Lineales mas Comunes

Regresión Lineal con lm().

# Espacio para el código de regresiones lineales y prueba de autocorrelación
modelo1 = lm(Conduc ~ pH, data = Soils)
summary(modelo1)
## 
## Call:
## lm(formula = Conduc ~ pH, data = Soils)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.7996 -2.0071  0.0146  1.1520 10.5926 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  27.7835     2.6590  10.449 9.89e-14 ***
## pH           -4.5391     0.5638  -8.051 2.48e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.597 on 46 degrees of freedom
## Multiple R-squared:  0.5849, Adjusted R-squared:  0.5759 
## F-statistic: 64.83 on 1 and 46 DF,  p-value: 2.484e-10
plot(Soils$pH, Soils$Conduc)
abline(modelo1)

visualizacion en ggplot() y method=“lm”

library(ggplot2)
ggplot(
  data = Soils,
  mapping = aes(x=pH, y=Conduc)
) +
  geom_point() +
  geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

Visualización con ggplot() sin method (hara el method loess)

library(ggplot2)
ggplot(
  data = Soils,
  mapping = aes(x=pH, y=Conduc)
) +
  geom_point() +
  geom_smooth()
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

6. Pruebas de autocorrelación:

Estadístico Durbin-Watson El estadístico de Durbin-Watson es una prueba utilizada en análisis de regresión para detectar la presencia de autocorrelación en los residuos (errores) de un modelo de regresión. La autocorrelación ocurre cuando los residuos no son independientes entre sí, lo que puede invalidar los resultados del análisis de regresión. Este problema es particularmente importante en series temporales, donde los valores pasados pueden influir en los valores presentes.

library(lmtest)
dwtest(modelo1)
## 
##  Durbin-Watson test
## 
## data:  modelo1
## DW = 1.6962, p-value = 0.1284
## alternative hypothesis: true autocorrelation is greater than 0

7. Regresiones no lineales

Regres no Lineal con nls()

modelo2 <- nls(Conduc ~ a * exp(b*pH), data = Soils, start = list(a = 0.1, b = 0.1))
summary(modelo2)
## 
## Formula: Conduc ~ a * exp(b * pH)
## 
## Parameters:
##   Estimate Std. Error t value Pr(>|t|)    
## a 361.9726   163.4251   2.215   0.0318 *  
## b  -0.8919     0.1083  -8.236 1.33e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.228 on 46 degrees of freedom
## 
## Number of iterations to convergence: 14 
## Achieved convergence tolerance: 2.645e-07
conduc_estimado <- predict(modelo2)
library(ggplot2)
ggplot(
  data = Soils,
  mapping = aes(x = pH, y = Conduc)
) +
  geom_point() +
  geom_line(aes(x = pH, y = conduc_estimado))

Grabar el archivo de Boston

library(carData)
write.csv(x = Soils[ ,c("pH", "N", "Dens", "P", "Ca", "Mg", "K", "Na", "Conduc")], file = "Soils.csv" )

Regresión no lineal con Python

La función curve_fit() se utiliza para ajustar una función modelo a datos experimentales, lo que implica encontrar los parámetros óptimos de la función que minimizan la diferencia entre los datos reales y los valores predichos por el modelo. Esto es especialmente útil en regresiones no lineales, donde la relación entre las variables no puede expresarse de manera lineal.

Pueden consultar el notebook: Regresión no Lineal.ipynb.

Inserte a continuación un fragmento de código de Python y espere que Posit Cloud reacciones para instalar los requerimientos. A continuación se transcribe el código de Python del documento RMarkdown “2_Regresión Lineal y no Lineal”:

El código en Python es el siguiente:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

import os
os.getcwd()
## '/cloud/project'
Soils = pd.read_csv("/cloud/project/Soils.csv")
Soils.info()
## <class 'pandas.core.frame.DataFrame'>
## RangeIndex: 48 entries, 0 to 47
## Data columns (total 10 columns):
##  #   Column      Non-Null Count  Dtype  
## ---  ------      --------------  -----  
##  0   Unnamed: 0  48 non-null     int64  
##  1   pH          48 non-null     float64
##  2   N           48 non-null     float64
##  3   Dens        48 non-null     float64
##  4   P           48 non-null     int64  
##  5   Ca          48 non-null     float64
##  6   Mg          48 non-null     float64
##  7   K           48 non-null     float64
##  8   Na          48 non-null     float64
##  9   Conduc      48 non-null     float64
## dtypes: float64(8), int64(2)
## memory usage: 3.9 KB
Soils["pH"]
## 0     5.40
## 1     5.65
## 2     5.14
## 3     5.14
## 4     5.14
## 5     5.10
## 6     4.70
## 7     4.46
## 8     4.37
## 9     4.39
## 10    4.17
## 11    3.89
## 12    3.88
## 13    4.07
## 14    3.88
## 15    3.74
## 16    5.11
## 17    5.46
## 18    5.61
## 19    5.85
## 20    4.57
## 21    5.11
## 22    4.78
## 23    6.67
## 24    3.96
## 25    4.00
## 26    4.12
## 27    4.99
## 28    3.80
## 29    3.96
## 30    3.93
## 31    4.02
## 32    5.24
## 33    5.20
## 34    5.30
## 35    5.67
## 36    4.46
## 37    4.91
## 38    4.79
## 39    5.36
## 40    3.94
## 41    4.52
## 42    4.35
## 43    4.64
## 44    3.82
## 45    4.24
## 46    4.22
## 47    4.41
## Name: pH, dtype: float64
Soils["Conduc"]
## 0      1.09
## 1      1.35
## 2      1.41
## 3      1.64
## 4      1.85
## 5      3.18
## 6      4.16
## 7      5.14
## 8      5.73
## 9      6.45
## 10     8.37
## 11     9.21
## 12    10.64
## 13    10.07
## 14    11.26
## 15    12.15
## 16     2.61
## 17     1.98
## 18     0.76
## 19     2.85
## 20     3.24
## 21     4.63
## 22     3.67
## 23     8.10
## 24     7.72
## 25     9.78
## 26     9.07
## 27     9.13
## 28    11.57
## 29    11.42
## 30    13.32
## 31    11.57
## 32     0.75
## 33     2.20
## 34     2.27
## 35     0.67
## 36     5.08
## 37     6.37
## 38     6.82
## 39     3.65
## 40    10.14
## 41     9.74
## 42     8.60
## 43     9.09
## 44    12.26
## 45    11.29
## 46     9.51
## 47    12.69
## Name: Conduc, dtype: float64
def f(x, a, b):
    return a*np.exp(b*(x))

x = Soils["pH"]
y = Soils["Conduc"]

res,cov = curve_fit(f,x,y)
# res son los coeficientes a y b
print(res)
## [361.97224929  -0.89186607]
print(cov)
## [[ 2.67079552e+04 -1.76132008e+01]
##  [-1.76132008e+01  1.17251988e-02]]

# xx = np.linspace(8,40,50)
# fig,axes=plt.subplots()
# axes.scatter(x,y)
#  
# axes.plot(xx,f(xx,361.97224929 ,-0.89186607))

Visualización:

Utilice ggplot() del paquete ggplot2, de acuerdo al capítulo 1: 1 Data visualization

library(ggplot2)

ggplot(
  data = Soils,
  mapping = aes(x = pH, y = Conduc)
) +
  geom_point(colours = "pink") +
  geom_point(colours = "green")

8. Regresión Lineal Múltiple:

La Regresión Lineal Múltiple es una técnica estadística utilizada para modelar la relación entre una variable de respuesta (también llamada variable dependiente) y dos o más variables predictoras (variables independientes). A diferencia de la Regresión Lineal Simple, que utiliza una sola variable predictora, la Regresión Lineal Múltiple permite analizar cómo múltiples variables predictoras afectan a la variable de respuesta.

9. Regresión Lineal Múltiple Manual

# Espacio para el código de Regresión Lineal Múltiple Manual
library(carData)
# soils[ ,c("pH", "N", "Dens", "P", "Ca", "Mg", "K", "Na", "Conduc")]
modelo3 <- lm(Conduc ~ ., data = Soils)
summary(modelo3)
## 
## Call:
## lm(formula = Conduc ~ ., data = Soils)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.0004 -0.3860 -0.1270  0.4805  1.1533 
## 
## Coefficients: (16 not defined because of singularities)
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -0.937448   5.109850  -0.183 0.855918    
## Group2       -0.566160   0.825549  -0.686 0.499151    
## Group3       -0.178957   1.495097  -0.120 0.905681    
## Group4        0.063132   2.092702   0.030 0.976173    
## Group5       -1.293044   0.743858  -1.738 0.094463 .  
## Group6       -1.689756   1.138854  -1.484 0.150379    
## Group7       -1.081373   1.700453  -0.636 0.530599    
## Group8        0.083798   2.255813   0.037 0.970662    
## Group9       -1.546316   1.020850  -1.515 0.142382    
## Group10      -1.268538   1.318951  -0.962 0.345372    
## Group11      -0.956371   1.730757  -0.553 0.585463    
## Group12      -0.620811   2.075001  -0.299 0.767271    
## ContourSlope        NA         NA      NA       NA    
## ContourTop          NA         NA      NA       NA    
## Depth10-30          NA         NA      NA       NA    
## Depth30-60          NA         NA      NA       NA    
## Depth60-90          NA         NA      NA       NA    
## GpD1                NA         NA      NA       NA    
## GpD3                NA         NA      NA       NA    
## GpD6                NA         NA      NA       NA    
## GpS0                NA         NA      NA       NA    
## GpS1                NA         NA      NA       NA    
## GpS3                NA         NA      NA       NA    
## GpS6                NA         NA      NA       NA    
## GpT0                NA         NA      NA       NA    
## GpT1                NA         NA      NA       NA    
## GpT3                NA         NA      NA       NA    
## GpT6                NA         NA      NA       NA    
## Block2        0.324189   0.564951   0.574 0.571206    
## Block3        0.222710   0.455701   0.489 0.629299    
## Block4       -0.131563   0.467075  -0.282 0.780512    
## pH           -0.110490   0.583834  -0.189 0.851425    
## N             5.857552   7.400659   0.791 0.436103    
## Dens          2.386586   1.538606   1.551 0.133437    
## P             0.004592   0.005870   0.782 0.441368    
## Ca           -0.087850   0.151341  -0.580 0.566789    
## Mg            0.132303   0.255326   0.518 0.608893    
## K            -3.008232   1.462669  -2.057 0.050296 .  
## Na            0.925095   0.220075   4.204 0.000293 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7865 on 25 degrees of freedom
## Multiple R-squared:  0.9793, Adjusted R-squared:  0.9611 
## F-statistic: 53.77 on 22 and 25 DF,  p-value: 6.321e-16
modelo4 <- lm(pH ~ .,data = Soils[,c ("pH", "N", "Dens", "P", "Ca", "Mg", "K", "Na", "Conduc")])
summary(modelo4)
## 
## Call:
## lm(formula = pH ~ ., data = Soils[, c("pH", "N", "Dens", "P", 
##     "Ca", "Mg", "K", "Na", "Conduc")])
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.54083 -0.22400 -0.06742  0.21067  1.13795 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.494501   1.063223   3.287 0.002150 ** 
## N           -2.253772   2.324808  -0.969 0.338298    
## Dens         0.718301   0.525992   1.366 0.179886    
## P            0.001638   0.001366   1.199 0.237827    
## Ca           0.156587   0.039002   4.015 0.000262 ***
## Mg          -0.060945   0.049129  -1.241 0.222199    
## K           -0.403777   0.393937  -1.025 0.311688    
## Na           0.181815   0.082528   2.203 0.033564 *  
## Conduc      -0.210055   0.073907  -2.842 0.007093 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3641 on 39 degrees of freedom
## Multiple R-squared:  0.7563, Adjusted R-squared:  0.7063 
## F-statistic: 15.13 on 8 and 39 DF,  p-value: 8.288e-10

Selección Automática de Variables con step()

# Espacio para el código de Selección Automática de Variables con stepAIC()
library(carData)
mejor_modelo <- step(modelo4)
## Start:  AIC=-88.96
## pH ~ N + Dens + P + Ca + Mg + K + Na + Conduc
## 
##          Df Sum of Sq    RSS     AIC
## - N       1   0.12459 5.2946 -89.816
## - K       1   0.13927 5.3093 -89.683
## - P       1   0.19052 5.3606 -89.222
## - Mg      1   0.20400 5.3741 -89.102
## <none>                5.1701 -88.959
## - Dens    1   0.24722 5.4173 -88.717
## - Na      1   0.64341 5.8135 -85.329
## - Conduc  1   1.07084 6.2409 -81.924
## - Ca      1   2.13686 7.3069 -74.354
## 
## Step:  AIC=-89.82
## pH ~ Dens + P + Ca + Mg + K + Na + Conduc
## 
##          Df Sum of Sq    RSS     AIC
## - P       1   0.09654 5.3912 -90.949
## - K       1   0.18416 5.4788 -90.175
## - Mg      1   0.18924 5.4839 -90.131
## <none>                5.2946 -89.816
## - Dens    1   0.43830 5.7329 -87.999
## - Na      1   0.92762 6.2223 -84.067
## - Conduc  1   1.45081 6.7455 -80.192
## - Ca      1   2.21538 7.5100 -75.038
## 
## Step:  AIC=-90.95
## pH ~ Dens + Ca + Mg + K + Na + Conduc
## 
##          Df Sum of Sq    RSS     AIC
## - Mg      1   0.19487 5.5861 -91.245
## - K       1   0.22056 5.6117 -91.024
## <none>                5.3912 -90.949
## - Dens    1   0.34214 5.7333 -89.995
## - Na      1   0.84982 6.2410 -85.923
## - Conduc  1   1.44816 6.8394 -81.528
## - Ca      1   2.18612 7.5773 -76.610
## 
## Step:  AIC=-91.24
## pH ~ Dens + Ca + K + Na + Conduc
## 
##          Df Sum of Sq    RSS     AIC
## - K       1   0.21783 5.8039 -91.408
## <none>                5.5861 -91.245
## - Dens    1   0.26392 5.8500 -91.029
## - Na      1   0.67349 6.2595 -87.781
## - Conduc  1   1.28684 6.8729 -83.294
## - Ca      1   2.16108 7.7471 -77.546
## 
## Step:  AIC=-91.41
## pH ~ Dens + Ca + Na + Conduc
## 
##          Df Sum of Sq    RSS     AIC
## <none>                5.8039 -91.408
## - Dens    1   0.34440 6.1483 -90.641
## - Na      1   0.53403 6.3379 -89.183
## - Conduc  1   1.07388 6.8778 -85.260
## - Ca      1   2.00759 7.8115 -79.149
summary(mejor_modelo)
## 
## Call:
## lm(formula = pH ~ Dens + Ca + Na + Conduc, data = Soils[, c("pH", 
##     "N", "Dens", "P", "Ca", "Mg", "K", "Na", "Conduc")])
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.57226 -0.18106 -0.07024  0.21657  1.22401 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.15903    0.73176   4.317 9.13e-05 ***
## Dens         0.67187    0.42061   1.597  0.11751    
## Ca           0.12929    0.03352   3.857  0.00038 ***
## Na           0.14114    0.07096   1.989  0.05308 .  
## Conduc      -0.18246    0.06469  -2.821  0.00722 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3674 on 43 degrees of freedom
## Multiple R-squared:  0.7264, Adjusted R-squared:  0.701 
## F-statistic: 28.55 on 4 and 43 DF,  p-value: 1.311e-11

10. Conclusiones

El análisis de datos y modelización realizado en el dataset “Soils” abordó varias etapas clave para comprender la relación entre las variables y para desarrollar modelos predictivos. A continuación, se presentan las conclusiones derivadas de cada paso:

  1. Importación de paquetes: Se utilizaron varios paquetes en R, como tidyverse, PerformanceAnalytics, y lmtest, para facilitar el análisis de datos, la visualización y la modelización.

  2. Carga del dataset: El dataset “Soils” contiene información sobre características físicas y químicas del suelo, como pH, nitrógeno, densidad, fósforo, calcio, magnesio, potasio, sodio y conductividad.

  3. Normalidad: Se realizaron pruebas de normalidad utilizando el test de Shapiro-Wilk para cada variable del dataset. Estas pruebas son importantes para determinar si las variables siguen una distribución normal, lo cual es fundamental para aplicar ciertos métodos estadísticos.

  4. Análisis de correlación: Se utilizó la función chart.Correlation() del paquete PerformanceAnalytics para realizar un análisis completo de correlación entre las variables del dataset. Se exploraron tanto correlaciones lineales (usando el test de Pearson) como no lineales (usando el test de Spearman).

  5. Regresiones lineales: Se ajustaron modelos de regresión lineal simple para comprender las relaciones lineales entre las variables. Se realizó también la prueba de autocorrelación de los residuos utilizando el test de Durbin-Watson.

  6. Regresiones no lineales: Se exploraron modelos de regresión no lineal utilizando la función nls() en R. Se ajustó un modelo no lineal para la relación entre pH y conductividad.

  7. Visualización en ggplot(): Se utilizó la librería ggplot2 para visualizar gráficamente las relaciones entre variables, tanto en modelos lineales como no lineales.

  8. Regresión Lineal Múltiple manual: Se realizó un análisis de regresión lineal múltiple manualmente utilizando la función lm(). Esto permite comprender cómo múltiples variables predictoras afectan a la variable de respuesta (conductividad en este caso).

  9. Selección Automática de Variables: Se aplicó la función stepAIC() del paquete MASS para realizar la selección automática de variables en modelos de regresión lineal múltiple. Esto ayuda a identificar las variables más relevantes para predecir la conductividad del suelo.

En resumen, el análisis y modelización realizados proporcionan una visión detallada de las relaciones y patrones en el dataset “Soils”, permitiendo extraer conclusiones significativas sobre la influencia de diversas características del suelo en su conductividad.