Variable cuantitativa continua

El error de profundidad muestra la incertidumbre sobre cuán profundo ocurrió el hipocentro expresado en kilómetros.

Buscamos el directorio de trabajo y cargamos nuestros datos.

datos <- read.csv("C:/Users/HP/Desktop/Proyecto Sismos de la India/Earthquakes.csv", sep=";")
str(datos)
## 'data.frame':    17805 obs. of  22 variables:
##  $ time           : chr  "2024-10-31T01:32:40.503Z" "2024-10-30T23:51:31.217Z" "2024-10-29T02:35:27.930Z" "2024-10-28T13:08:40.107Z" ...
##  $ latitude       : num  298.6 282.1 47.2 278.7 327.5 ...
##  $ longitude      : chr  "92.247" "670.879" "962.377" "940.243" ...
##  $ depth          : num  10 10 42.1 36.3 10 ...
##  $ mag            : num  4.4 4.3 4.6 4.6 4 4.6 4.7 4.3 5.3 4.4 ...
##  $ magType        : chr  "mb" "mb" "mb" "mb" ...
##  $ nst            : int  35 36 27 62 22 44 39 34 80 27 ...
##  $ gap            : num  89 195 91 98 79 170 169 105 65 140 ...
##  $ dmin           : num  6.45 9.37 0.87 6.69 6.64 ...
##  $ rms            : num  0.82 0.72 0.55 0.65 0.72 0.74 0.81 0.54 0.92 0.9 ...
##  $ net            : chr  "us" "us" "us" "us" ...
##  $ id             : chr  "us7000np4h" "us7000np47" "us7000nnqs" "us7000nnml" ...
##  $ updated        : chr  "2024-10-31T01:54:50.040Z" "2024-10-31T00:07:19.040Z" "2024-10-29T03:36:02.040Z" "2024-10-29T04:19:35.951Z" ...
##  $ place          : chr  "113 km ENE of Lhasa, China" "64 km NE of Khuzdar, Pakistan" "55 km S of Reuleuet, Indonesia" "35 km NNE of Ziro, India" ...
##  $ type           : chr  "earthquake" "earthquake" "earthquake" "earthquake" ...
##  $ horizontalError: num  7.45 12.2 5.1 8.9 9.39 ...
##  $ depthError     : num  1.88 1.99 8.27 7.33 1.98 ...
##  $ magError       : num  0.114 0.092 0.146 0.078 0.139 0.078 0.097 0.107 0.11 0.102 ...
##  $ magNst         : int  22 33 14 49 14 49 32 25 8 28 ...
##  $ status         : chr  "reviewed" "reviewed" "reviewed" "reviewed" ...
##  $ locationSource : chr  "us" "us" "us" "us" ...
##  $ magSource      : chr  "us" "us" "us" "us" ...

Con este código, limpiamos la variable “depthError”, eliminando los valores nulos para poder analizar solo los datos válidos.

ErrorProfundidad <- datos$depthError
valoresnulos <- is.na(ErrorProfundidad)
ErrorProfundidadomitida <- na.omit(ErrorProfundidad)
n<-length(ErrorProfundidadomitida)
n
## [1] 8777

Ahora, pasamos de la muestra a la población mediante modelos de probabilidad. Como punto de partida, se plantea una conjetura sobre el modelo. A simple vista, se observa que la distribución de la variable sigue un comportamiento exponencial; por lo tanto, se construye el modelo y se sobrepone al histograma.

histograma<-hist(ErrorProfundidad,freq = FALSE,main="Gráfica 1.Modelo de probabilidad exponencial",
                 xlab="ErrorProfundidad (Km)",ylab="Densidad de probabilidad",col="red")

Nota importante: Para visualizar mejor el modelo en la gráfica, se resta el valor mínimo a los datos, haciendo que el eje inicie en cero; no obstante, al realizar las estimaciones, es necesario volver a sumar dicho valor para obtener resultados reales.

ErrorProfundidad <- na.omit(ErrorProfundidad)
ErrorProfundidad <- ErrorProfundidad[ErrorProfundidad > 0]

if (length(ErrorProfundidad) > 0) {
  histograma <- hist(ErrorProfundidad, freq = FALSE, main = "Gráfica 1.Modelo de probabilidad exponencial",
                     xlab = "ErrorProfundidad", ylab = "Densidad de probabilidad", col = "red")
  
  lambda <- 1 / mean(ErrorProfundidad)
  x <- seq(0, max(ErrorProfundidad), 0.001)
  y <- dexp(x, lambda)
  lines(x, y, col = "skyblue3", lwd = 3)
} else {
  cat("No hay datos válidos.\n")
}

Una vez observado el modelo, aplicamos las pruebas de chi-cuadrado y de Pearson para evaluarlo de manera eficaz.

#Frecuencia simple observada
Fo<-histograma$counts
Fo
##  [1] 4129 2511  855  476  282  136   73   46   34   30   16   10    4    3    5
length(Fo)
## [1] 15
#Frecuencia simple esperada
P<-c(0)
for (i in 1:15) {
  P[i] <-(pexp(histograma$breaks[i+1],lambda)-
            pexp(histograma$breaks[i],lambda))
}
P
##  [1] 4.802125e-01 2.496085e-01 1.297434e-01 6.743898e-02 3.505394e-02
##  [6] 1.822060e-02 9.470840e-03 4.922824e-03 2.558823e-03 1.330044e-03
## [11] 6.913403e-04 3.593500e-04 1.867857e-04 9.708886e-05 5.046558e-05
Fe<-P*length(ErrorProfundidad)
sum(Fe)
## [1] 8609.53

