Está en la página 1de 21

Patrones Morfométricos y Biológicos en Hoplias malabaricus:

Modelos Lineales, Potenciales y Logísticos


Tatis C., Terá n C., Uribe J., Vega A.

2023-11-19
library(readxl)
library(dplyr)

##
## Attaching package: 'dplyr'

## The following objects are masked from 'package:stats':


##
## filter, lag

## The following objects are masked from 'package:base':


##
## intersect, setdiff, setequal, union

library(ggplot2)
library(ggpmisc)

## Warning: package 'ggpmisc' was built under R version 4.2.3

## Loading required package: ggpp

## Warning: package 'ggpp' was built under R version 4.2.3

## Registered S3 methods overwritten by 'ggpp':


## method from
## heightDetails.titleGrob ggplot2
## widthDetails.titleGrob ggplot2

##
## Attaching package: 'ggpp'

## The following object is masked from 'package:ggplot2':


##
## annotate

## Registered S3 method overwritten by 'ggpmisc':


## method from
## as.character.polynomial polynom

##
## Attaching package: 'ggpmisc'
## The following object is masked from 'package:ggpp':
##
## quadrant_example.df

ruta <- "C:\\Users\\CAMILO\\Downloads\\Datos_Trabajo_Final.xlsx"


Hoplias_malabaricus <- read_excel(ruta, sheet = "Hoja1")
# Filtrar por la especie "Hoplias malabaricus"
Hoplias_malabaricus <- Hoplias_malabaricus[Hoplias_malabaricus$Especie ==
"Hoplias malabaricus", ]

Hoplias_LtvsLe <- subset(Hoplias_malabaricus, !is.na(Lt) & !is.na(Le))

ggplot(Hoplias_LtvsLe, aes(x = Le, y = Lt)) +


geom_point() +
labs(x = "Longitud estándar (cm)", y = "Longitud total (cm)") +
theme_classic() +
ggtitle("Diagrama de Dispersión")

## modelo de regresión líneal simple


# Relacion Longitud total vs Longitud estándar
fit <- lm(Lt~Le, data = Hoplias_LtvsLe )
summary(fit)

##
## Call:
## lm(formula = Lt ~ Le, data = Hoplias_LtvsLe)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.60199 -0.31110 -0.01126 0.28884 1.76169
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.102871 0.128245 8.6 <2e-16 ***
## Le 1.181782 0.005546 213.1 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4264 on 1062 degrees of freedom
## Multiple R-squared: 0.9771, Adjusted R-squared: 0.9771
## F-statistic: 4.541e+04 on 1 and 1062 DF, p-value: < 2.2e-16

Hoplias_LtvsLe <- subset(Hoplias_malabaricus,!is.na(Lt) & !is.na(Le))


p <- ggplot(Hoplias_LtvsLe, aes(x = Le, y = Lt)) +
geom_point() +
labs(x = "Longitud estándar (cm)", y = "Longitud total (cm)") +
theme_classic()+
geom_smooth(method = "lm", se = FALSE, color = "red")+
ggtitle("Modelo lineal ajustado")
my.formula <- y ~ x
p + stat_poly_eq(aes(label = paste(stat(eq.label),stat(rr.label), sep =
"*\", \"*")),
formula=my.formula,coef.digits =
4,rr.digits=3,parse=TRUE,col="black")

## Warning: `stat(eq.label)` was deprecated in ggplot2 3.4.0.


## ℹ Please use `after_stat(eq.label)` instead.

## `geom_smooth()` using formula = 'y ~ x'


##Relación entre Longitud Estándar y Longitud Total en Hoplias malabaricus:
Diferencias de Ajuste entre Machos y Hembras
Hoplias_LtvsLe <- subset(Hoplias_malabaricus, !is.na(Lt) & !is.na(Le) & !
is.na(Sexo))
# Grafico con puntos coloreados por género
p <- ggplot(Hoplias_LtvsLe, aes(x = Le, y = Lt, color = Sexo)) +
geom_point() +
labs(x = "Longitud estándar (cm)", y = "Longitud total (cm)") +
theme_classic() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
ggtitle("Diferencias de Ajuste entre Machos y Hembras")

## `geom_smooth()` using formula = 'y ~ x'


##Relación entre Longitud Estándar y Longitud Total en Hoplias malabaricus:
Comparación de Tendencias entre Machos y Hembras
Hoplias_LtvsLe <- subset(Hoplias_malabaricus, !is.na(Lt) & !is.na(Le) & !
is.na(Sexo))

p <- ggplot(Hoplias_LtvsLe, aes(x = Le, y = Lt, color = Sexo)) +


