Examen Parcial 1
Utilizando la información correspondiente a los sismos registrados por el Sistema Sismológico Nacional (SSN) 1 en el periodo 01-01-1980 al 24-09-2021, calcular:
Para la lectura de la tabla debido a que en los primeros renglones contiene información de fuente, se tiene que especificar que los datos empiezan después de 4 renglones. Así mismo, en los últimos renglones quedan valores sin información (NA) por lo se usa la función na.omit
SSN<- read.csv(file = "SSNMX_catalogo_19800101_20210924.csv",skip =4, header = TRUE)
SSN <- na.omit(SSN)
Revisamos las dimensiones resultantes y los encabezados y el primer renglón con información para conocer más de la estructura de la base de datos
dim(SSN)
## [1] 226764 10
SSN[1,]
## Fecha Hora Magnitud Latitud Longitud Profundidad
## 1 1980-01-01 04:12:00 no calculable 16.98 -102.33 33.0
## Referencia.de.localizacion Fecha.UTC Hora.UTC Estatus
## 1 109 km al SUR de CD LAZARO CARDENAS, MICH 1980-01-01 10:12:00 revisado
Para saber la cantidad de sismos ocurridos cada mes primero se necesita transformar la columna que contiene la información necesaria a un formato de fecha, así mismo con la paquetería lubridate se crea una nueva columna con únicamente el mes
SSN$Fecha<-as.Date(SSN$Fecha, format="%Y-%m-%d")
SSN$Mes<-lubridate::month(SSN$Fecha, label=TRUE)
Con la función summarise del paquete dplyr se crea un nuevo data frame con la información agrupada por mes.
sismos_mens<- summarise(group_by(SSN, Mes),"Total de sismos" = n())
kbl(sismos_mens) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Mes | Total de sismos |
|---|---|
| ene | 21195 |
| feb | 20644 |
| mar | 19155 |
| abr | 17959 |
| may | 17807 |
| jun | 18129 |
| jul | 17633 |
| ago | 17827 |
| sep | 21497 |
| oct | 18254 |
| nov | 18094 |
| dic | 18570 |
Si se observa la columna de localización contiene más información además de la entidad. La estructura de la información es número de kilometros y dirección hacia algún centro de población y el nombre de la entidad abreviada, separado por una coma. Ejemplo: (109 km al SUR de CD LAZARO CARDENAS, MICH) Con la función str_match y el uso de expresiones regulares se puede indicar que lo que este después de la coma en la columna de Referencia.de.localizacion, sea almacenado en una nueva columna llamada Entidad
SSN$Entidad<-str_match(SSN$Referencia.de.localizacion, ',\\s(\\w+)')[,2]
SSN[1,]
## Fecha Hora Magnitud Latitud Longitud Profundidad
## 1 1980-01-01 04:12:00 no calculable 16.98 -102.33 33.0
## Referencia.de.localizacion Fecha.UTC Hora.UTC Estatus Mes
## 1 109 km al SUR de CD LAZARO CARDENAS, MICH 1980-01-01 10:12:00 revisado ene
## Entidad
## 1 MICH
Tal como se realizo en el inciso pasado, se crea un nuevo data frame con la información agrupada
sismos_ent<- summarise(group_by(SSN, Entidad),num = n())
sismos_ent<- sismos_ent[order(sismos_ent$num,decreasing = TRUE),]
Si se observa, resultan 33 renglones pues hay 3 sismos clasificados en N. Si filtramos la base de datos original para identificar los tres registros con entidad N se observa que corresponden a sismos ocurridos en el municipio de San Nicolas de los Garza, es decir en la Entidad de Nuevlo León(NL) por lo que se modificarán estos registros y se harpa nuevamente la base de datos
filter(SSN, Entidad%in%"N")[,7:12]
## Referencia.de.localizacion Fecha.UTC Hora.UTC Estatus
## 1 2 km al NORESTE de CD S NICOLAS DE LOS GARZA, N 2021-02-06 00:36:19 revisado
## 2 2 km al NORESTE de CD S NICOLAS DE LOS GARZA, N 2021-02-06 03:24:13 revisado
## 3 2 km al NORESTE de CD S NICOLAS DE LOS GARZA, N 2021-02-06 23:33:52 revisado
## Mes Entidad
## 1 feb N
## 2 feb N
## 3 feb N
SSN$Entidad[SSN$Entidad%in%"N"] <- "NL"
sismos_ent2<- summarise(group_by(SSN, Entidad),"Total de sismos" = n())
sismos_ent2<- sismos_ent2[order(sismos_ent2$`Total de sismos`,decreasing = TRUE),]
kbl(sismos_ent2) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Entidad | Total de sismos |
|---|---|
| OAX | 94592 |
| CHIS | 42913 |
| GRO | 39249 |
| MICH | 13979 |
| BC | 8170 |
| JAL | 6832 |
| COL | 5288 |
| VER | 5159 |
| BCS | 2846 |
| SON | 1309 |
| PUE | 1130 |
| SIN | 920 |
| MEX | 583 |
| HGO | 548 |
| TAB | 530 |
| NL | 423 |
| CHIH | 400 |
| CDMX | 285 |
| NAY | 263 |
| MOR | 233 |
| ZAC | 228 |
| SLP | 189 |
| TLAX | 120 |
| TAMS | 115 |
| COAH | 109 |
| QR | 86 |
| GTO | 82 |
| CAMP | 62 |
| DGO | 61 |
| AGS | 42 |
| QRO | 15 |
| YUC | 3 |
Para este inciso primero se crea una columna en formato de tiempo para después con lubridate extraer unicamente la hora y almacernarla en otra columna
SSN$Hr24<-strptime(SSN$Hora,format = "%X" )
SSN$Hr24num<-lubridate::hour(SSN$Hr24)
Ahora se resume la tabla por hora
sismos_hora<- summarise(group_by(SSN, Hr24num),Frecuencia = n())
sismos_hora
## # A tibble: 24 x 2
## Hr24num Frecuencia
## <int> <int>
## 1 0 10814
## 2 1 10322
## 3 2 10548
## 4 3 10310
## 5 4 10687
## 6 5 10551
## 7 6 9903
## 8 7 8882
## 9 8 8650
## 10 9 8622
## # ... with 14 more rows
Y con la librería ggplot2 se realiza un histograma de frecuencia pero con coordenadas polares
ggplot(sismos_hora, aes(x=Hr24num, y=Frecuencia,yend=max(Frecuencia))) +
geom_bar(stat = "identity", fill="#104e8b90", col="gray") +
labs(x="", y="") +
scale_y_continuous(limits = c(0,11000),
breaks = seq(0,11000,1000)) +
scale_x_continuous(breaks = c(0:23))+
coord_polar() +
theme_minimal() +
labs(title = "Frecuencia de ocurrencia de sismos según hora del día", subtitle = "desde 01-01-1980 a 24-09-2021")
Primero se crea una nueva columna que contenga los valores de magnitud de cada sismo en formato númerico para poder hacer el filtro de mayores de 5 grados y solamente extraer las 5 entidades con más sismos registrados
SSN$magnnum<-as.numeric(SSN$Magnitud)
## Warning: NAs introducidos por coerción
magnmas5<-filter(SSN,magnnum>= 5)
sismos_ent_mas5<- summarise(group_by(magnmas5, Entidad),"Total de sismos" = n())
sismos_ent_mas5<- sismos_ent_mas5[order(sismos_ent_mas5$`Total de sismos`,decreasing = TRUE),]
topsismos_ent_mas5<- sismos_ent_mas5[1:5,]
kbl(topsismos_ent_mas5) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Entidad | Total de sismos |
|---|---|
| CHIS | 499 |
| OAX | 272 |
| GRO | 185 |
| BCS | 115 |
| JAL | 105 |
Se realiza el filtro de los sismos ocurridos en Chiapas y con la columna previamente creada se crea un histograma de frecuencias de magnitud
sismos_CHIS<-filter(SSN, Entidad %in% "CHIS")
magn_sism_CHIS<- summarise(group_by(sismos_CHIS, magnnum),"Total de sismos" = n())
ggplot(magn_sism_CHIS, aes(x=magnnum, y=`Total de sismos`,yend=max(magn_sism_CHIS$`Total de sismos`))) +
geom_bar(stat = "identity", fill="#104e8b90", col="gray") +
labs(x="Magnitud", y="Número de sismos")+
scale_x_continuous(breaks = c(0:10))+
theme_minimal()+
labs(title = "Histograma de magnitud de sismos detectados en Chiapas", subtitle = "desde 01-01-1980 a 24-09-2021")
## Warning: Use of `magn_sism_CHIS$`Total de sismos`` is discouraged. Use `Total de
## sismos` instead.
## Warning: Removed 1 rows containing missing values (position_stack).
El método más común para la determinaciómn de la aproximación estadísticamente óptima con un conjunto de parámetros dado un grupo de datos, es el método conocido como Mínimos Cuadrados (por sus siglas en inglés, LS), y fue propuesto hace aproximadamente dos siglos por Carl Friedrich Gauss. Así, en el caso más simple de la regresión lineal \((y = b_0 +b_1X)\), se busca minimizar la suma de cuadrados en el vector de residuales \(e\).
En ese sentido el vector de estimaciones puntuales de los parámetros $$ (ó b) es: \[\beta =(X^TX)^{-1}X^Ty\] Utilizando los datos de la base de datos llamada corazon, obtener el vector de estimaciones puntuales para los parámetros b cuando X = matriz de variables biking y smoking (498 x 2) y, y = hear.disease (498 x 1).
Se carga la base de datos tal y como está para partir de ella crear las otras dos matrices que en este momento serán almacenadas como data frames para facilitar su manipulación
corazon<- read.csv(file = "corazon.csv", header = TRUE)
equis<-corazon[,1:2]
ye<-as.data.frame(corazon[,3])
names(ye)=("hear.disease")
Se revisa que ambas matrices tengan las dimensiones especificadas
dim(equis)
## [1] 498 2
dim(ye)
## [1] 498 1
Para la matriz equis se debe generar una nueva columna con unos (1) que con la función subset será desplazada al inicio del data frame
equis$unos<-1
equis <- subset(equis, select=c("unos","biking","smoking"))
equis[1:5,]
## unos biking smoking
## 1 1 30.801246 10.896608
## 2 1 65.129215 2.219563
## 3 1 1.959665 17.588331
## 4 1 44.800196 2.802559
## 5 1 69.428454 15.974505
Como siguiente paso se transforma la “matriz” equis, que hasta ahora había sido un data frame, a un objeto matrix para así posteriormente transponerla, en este caso se hace con la función t y se almacenarla en una nueva variable
equis<-as.matrix(equis)
equis_t<-t(equis)
Ahora se debe multiplicar la matriz transpuesta por la matriz original
equis_t_equis<-(equis_t%*%equis)
equis_t_equis
## unos biking smoking
## unos 498.000 18818.63 7686.647
## biking 18818.629 940469.53 291805.827
## smoking 7686.647 291805.83 152799.206
Para calcular la inversa se esta matriz se usa la función solve
inv_equis_t_equis<-solve(a=equis_t_equis)
Ya que, segun la formula, esto se debe multiplicar por el producto de equis transpuesta y la matriz ye, se realizará esta operación
ye<-as.matrix(ye)
equis_t_ye<-equis_t%*%ye
Finalmente, para obtener la estimación de Beta se multiplican la matriz inversa de equis transpuesta por equis \((X^TX)^{-1}\) por la matriz equis transpuesta por ye \(X^Ty\)
est_beta<-inv_equis_t_equis%*%equis_t_ye
est_beta
## hear.disease
## unos 14.9846580
## biking -0.2001331
## smoking 0.1783339
Para comprobar el reusltadoi, se usará la función Fitting Linear Models lm que tiene R.
est_r<-lm(data = corazon, heart.disease ~ biking + smoking)
est_r
##
## Call:
## lm(formula = heart.disease ~ biking + smoking, data = corazon)
##
## Coefficients:
## (Intercept) biking smoking
## 14.9847 -0.2001 0.1783
Mostrando que ambos resultados coinciden
Mejoramiento del formato del reporte Markdown * Logo
* Dos tipografías y dos colores diferentes
* Índice
* Background
* Nota al pie de página
* Tablas con librería Kabble
* Gráficas con librería ggplot
México. Universidad Nacional Autónoma de México, I. d. G., Servicio Sismológico Nacional. (2021). Catálogo de sismos. Extraído de http://www2.ssn.unam.mx:8080/catalogo/↩︎