Test de Pearson

El test de Pearson se utiliza para determinar si una distribución teórica se ajusta adecuadamente a los datos observados, comparando las frecuencias observadas con las esperadas; si la diferencia es pequeña, se considera que el modelo es adecuado, mientras que una diferencia grande indica un mal ajuste.

plot(Fo,Fe, main="Gráfica 2.Correlación de las frecuencias del modelo exponencial",col="skyblue3",
     xlab = "Frecuencia Observada",ylab="Frecuencia Esperada")
abline(lm(Fe ~ Fo), col="red",lwd=2)

Correlación<-cor(Fo,Fe)*100
Correlación
## [1] 99.47514

Test de Chi-Cuadrado

El test de chi-cuadrado de bondad de ajuste se utiliza para evaluar si una variable categórica sigue una distribución teórica específica, comparando las frecuencias observadas con las esperadas. Permite determinar si las diferencias entre ambas son significativas o se deben al azar. Si el valor del estadístico es bajo, el modelo se considera adecuado; si es alto, se rechaza la hipótesis del buen ajuste.

#Grados de libertad
grados_libertad <- length(histograma$counts)-1
grados_libertad
## [1] 14
# Nivel de significancia
nivel_significancia <- 0.05


#Frecuencia Observada porcentual
Fo<-(histograma$counts/n)*100
Fo
##  [1] 47.04340891 28.60886408  9.74136949  5.42326535  3.21294292  1.54950439
##  [7]  0.83171927  0.52409707  0.38737610  0.34180244  0.18229463  0.11393415
## [13]  0.04557366  0.03418024  0.05696707
sum(Fo)
## [1] 98.0973
#Frecuencia esperada
Fe<-P*100
Fe
##  [1] 48.021248809 24.960845437 12.974335745  6.743897696  3.505393804
##  [6]  1.822059924  0.947083994  0.492282433  0.255882261  0.133004404
## [11]  0.069134028  0.035935004  0.018678567  0.009708886  0.005046558
sum(Fe)
## [1] 99.99454
x2<-sum((Fe-Fo)^2/Fe)
x2
## [1] 3.083019

Calculamos el umbral de aceptación

umbral_aceptacion <- qchisq(1 - nivel_significancia, grados_libertad)
umbral_aceptacion
## [1] 23.68479
x2<umbral_aceptacion
## [1] TRUE

Resumen test de bondad

library(knitr)
Variable<-c("ErrorProfundidad")
tabla_resumen<-data.frame(Variable,round(Correlación,2),round(x2,2),round(umbral_aceptacion,2))
colnames(tabla_resumen)<-c("Variable","Test Pearson (%)","Chi Cuadrado","Umbral de aceptación")
kable(tabla_resumen, format = "markdown", caption = "Tabla 1.Resumen de test de bondad al modelo de probabilidad")
## Warning in attr(x, "align"): 'xfun::attr()' está en desuso.
## Utilizar 'xfun::attr2()' en su lugar.
## Ver help("Deprecated")
## Warning in attr(x, "format"): 'xfun::attr()' está en desuso.
## Utilizar 'xfun::attr2()' en su lugar.
## Ver help("Deprecated")
Tabla 1.Resumen de test de bondad al modelo de probabilidad
Variable Test Pearson (%) Chi Cuadrado Umbral de aceptación
ErrorProfundidad 99.48 3.08 23.68

Teorema de límite central

El teorema del límite central establece que, si se toman muchas muestras aleatorias de una población (con cualquier distribución) y se calcula su media, la distribución de esas medias tenderá a ser normal (gaussiana) conforme el tamaño de la muestra sea suficientemente grande (n ≥ 30).

Esto permite aplicar métodos estadísticos basados en la distribución normal incluso cuando la población original no lo sea.

#TEOREMA DE LIMITE CENTRAL
x<-mean(ErrorProfundidad)
x
## [1] 7.641344
sigma<-sd(ErrorProfundidad)
sigma
## [1] 8.192886
e<-sigma/sqrt(n)
e
## [1] 0.08745081
li<-x-2*e
li
## [1] 7.466442
ls<-x+2*e
ls
## [1] 7.816245
tabla_media<-data.frame(round(li,2),Variable,round(ls,2),e)
colnames(tabla_media)<-c("Limite superior","Media poblacional","Límite superior", "Desviación estándar poblacional")
library(knitr)
kable(tabla_media, format = "markdown", caption = "Tabla 5. Media poblacional")
## Warning in attr(x, "align"): 'xfun::attr()' está en desuso.
## Utilizar 'xfun::attr2()' en su lugar.
## Ver help("Deprecated")
## Warning in attr(x, "format"): 'xfun::attr()' está en desuso.
## Utilizar 'xfun::attr2()' en su lugar.
## Ver help("Deprecated")
Tabla 5. Media poblacional
Limite superior Media poblacional Límite superior Desviación estándar poblacional
7.47 ErrorProfundidad 7.82 0.0874508