geom_point() +
labs(x = "Longitud estándar (cm)", y = "Longitud total (cm)") +
theme_classic() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
ggtitle("Comparación de Tendencias entre Machos y Hembras") +
facet_wrap(~Sexo, scales = "free")

## `geom_smooth()` using formula = 'y ~ x'


#Modelo de regresión lineal simple para machos
hoplias_machos <- subset(Hoplias_LtvsLe, Sexo == "Macho")
fit_machos <- lm(Lt ~ Le, data = hoplias_machos)
summary_fit_machos <- summary(fit_machos)
summary_fit_machos

##
## Call:
## lm(formula = Lt ~ Le, data = hoplias_machos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.98941 -0.32319 -0.02362 0.29528 1.75340
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.037227 0.182341 5.688 2.08e-08 ***
## Le 1.184681 0.007967 148.690 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4123 on 555 degrees of freedom
## Multiple R-squared: 0.9755, Adjusted R-squared: 0.9755
## F-statistic: 2.211e+04 on 1 and 555 DF, p-value: < 2.2e-16

#Modelo de regresión lineal simple para hembras


hoplias_hembras <- subset(Hoplias_LtvsLe, Sexo == "Hembra")
fit_hembras <- lm(Lt ~ Le, data = hoplias_hembras)
summary_fit_hembras <- summary(fit_hembras)
summary_fit_hembras

##
## Call:
## lm(formula = Lt ~ Le, data = hoplias_hembras)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.59925 -0.30217 -0.01541 0.28281 1.47295
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.158502 0.183466 6.315 5.94e-10 ***
## Le 1.179370 0.007846 150.318 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4421 on 505 degrees of freedom
## Multiple R-squared: 0.9781, Adjusted R-squared: 0.9781
## F-statistic: 2.26e+04 on 1 and 505 DF, p-value: < 2.2e-16

##Regresión Potencial
Hoplias_RPE <- subset(Hoplias_malabaricus,!is.na(Pe) & !is.na(Lt))

ggplot(Hoplias_RPE, aes(x = Lt, y = Pe)) +


geom_point() +
labs(x = "Longitud total (cm)", y = "Peso total (g)") + theme_classic()+
ggtitle("Diagrama de Dispersión")
my.formula <- y ~ x
p + stat_poly_eq(aes(label = paste(stat(eq.label),stat(rr.label), sep =
"*\", \"*")),
formula=my.formula,coef.digits =
4,rr.digits=3,parse=TRUE,col="black")

## `geom_smooth()` using formula = 'y ~ x'


# Filtrar datos sin valores faltantes en Pe y Lt
Hoplias_RPE <- subset(Hoplias_malabaricus, !is.na(Pe) & !is.na(Lt))

# Aplicar logaritmo natural a Pe y Lt


Hoplias_RPE$log_Pe <- log(Hoplias_RPE$Pe)
Hoplias_RPE$log_Lt <- log(Hoplias_RPE$Lt)

# Ajustar un modelo lineal con logaritmos


fit <- lm(log_Pe ~ log_Lt, data = Hoplias_RPE)

# Graficar el diagrama de dispersión y la línea ajustada


