Peso del fruto vs. diámetro ecuatorial · Solanum betaceum Cav.
El cultivo escogido es el tomate de árbol (Solanum betaceum Cav., sin. Cyphomandra betacea), una solanácea de gran importancia económica en la zona andina de Colombia. Se seleccionaron dos variables cuantitativas de caracterización de fruto:
Ambas son variables cuantitativas continuas, medidas por fruto individual, y biológicamente relacionadas: a mayor volumen del fruto corresponde mayor peso y mayor diámetro, por lo que se espera una correlación positiva y fuerte entre ellas.
Lagos, L. K., Vallejo Cabrera, F. A., Lagos Burbano, T. C., & Duarte Alvarado, D. E. (2013). Correlaciones genotípicas, fenotípicas y ambientales, y análisis de sendero en tomate de árbol (Cyphomandra betacea Cav. Sendt.). Acta Agronómica, 62(3), 215–222. Universidad Nacional de Colombia, Sede Palmira. https://revistas.unal.edu.co/index.php/acta_agronomica/article/view/33855
Este estudio, publicado en Acta Agronómica (revista de la Facultad de Ciencias Agropecuarias de la Universidad Nacional de Colombia), evaluó nueve variables de tamaño y calidad del fruto en 81 híbridos de tomate de árbol en Nariño, y reportó correlaciones fenotípicas altas y positivas entre variables de tamaño del fruto (p. ej., peso del fruto con peso de pulpa + semilla, r = 0.71). Con base en ese antecedente, aquí se simula una correlación de r = 0.80 entre peso y diámetro del fruto, un valor consistente con el orden de magnitud reportado en la literatura para este cultivo.
Se genera un conjunto de datos de n = 90 frutos, con correlación de Pearson exacta de 0.80, mediante ortogonalización de Gram-Schmidt sobre variables estandarizadas y posterior transformación lineal a las unidades reales (una transformación lineal no altera el coeficiente de correlación de Pearson).
set.seed(2026)
n <- 90 # numero de frutos muestreados
r_objetivo <- 0.80 # correlacion de Pearson objetivo
# --- 1) dos variables estandar con correlacion EXACTA r = 0.80 ---
z1 <- rnorm(n)
z2 <- rnorm(n)
z1 <- (z1 - mean(z1)) / sqrt(mean((z1 - mean(z1))^2)) # estandarizar z1
z2_orth <- z2 - (sum(z1 * z2) / sum(z1 * z1)) * z1 # ortogonalizar z2 vs z1
z2_orth <- (z2_orth - mean(z2_orth)) / sqrt(mean((z2_orth - mean(z2_orth))^2))
z_pf <- z1
z_diam <- r_objetivo * z1 + sqrt(1 - r_objetivo^2) * z2_orth # combinar -> r exacto
# --- 2) transformacion lineal a unidades reales ---
# rangos basados en literatura agronomica del cultivo (Lagos et al. 2013):
# peso del fruto ~ 55-125 g ; diametro ecuatorial ~ 36-60 mm
media_pf <- 88.0; sd_pf <- 14.0 # peso del fruto (g)
media_diam <- 47.5; sd_diam <- 5.5 # diametro ecuatorial (mm)
peso_fruto <- media_pf + sd_pf * z_pf
diametro <- media_diam + sd_diam * z_diam
datos <- data.frame(
fruto_id = 1:n,
peso_fruto_g = round(peso_fruto, 2),
diametro_ecuatorial_mm = round(diametro, 2)
)
head(datos, 12)
## fruto_id peso_fruto_g diametro_ecuatorial_mm
## 1 1 96.29 43.45
## 2 2 73.52 47.68
## 3 3 90.86 46.71
## 4 4 87.68 50.60
## 5 5 79.40 38.43
## 6 6 53.09 35.20
## 7 7 78.42 41.04
## 8 8 74.37 41.31
## 9 9 90.50 44.55
## 10 10 82.14 46.74
## 11 11 83.08 49.91
## 12 12 78.49 42.64
summary(datos[, c("peso_fruto_g", "diametro_ecuatorial_mm")])
## peso_fruto_g diametro_ecuatorial_mm
## Min. : 52.65 Min. :35.20
## 1st Qu.: 77.22 1st Qu.:43.20
## Median : 87.28 Median :47.27
## Mean : 88.00 Mean :47.50
## 3rd Qu.: 97.27 3rd Qu.:50.93
## Max. :123.23 Max. :60.19
r_original <- cor(datos$peso_fruto_g, datos$diametro_ecuatorial_mm,
method = "pearson")
r_original
## [1] 0.799979
La correlación de Pearson entre el peso del fruto y el diámetro ecuatorial en los datos originales es r = 0.8.
plot(datos$peso_fruto_g, datos$diametro_ecuatorial_mm, pch = 21,
bg = adjustcolor(COL_PF, alpha.f = 0.75), col = "white", cex = 1.4,
xlab = "Peso del fruto (g)", ylab = "Diametro ecuatorial (mm)",
main = "Dispersion bivariada - datos originales\nTomate de arbol, n=90",
panel.first = grid(col = "#e1e0d9", lty = 1))
abline(lm(diametro_ecuatorial_mm ~ peso_fruto_g, data = datos),
col = INK, lwd = 1.6, lty = 2)
legend("topleft", legend = sprintf("r = %.3f", r_original), bty = "o",
bg = "white", box.col = "#e1e0d9", text.font = 2, cex = 1.1)
La nube de puntos muestra una asociación lineal positiva y clara entre el peso del fruto y su diámetro ecuatorial, coherente con la relación alométrica esperada entre masa y tamaño en frutos carnosos.
Cada variable se estandariza con la fórmula min-max:
\[x'_i = \frac{x_i - x_{min}}{x_{max} - x_{min}}\]
min_max <- function(v) (v - min(v)) / (max(v) - min(v))
datos$peso_fruto_norm <- min_max(datos$peso_fruto_g)
datos$diametro_norm <- min_max(datos$diametro_ecuatorial_mm)
head(datos, 6)
## fruto_id peso_fruto_g diametro_ecuatorial_mm peso_fruto_norm diametro_norm
## 1 1 96.29 43.45 0.618305469 0.3301321
## 2 2 73.52 47.68 0.295692831 0.4993998
## 3 3 90.86 46.71 0.541371493 0.4605842
## 4 4 87.68 50.60 0.496316237 0.6162465
## 5 5 79.40 38.43 0.379002550 0.1292517
## 6 6 53.09 35.20 0.006234061 0.0000000
r_normalizado <- cor(datos$peso_fruto_norm, datos$diametro_norm,
method = "pearson")
comparacion <- data.frame(
conjunto_de_datos = c("Original (g, mm)", "Normalizado min-max [0,1]"),
r_pearson = round(c(r_original, r_normalizado), 4)
)
comparacion
## conjunto_de_datos r_pearson
## 1 Original (g, mm) 0.8
## 2 Normalizado min-max [0,1] 0.8
diferencia <- abs(r_original - r_normalizado)
diferencia
## [1] 1.110223e-16
Hallazgo clave: la correlación de Pearson no cambia al aplicar la estandarización min-max (diferencia = 0.0000000000000001110223). Min-max es una transformación lineal (\(x' = a\cdot x + b\), con \(a = 1/(x_{max}-x_{min}) > 0\)), y el coeficiente de correlación de Pearson es invariante ante transformaciones lineales positivas de las variables. La estandarización cambia la escala y la unidad de medida, pero no la fuerza ni el signo de la relación lineal entre las variables.
par(mfrow = c(1, 2), mar = c(4.2, 4.5, 3.2, 1.2), oma = c(0, 0, 2.5, 0))
plot(datos$peso_fruto_g, datos$diametro_ecuatorial_mm, pch = 21,
bg = adjustcolor(COL_PF, alpha.f = 0.75), col = "white", cex = 1.3,
xlab = "Peso del fruto (g)", ylab = "Diametro ecuatorial (mm)",
main = "Original", panel.first = grid(col = "#e1e0d9", lty = 1))
abline(lm(diametro_ecuatorial_mm ~ peso_fruto_g, data = datos),
col = INK, lwd = 1.5, lty = 2)
legend("topleft", legend = sprintf("r = %.3f", r_original), bty = "o",
bg = "white", box.col = "#e1e0d9", text.font = 2)
plot(datos$peso_fruto_norm, datos$diametro_norm, pch = 21,
bg = adjustcolor(COL_DIAM, alpha.f = 0.75), col = "white", cex = 1.3,
xlab = "Peso del fruto (norm. 0-1)", ylab = "Diametro ecuatorial (norm. 0-1)",
main = "Normalizado (min-max)", panel.first = grid(col = "#e1e0d9", lty = 1))
abline(lm(diametro_norm ~ peso_fruto_norm, data = datos),
col = INK, lwd = 1.5, lty = 2)
legend("topleft", legend = sprintf("r = %.3f", r_normalizado), bty = "o",
bg = "white", box.col = "#e1e0d9", text.font = 2)
mtext("Comparacion: dispersion antes y despues de la estandarizacion min-max",
outer = TRUE, cex = 1.1, font = 2, col = INK)
Como se observa, la forma de la nube de puntos es idéntica en ambos gráficos; lo único que cambia son las escalas de los ejes (de gramos/ milímetros a valores entre 0 y 1).
par(mfrow = c(2, 2), mar = c(4.2, 4.5, 3, 1.2), oma = c(0, 0, 2.5, 0))
hist_panel <- function(data, xlab, color, main) {
hist(data, breaks = 12, col = color, border = "white",
xlab = xlab, ylab = "Frecuencia (n de frutos)", main = main)
abline(v = mean(data), col = INK, lwd = 1.6, lty = 2)
}
hist_panel(datos$peso_fruto_g, "Peso del fruto (g)", COL_PF,
"Peso del fruto - original")
hist_panel(datos$diametro_ecuatorial_mm, "Diametro ecuatorial (mm)", COL_DIAM,
"Diametro ecuatorial - original")
hist_panel(datos$peso_fruto_norm, "Peso del fruto (normalizado 0-1)", COL_PF,
"Peso del fruto - normalizado (min-max)")
hist_panel(datos$diametro_norm, "Diametro ecuatorial (normalizado 0-1)", COL_DIAM,
"Diametro ecuatorial - normalizado (min-max)")
mtext("Histogramas de frecuencia - Tomate de arbol (n=90)",
outer = TRUE, cex = 1.1, font = 2, col = INK)
Al igual que con la correlación, la forma de la distribución (asimetría, modas, dispersión relativa) es la misma antes y después de normalizar La estandarización min-max solo re-escala el eje horizontal a [0, 1], sin alterar la frecuencia relativa de los datos.
write.csv(datos, "dataset_tomate_arbol.csv", row.names = FALSE)
Lagos, L. K., Vallejo Cabrera, F. A., Lagos Burbano, T. C., & Duarte Alvarado, D. E. (2013). Correlaciones genotípicas, fenotípicas y ambientales, y análisis de sendero en tomate de árbol (Cyphomandra betacea Cav. Sendt.). Acta Agronómica, 62(3), 215–222. Universidad Nacional de Colombia. https://revistas.unal.edu.co/index.php/acta_agronomica/article/view/33855