install.packages("PerformanceAnalytics")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("readxl")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("tidyverse")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
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
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
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::first() masks xts::first()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::last() masks xts::last()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
nitrogeno <- read_excel("NITROGENO.xlsx")
head(nitrogeno)
## # 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
summary(nitrogeno)
## 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
str(nitrogeno)
## 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 ...
prof_nitr <- nitrogeno %>% select(PROFUNDIDAD, NITROGENO)
# Gráfico de dispersión + correlación
chart.Correlation(prof_nitr, histogram = TRUE, pch = 19)
# 4. También podemos hacer el gráfico clásico con ggplot2
ggplot(nitrogeno, aes(x = PROFUNDIDAD, y = NITROGENO)) +
geom_point(aes(color = as.factor(REPETICION)), size = 3) +
geom_smooth(method = "lm", se = TRUE, color = "blue") +
labs(
title = "Relación entre profundidad y contenido de Nitrógeno",
x = "Profundidad del suelo (cm)",
y = "Nitrógeno (%)",
color = "Repetición"
) +
theme_minimal(base_size = 14)
## `geom_smooth()` using formula = 'y ~ x'
Respuesta:
Sí, se observa una tendencia negativa: a mayor profundidad del suelo, el contenido de nitrógeno disminuye. Esto se refleja en la pendiente descendente de la recta de regresión, lo que indica una relación inversa entre ambas variables.
correlacion <- cor(nitrogeno$PROFUNDIDAD, nitrogeno$NITROGENO, method = "pearson")
# Mostrar el valor
correlacion
## [1] -0.8453206
Respuestas
El coeficiente de correlación de Pearson es -0.8453.
El signo negativo indica que existe una relación inversa: a medida que la profundidad aumenta, el contenido de nitrogeno tiende a disminuir.
El valor absoluto (0.8453) es cercano a 1, lo que señala una relación fuerte entre las dos variables.
Prueba de hipótesis: H0: ρ = 0 (no hay correlación) vs H1: ρ ≠ 0
test_cor <- cor.test(nitrogeno$PROFUNDIDAD, nitrogeno$NITROGENO, method = "pearson", conf.level = 0.95)
# Resultados del test
test_cor
##
## Pearson's product-moment correlation
##
## data: nitrogeno$PROFUNDIDAD and nitrogeno$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
`` Interpretación
Significancia estadística: el p-value= 0.0005346 es mucho menor que 0.05, por lo tanto se rechaza la hipótesis nula (H₀: ρ = 0). Esto confirma que la correlación es estadísticamente significativa.
modelo <- lm(NITROGENO ~ PROFUNDIDAD, data = nitrogeno)
# Mostrar resumen del modelo
summary(modelo)
##
## Call:
## lm(formula = NITROGENO ~ PROFUNDIDAD, data = nitrogeno)
##
## 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
Respuestas
La ecuación de la recta de regresión lineal simple que se ajustó a los datos es: NITROGENO= 0.1317- 0.001375 * PROFUNDIDAD y= 0.1317 - 0.001375 X
El intercepto (0.1317) representa el contenido de nitrógeno estimado en el suelo cuando la profundidad es 0 cm. En términos prácticos, indica la concentración de nitrógeno en la superficie del suelo.
La pendiente (-0.001375) señala que, por cada centímetro que aumenta la profundidad, el contenido de nitrógeno disminuye en promedio en 0.001375 unidades. Es decir, existe una relación negativa entre profundidad y concentración de nitrógeno.
El resultado sugiere que el nitrógeno se concentra principalmente en los estratos superficiales del suelo y decrece a medida que aumenta la profundidad. Esto es consistente con la acumulación de materia orgánica en superficie, que es la principal fuente de nitrógeno disponible. Desde el manejo, resalta la importancia de prácticas como la incorporación de residuos de cultivo, abonos verdes o fertilizantes en la capa superficial, ya que es allí donde el nitrógeno se encuentra más disponible para las raíces finas de los cultivos.
Detalle de la prueba
Hipótesis nula (H₀):𝛽=0 → No hay relación lineal entre profundidad y nitrógeno.
Hipótesis alternativa (H₁):𝛽≠ 0 → Sí existe relación lineal entre las variables.
cat("Significancia de la pendiente (β):\n")
## Significancia de la pendiente (β):
summary(modelo)$coefficients
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.1316667 0.0118731724 11.089426 6.113902e-07
## PROFUNDIDAD -0.0013750 0.0002748105 -5.003447 5.346109e-04
Interpretación
El valor p < 0.001 indica que la pendiente es altamente significativa estadísticamente. Esto significa que existe evidencia muy fuerte para rechazar la hipótesis nula (H₀):𝛽=0 → No hay relación lineal entre profundidad y nitrógeno. En consecuencia, la relación negativa encontrada entre profundidad y contenido de nitrógeno no es producto del azar, sino que está respaldada por los datos.
cat("Coeficiente de determinación (R²):", summary(modelo)$r.squared, "\n")
## Coeficiente de determinación (R²): 0.7145669
Interpretación
El R² indica la proporción de la variabilidad de la variable dependiente (NITROGENO) que es explicada por la variable independiente (PROFUNDIDAD) mediante el modelo lineal. Un R² de 0.7146 significa que aproximadamente el 71,5% de la variación del contenido de nitrógeno en el suelo se explica por la profundidad. El resto de la variabilidad (28,5%) se debe a otros factores que no están en el modelo o al error experimental.
library(ggplot2)
ggplot(nitrogeno, aes(x = PROFUNDIDAD, y = NITROGENO)) +
geom_point(color = "blue", size = 3) +
geom_smooth(method = "lm", se = TRUE, color = "red") +
labs(
title = "Regresión lineal simple",
x = "Profundidad",
y = "Nitrógeno"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5)) + # Centrar título
annotate(
"text",
x = max(nitrogeno$PROFUNDIDAD) * 0.7, # Posición horizontal (70% del máximo)
y = max(nitrogeno$NITROGENO) * 0.95, # Posición vertical (95% del máximo)
label = "y = 0.1317 - 0.001375 X",
color = "black",
size = 4,
hjust = 0
)
## `geom_smooth()` using formula = 'y ~ x'
residuos <- residuals(modelo)
summary(residuos)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -0.024167 -0.010417 0.002083 0.000000 0.011458 0.025833
par(mfrow = c(2,2))
plot(modelo)
par(mfrow = c(1,1))
Interpretación:
Los residuos parecen bastante dispersos alrededor de cero y no muestran una tendencia clara.
Los puntos siguen bastante bien la línea, con solo ligeras desviaciones en los extremos. Esto sugiere que los residuos son aproximadamente normales, lo que cumple el supuesto de normalidad.
Hay una ligera tendencia ascendente, lo que indica una leve heterocedasticidad, pero no parece severa.
Ningún punto se encuentra fuera de la línea de Cook’s distance significativa (gris punteada). Esto indica que no hay observaciones altamente influyentes que afecten el modelo.
El modelo parece cumplir razonablemente los supuestos básicos de regresión: _Residuos aproximadamente normales. _Homocedasticidad aceptable. _Independencia de residuos _No hay puntos influyentes que distorsionen el ajuste. En términos prácticos, los resultados del modelo pueden considerarse confiables para predicción y análisis.
H0: Se cumple el supuesto de Normalidad
H1: No se cumple el supuesto de Normalidad
# Ajuste del modelo
modelo <- lm(NITROGENO ~ PROFUNDIDAD, data = nitrogeno)
# Residuos del modelo
residuos <- residuals(modelo)
# Prueba de normalidad de Shapiro-Wilk
shapiro.test(residuos)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.97087, p-value = 0.9197
# Gráfico Q-Q
qqnorm(residuos)
qqline(residuos, col = "red")
Interpretación
Según la prueba de Shapiro-Wilk (p = 0.92), no se encontraron evidencias para rechazar la normalidad de los residuos, por lo que se cumple el supuesto de normalidad en el modelo de regresión.
De acuerdo al graficoo de Residuals vs Fitted, los residuos se distribuyen alrededor de 0 sin un patrón claro; algunos outliers (puntos 2 y 3) están presentes, pero la linealidad se cumple razonablemente.
H0: La varianza de los residuos es constante (homocedasticidad) H1: La varianza de los residuos no es constante (heterocedasticidad)
# Gráfico de residuos vs valores ajustados
plot(modelo$fitted.values, residuos,
xlab = "Valores ajustados",
ylab = "Residuos",
main = "Residuos vs Valores Ajustados")
abline(h = 0, col = "red")
# Prueba de Breusch-Pagan
# install.packages("lmtest")
library(lmtest)
bptest(modelo)
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 4.2387, df = 1, p-value = 0.03951
Interpretación
Como el p-valor < 0.05, se rechaza la hipótesis nula. Esto indica que existe evidencia de heterocedasticidad, es decir, la varianza de los errores no es constante.
H0: Los residuos son independientes H1: Los residuos no son independientes
# Prueba de Durbin-Watson
dwtest(modelo)
##
## Durbin-Watson test
##
## data: modelo
## DW = 2.1155, p-value = 0.4518
## alternative hypothesis: true autocorrelation is greater than 0
Interpretación
El valor de DW = 2.1155 → Muy cercano a 2 → No hay evidencia de autocorrelación. Valor p = 0.4518 > 0.05 → No se rechaza H₀. Los residuos del modelo parecen ser independientes, por lo que el supuesto de independencia de los errores se cumple.
H0: β1 = 0 (no hay relación lineal entre PROFUNDIDAD y NITROGENO)
H1: β1 ≠ 0 (sí hay relación lineal)
α = 0.05
# Mostrar resumen del modelo
summary(modelo)
##
## Call:
## lm(formula = NITROGENO ~ PROFUNDIDAD, data = nitrogeno)
##
## 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
Interpretación
Valor p = 0.000535 Comparación: 0.000535 < 0.05 → rechazamos H₀. Existe evidencia estadística significativa de que la profundidad afecta el contenido de nitrógeno en el suelo. La pendiente negativa (-0.001375) indica que a mayor profundidad, menor contenido de nitrógeno.
NITROGENO= 0.1317- 0.001375 * PROFUNDIDAD (cm)
NITROGENO = 0.1317 - 0.001375 * 50
NITROGENO
## [1] 0.06295
nueva_profundidad <- data.frame(PROFUNDIDAD = 50)
prediccion <- predict(modelo, newdata = nueva_profundidad, interval = "confidence") # intervalo de confianza
prediccion
## fit lwr upr
## 1 0.06291667 0.05119171 0.07464163
Interpretación
fit (0.0629) es el valor predicho por el modelo de regresión. Según la ecuación NITROGENO ~ PROFUNDIDAD, cuando la profundidad es 50 cm, se espera que el contenido de nitrógeno sea aproximadamente 0.0629 %.
# Predicción con intervalo de confianza
prediccion <- predict(modelo, newdata = nueva_profundidad, interval = "confidence", level = 0.95)
# Extraer valor puntual de predicción
pred_punto <- prediccion[1, "fit"]
# Construir la ecuación con signo correcto
pendiente <- coef(modelo)[2]
signo <- ifelse(pendiente < 0, "-", "+")
ecuacion <- paste0("Nitrogeno = ", round(coef(modelo)[1],3), " ",
signo, " ", abs(round(pendiente,6)), " * Profundidad")
# Gráfico de dispersión con recta de regresión y punto de predicción
ggplot(nitrogeno, aes(x = PROFUNDIDAD, y = NITROGENO)) +
geom_point(size = 2.5, alpha = 0.6, color = "blue") +
geom_smooth(method = "lm", se = TRUE, color = "black") +
geom_text(x = max(nitrogeno$PROFUNDIDAD)*0.55, # más a la izquierda
y = max(nitrogeno$NITROGENO)*0.9,
label = ecuacion,
size = 4, # un poco más chica
hjust = 0) +
geom_point(aes(x = 50, y = pred_punto), color = "red", size = 3.5) +
geom_errorbar(aes(x = 50, ymin = prediccion[1, "lwr"], ymax = prediccion[1, "upr"]),
width = 2, color = "red") +
theme_minimal() +
labs(title = "Predicción de nitrogeno según la profundidad",
x = "Profundidad (cm)", y = "Nitrogeno") +
theme(plot.title = element_text(hjust = 0.5)) # título centrado
## Warning in geom_point(aes(x = 50, y = pred_punto), color = "red", size = 3.5): All aesthetics have length 1, but the data has 12 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
## a single row.
## `geom_smooth()` using formula = 'y ~ x'
Interpretación
Para una profundidad de suelo de 50 cm, el modelo predice que el contenido de nitrógeno será aproximadamente 0.063 %, con un intervalo de confianza del 95% que va de 0.051 a 0.075. Esto refleja la incertidumbre inherente al modelo, es decir, que el valor real puede variar dentro de ese rango.