p <- ggplot(Hoplias_RPE, aes(x = log_Lt, y = log_Pe)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(x = "log(Longitud total (cm))", y = "log(Peso total (g))") +
theme_bw() +
ggtitle("Diagrama de Dispersión Linealizado")

# Añadir la ecuación de la recta


my.formula <- y ~ x
p + stat_poly_eq(aes(label = paste(stat(eq.label), stat(rr.label), sep =
"*\", \"*")),
formula = my.formula, coef.digits = 4, rr.digits = 3, parse
= TRUE, col = "black")

## `geom_smooth()` using formula = 'y ~ x'


Hoplias_RPE <- subset(Hoplias_malabaricus,!is.na(Lt) & !is.na(Pe))
p <- ggplot(Hoplias_RPE, aes(x = Lt, y = Pe)) +
geom_point() +
labs(x = "Longitud total (cm)", y = "Peso total (g)") + theme_classic()+
ggtitle("Modelo ajustado")+geom_smooth(method = "loess", se = FALSE, color
= "red")
p

## `geom_smooth()` using formula = 'y ~ x'


#Gráficos por separado para machos y hembras
Hoplias_RPE <- subset(Hoplias_malabaricus, !is.na(Lt) & !is.na(Pe) & !
is.na(Sexo))
p <- ggplot(Hoplias_RPE, aes(x = Lt, y = Pe, color = Sexo)) +
geom_point() +
labs(x = "Longitud total (cm)", y = "Peso total (g)") +
theme_classic() +
ggtitle("Relación entre Longitud Total y Peso Total por Sexo") +
geom_smooth(method = "loess", se = FALSE, color = "red") +
facet_wrap(~Sexo, scales = "free")

## `geom_smooth()` using formula = 'y ~ x'


## Modelo de regresión potencial
# Relación longitud Vs peso
fit2 <- lm(log(Pe)~log(Lt),data = Hoplias_RPE)
summary_fit2 <- summary(fit2)
summary_fit2

##
## Call:
## lm(formula = log(Pe) ~ log(Lt), data = Hoplias_RPE)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.222742 -0.039930 -0.000657 0.041526 0.277688
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.77023 0.06681 -71.4 <2e-16 ***
## log(Lt) 3.06090 0.02001 153.0 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.06428 on 1061 degrees of freedom
## Multiple R-squared: 0.9566, Adjusted R-squared: 0.9566
## F-statistic: 2.34e+04 on 1 and 1061 DF, p-value: < 2.2e-16

#Modelo de regresión potencial para machos


hoplias_machos <- subset(Hoplias_malabaricus, Sexo == "Macho")
fit2_machos <- lm(log(Pe) ~ log(Lt), data = hoplias_machos)
summary_fit2_machos <- summary(fit2_machos)
summary_fit2_machos

##
## Call:
## lm(formula = log(Pe) ~ log(Lt), data = hoplias_machos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.218672 -0.038689 0.000297 0.040132 0.270072
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.65546 0.09213 -50.53 <2e-16 ***
## log(Lt) 3.02603 0.02767 109.38 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.0606 on 554 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.9557, Adjusted R-squared: 0.9557
## F-statistic: 1.196e+04 on 1 and 554 DF, p-value: < 2.2e-16

#Modelo de regresión potencial para hembras


hoplias_hembras <- subset(Hoplias_malabaricus, Sexo == "Hembra")
fit2_hembras <- lm(log(Pe) ~ log(Lt), data = hoplias_hembras)
summary_fit2_hembras <- summary(fit2_hembras)
summary_fit2_hembras

##
## Call:
## lm(formula = log(Pe) ~ log(Lt), data = hoplias_hembras)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.207000 -0.041281 0.001633 0.042724 0.245638
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.86355 0.09773 -49.77 <2e-16 ***
## log(Lt) 3.08921 0.02918 105.86 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.06803 on 505 degrees of freedom
## Multiple R-squared: 0.9569, Adjusted R-squared: 0.9568
## F-statistic: 1.121e+04 on 1 and 505 DF, p-value: < 2.2e-16
##Estimación de párametros
intercept <- exp(coef(fit2)[1])
intercept

## (Intercept)
## 0.00847847

slope <- coef(fit2)[2]


std_error_slope <- summary_fit2$coefficients["log(Lt)", "Std. Error"]
std_error_slope

## [1] 0.02000777

##Tipo de crecimiento

#H0:β=3 (crecimiento isométrico)


#H1:β≠3 (cecimiento alométrico)

#Estadístico de prueba
#$t_{n-2}= \frac{b-β}{EE_b}$

t <- (3-slope)/std_error_slope

# Calcular el p-valor de dos colas


p_valor_dos_colas <- 2 * (1 - pt(abs(t), df = 2687))
p_valor_dos_colas

## log(Lt)
## 0.002360499

##Modelo logistico
#Grafica
ggplot(data = Hoplias_malabaricus, aes(x = Lt, y = Madurez)) +
geom_point()+ ggtitle(expression(paste("Relación entre Longitud Total y
Madurez en ", italic("Hoplias malabaricus"))))+theme_classic()
ggplot(data = Hoplias_malabaricus, aes(x = Lt, y = Madurez)) +
geom_point() +geom_smooth(method = "glm", method.args = list(family =
"binomial"), se = FALSE, color = "red")+ ggtitle("Modelo ajustado")
+theme_classic()

## `geom_smooth()` using formula = 'y ~ x'


##Modelo logistico de regresion
#Determinación de la talla media de madurez sexual
fit3 <- glm(Madurez~Lt, data = Hoplias_malabaricus, family = "binomial")
summary(fit3)

##
## Call:
## glm(formula = Madurez ~ Lt, family = "binomial", data =
Hoplias_malabaricus)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.4235 -0.9141 -0.6360 1.1377 2.3427
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -9.54751 0.80477 -11.86 <2e-16 ***
## Lt 0.31953 0.02808 11.38 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1422.2 on 1063 degrees of freedom
## Residual deviance: 1258.6 on 1062 degrees of freedom
## AIC: 1262.6
##
## Number of Fisher Scoring iterations: 3

#Modelo logístico para machos


hoplias_machos <- subset(Hoplias_malabaricus, Sexo == "Macho")
fit_machos <- glm(Madurez ~ Lt, data = hoplias_machos, family = "binomial")
summary(fit_machos)

##
## Call:
## glm(formula = Madurez ~ Lt, family = "binomial", data = hoplias_machos)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.2078 -0.7588 -0.5855 0.9324 2.2107
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -10.17299 1.23468 -8.239 < 2e-16 ***
## Lt 0.32182 0.04278 7.523 5.35e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 644.94 on 556 degrees of freedom
## Residual deviance: 576.87 on 555 degrees of freedom
## AIC: 580.87
##
## Number of Fisher Scoring iterations: 4

#Modelo logístico para hembras


hoplias_hembras <- subset(Hoplias_malabaricus, Sexo == "Hembra")
fit_hembras <- glm(Madurez ~ Lt, data = hoplias_hembras, family = "binomial")
summary(fit_hembras)

##
## Call:
## glm(formula = Madurez ~ Lt, family = "binomial", data = hoplias_hembras)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.1654 -1.0275 0.4423 1.0641 2.1100
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.94694 1.12229 -7.972 1.56e-15 ***
## Lt 0.31791 0.03949 8.051 8.20e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 701.62 on 506 degrees of freedom
## Residual deviance: 617.15 on 505 degrees of freedom
## AIC: 621.15
##
## Number of Fisher Scoring iterations: 3

p <- ggplot(Hoplias_malabaricus, aes(x = Lt, y = Madurez, color = Sexo)) +


geom_point() +
labs(x = "Longitud total (cm)", y = "Probabilidad de Madurez Sexual") +
theme_classic() +
ggtitle("Modelos Logísticos de Madurez Sexual por Sexo") +
geom_smooth(method = "glm", method.args = list(family = "binomial"), se =
FALSE) +
scale_color_manual(values = c("Macho" = "#87CEEB", "Hembra" = "#FF69B4"))
# Azul cielo y Rosa fuerte

## `geom_smooth()` using formula = 'y ~ x'

#Grafico modelo logístico para machos


hoplias_machos <- subset(Hoplias_malabaricus, Sexo == "Macho")
p_machos <- ggplot(hoplias_machos, aes(x = Lt, y = Madurez, color = Sexo)) +
geom_point() +
labs(x = "Longitud total (cm)", y = "Probabilidad de Madurez Sexual") +
theme_classic() +
ggtitle("Modelo Logístico de Madurez Sexual para Machos") +
geom_smooth(method = "glm", method.args = list(family = "binomial"), se =
FALSE) +
scale_color_manual(values = c("Macho" = "black"))
p_machos

## `geom_smooth()` using formula = 'y ~ x'

#Grafico modelo logístico para hembras


hoplias_hembras <- subset(Hoplias_malabaricus, Sexo == "Hembra")
p_hembras <- ggplot(hoplias_hembras, aes(x = Lt, y = Madurez, color = Sexo))
+
geom_point() +
labs(x = "Longitud total (cm)", y = "Probabilidad de Madurez Sexual") +
theme_classic() +
ggtitle("Modelo Logístico de Madurez Sexual para Hembras") +
geom_smooth(method = "glm", method.args = list(family = "binomial"), se =
FALSE) +
scale_color_manual(values = c("Hembra" = "black"))
p_hembras

## `geom_smooth()` using formula = 'y ~ x'


# Longitud total del individuo
longitud_total <- 20 # Reemplaza con la longitud total del individuo que
deseas evaluar

# Calcula el log(odds)
log_odds <- -9.54751 + 0.31953 * longitud_total

# Convierte log(odds) a probabilidad


probabilidad_madurez <- plogis(log_odds)

# Establece un umbral (por ejemplo, 0.5) para clasificar la madurez


umbral <- 1

# Determina si el individuo es maduro o no


if (probabilidad_madurez > umbral) {
cat("El individuo es clasificado como maduro.\n")
} else {
cat("El individuo no es clasificado como maduro.\n")
}

## El individuo no es clasificado como maduro.

# Carga de bibliotecas
library(ggplot2)

# Definición del modelo


modelo_logistico <- function(x) {
plogis(-9.54751 + 0.31953 * x)
}

# Datos
longitudes <- seq(0, 50, by = 1) # Cambia según el rango de tus datos
probabilidades <- modelo_logistico(longitudes)

# Crear un marco de datos


df <- data.frame(Longitud_Total = longitudes, Prob_Madurez = probabilidades)

# Gráfico
ggplot(df, aes(x = Longitud_Total, y = Prob_Madurez)) +
geom_line(color = "blue", size = 1) +
geom_hline(yintercept = 1 , linetype = "dashed", color = "red") +
labs(x = "Longitud Total", y = "Probabilidad de Madurez") +
ggtitle("Relación entre Longitud Total y Probabilidad de Madurez") +
theme_minimal()

## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.

También podría gustarte