#Base de datos
library(readxl)
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.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── 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)
#A Explorar la base de datos
datos <- read_excel("NITROGENO.xlsx")
str(datos)
## tibble [12 × 3] (S3: tbl_df/tbl/data.frame)
## $ REPETICION : num [1:12] 1 2 3 4 1 2 3 4 1 2 ...
## $ PROFUNDIDAD: num [1:12] 20 20 20 20 40 40 40 40 60 60 ...
## $ NITROGENO : num [1:12] 0.09 0.08 0.13 0.11 0.06 0.08 0.09 0.09 0.04 0.05 ...
summary(datos)
## REPETICION PROFUNDIDAD NITROGENO
## Min. :1.00 Min. :20 Min. :0.04000
## 1st Qu.:1.75 1st Qu.:20 1st Qu.:0.05750
## Median :2.50 Median :40 Median :0.08000
## Mean :2.50 Mean :40 Mean :0.07667
## 3rd Qu.:3.25 3rd Qu.:60 3rd Qu.:0.09000
## Max. :4.00 Max. :60 Max. :0.13000
head(datos)
## # A tibble: 6 × 3
## REPETICION PROFUNDIDAD NITROGENO
## <dbl> <dbl> <dbl>
## 1 1 20 0.09
## 2 2 20 0.08
## 3 3 20 0.13
## 4 4 20 0.11
## 5 1 40 0.06
## 6 2 40 0.08
# 3. Graficar la relación
ggplot(datos, aes(x = PROFUNDIDAD, y = NITROGENO)) +
geom_point(color = "black", size = 2) +
geom_smooth(method = "lm", se = FALSE, color = "blue") +
labs(title = "Relación entre profundidad y nitrógeno",
x = "Profundidad (cm)",
y = "Nitrógeno (%)") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

# Se observa una tendencia asociada a una disminución del porcentaje de nitrógeno con el incremento de profundidad del suelo.
#B Análisis de correlación
# 4. Calcular coeficiente de correlación de Pearson
cor_test <- cor.test(datos$PROFUNDIDAD, datos$NITROGENO, method = "pearson")
cor_test
##
## Pearson's product-moment correlation
##
## data: datos$PROFUNDIDAD and datos$NITROGENO
## t = -5.0034, df = 10, p-value = 0.0005346
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.9556210 -0.5271611
## sample estimates:
## cor
## -0.8453206
# Valor del Coeficiente de Correlación de Pearson (r) = −0.8453. Su signo - indica que es inverso y su proximidad a 1 que es fuerte.
# p-value = 0.0005346 → significativa (α = 0.05). La correlación es estadísticamente significativa.
#C Ajuste del modelo de regresión lineal simple
# 6. Ajustar el modelo lineal
modelo <- lm(NITROGENO ~ PROFUNDIDAD, data = datos)
# Ver resultados generales
summary(modelo)
##
## Call:
## lm(formula = NITROGENO ~ PROFUNDIDAD, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.024167 -0.010417 0.002083 0.011458 0.025833
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.1316667 0.0118732 11.089 6.11e-07 ***
## PROFUNDIDAD -0.0013750 0.0002748 -5.003 0.000535 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01555 on 10 degrees of freedom
## Multiple R-squared: 0.7146, Adjusted R-squared: 0.686
## F-statistic: 25.03 on 1 and 10 DF, p-value: 0.0005346
#Regresión lineal simple:
#Ecuación de la recta:
# NITRÓGENO=𝛽0 + 𝛽1 ⋅ PROFUNDIDAD
#Interpretación de coeficientes:
#Intercepto β0 → nitrógeno estimado cuando PROFUNDIDAD = 0.
#Pendiente β1 → cuánto cambia el nitrógeno por cada cm adicional de profundidad.
#β₀ (intercepto) = 0.131667
#β₁ (pendiente) = −0.001375
#Implicancias Agronómicas de los resultados: la concentración de nitrógeno (N) es mayor a menor profundidad. A medida que el suelo es más profundo, el N disponible total tiende a reducirse.
#La significancia estadística del coeficiente de la pendiente β₁ se evalúa con el p-value asociado a ese coeficiente en el modelo de regresión. Si β₁ (pendiente) = −0.001375, y p-value(β₁) = 0.0005346, debido a que el p-value es mucho menor que 0.05, rechazamos la hipótesis nula: 𝐻0: 𝛽1 = 0. Esto significa que la pendiente es estadísticamente diferente de cero, es decir, la profundidad del suelo influye significativamente sobre el contenido de nitrógeno.
#Coeficiente de determinación: R² = 0.7146 (R² ajustado = 0.6860) → el ~71% de la variación de N% se explica por la profundidad.
#Representación gráfica del modelo sobre los datos observados
ggplot(datos, aes(x = PROFUNDIDAD, y = NITROGENO)) +
geom_point(size = 3, color = "blue") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Modelo de regresión lineal",
x = "Profundidad (cm)",
y = "Nitrógeno (%)") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

#D Diagnóstico del modelo
# Análisis de residuos
par(mfrow = c(2,2))
plot(modelo)

par(mfrow = c(1,1))
#Linealidad: aceptable.
#Normalidad de residuos: cumplida.
#Homoscedasticidad: leve disperción, la varianza no es completamente constante.
#Sin outliers influyentes: modelo estable.
#El modelo es válido, pero para mayor rigurosidad conviene usar errores estándar robustos o verificar si una transformación puede reducir la heterocedasticidad.
# E. Predicción para profundidad de 50 cm
nuevo <- data.frame(PROFUNDIDAD = 50)
predict(modelo, newdata = nuevo, interval = "confidence")
## fit lwr upr
## 1 0.06291667 0.05119171 0.07464163
# Según el modelo de regresión lineal ajustado: Con los valores estimados:
#β₀ (intercepto) = 0.2725
#β₁ (pendiente) = −0.001375
#Sustituyendo una profundidad de 50 cm:
#𝑁=0.2725+(−0.001375)(50) ≈ 0.204
#Por lo tanto, el contenido esperado de nitrógeno para 50 cm de profundidad es aproximadamente 0.204 %, con un intervalo de confianza del 95 %.