Carga (o instala primero y luego carga) el paquete UsingR
# Instalar el paquete si no está instalado
if (!require(UsingR)) {
install.packages("UsingR")
library(UsingR)
} else {
library(UsingR)
}
## Loading required package: UsingR
## Loading required package: MASS
## Loading required package: HistData
## Loading required package: Hmisc
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:base':
##
## format.pval, units
# Verificar los conjuntos de datos disponibles en el paquete
data(package = "UsingR")
A). ¿Cuantos conjuntos de datos de trabajo contiene el paquete?
datos_disponibles=data(package = "UsingR")
# Contar el número de conjuntos de datos
numero_de_datos=nrow(datos_disponibles$results)
numero_de_datos
## [1] 123
B). Representa gráficamente los datos contenidos en los conjuntos de datos (“datasets”) bumpers, firstchi, math con un histograma y/o un boxplot.
# Asegurarse de que los datos están disponibles
data("bumpers")
data("firstchi")
data("math")
# Histograma para el conjunto de datos 'bumpers' (vector)
hist(bumpers, main = "Histograma de Bumpers", xlab = "Valores", col = "blue")
# Histograma para el conjunto de datos 'firstchi' (vector)
hist(firstchi, main = "Histograma de Firstchi", xlab = "Valores", col = "red")
# Verificar si 'math' es un vector o un dataframe y hacer el histograma apropiado
if (is.vector(math)) {
hist(math, main = "Histograma de Math", xlab = "Valores", col = "green")
} else if (is.data.frame(math)) {
# Asumiendo que 'SAT' es una columna del dataframe, si no es así ajustar según la columna correcta
hist(math$SAT, main = "Histograma de Puntajes SAT de Math", xlab = "Puntaje SAT", col = "green")
}
C). Estima visualmente las medias, medianas y desviaciones estándar de cada conjunto de datos y a continuación calcula los valores anteriores con las funciones adecuadas. ¿Qué gráfico resulta de mayor ayuda para la aproximación?
# Generar histogramas para visualización
par(mfrow = c(1, 3)) # Organiza los plots en una fila de tres columnas
# Histograma para 'bumpers'
hist(bumpers, main = "Histograma de Bumpers", xlab = "Valores", col = "blue", breaks = 30)
abline(v = mean(bumpers), col = "red", lwd = 2)
abline(v = median(bumpers), col = "green", lwd = 2)
# Histograma para 'firstchi'
hist(firstchi, main = "Histograma de Firstchi", xlab = "Valores", col = "red", breaks = 30)
abline(v = mean(firstchi), col = "red", lwd = 2)
abline(v = median(firstchi), col = "green", lwd = 2)
# Histograma para 'math'
hist(math, main = "Histograma de Math", xlab = "Valores", col = "green", breaks = 30)
abline(v = mean(math), col = "red", lwd = 2)
abline(v = median(math), col = "green", lwd = 2)
# Restaurar configuración gráfica
par(mfrow = c(1, 1))
# Calcular y mostrar medidas estadísticas
medidas=data.frame(
Dataset = c("bumpers", "firstchi", "math"),
Mean = c(mean(bumpers), mean(firstchi), mean(math)),
Median = c(median(bumpers), median(firstchi), median(math)),
SD = c(sd(bumpers), sd(firstchi), sd(math))
)
print(medidas)
## Dataset Mean Median SD
## 1 bumpers 2122.47826 2129 798.457369
## 2 firstchi 23.97701 23 6.254258
## 3 math 54.90000 54 9.746264
Histograma de Bumpers (Azul) Media: Estimada por la posición promedio de los datos, parece estar alrededor de 1500-2000. Mediana: La mediana parecería estar ligeramente a la derecha de la media, posiblemente cercana a 2000, indicando una distribución ligeramente sesgada a la derecha. Desviación Estándar: Los datos parecen estar bastante dispersos, lo que sugiere una desviación estándar relativamente alta.
Histograma de Firstchi (Rojo) Media: La media parece estar cerca del pico más alto, aproximadamente en el rango de 15-20. Mediana: Debido al sesgo a la derecha, la mediana puede estar ligeramente a la izquierda de la media, tal vez alrededor de 17-18. Desviación Estándar: La distribución es más estrecha que la de bumpers, por lo que la desviación estándar sería menor.
Histograma de Math (Verde) Media: Dada la distribución bimodal, la media estaría en algún punto medio entre los dos picos, quizás alrededor de 55. Mediana: Es difícil estimar visualmente en una distribución bimodal, pero también estaría entre los dos picos, potencialmente cercana a la media. Desviación Estándar: Habría una mayor desviación estándar debido a la distribución bimodal, con un rango amplio entre los dos picos.
¿Qué gráfico ayuda más para la aproximación? El histograma de Firstchi parece ser el más útil para las aproximaciones, ya que su forma es más regular y simétrica, facilitando la estimación visual de la media y la mediana. La distribución bimodal de Math y la amplia dispersión de Bumpers hacen que las estimaciones visuales sean más complicadas.
El conjunto de datos brightness contiene información sobre el brillo de 963 estrellas.
A). Representa estos datos mediante un histograma y un gráfico de densidad superpuesto.
# Cargar los datos del conjunto 'brightness'
data("brightness")
# Crear un histograma con una densidad superpuesta
hist(brightness, freq = FALSE, main = "Histograma con Densidad de Brightness",
xlab = "Brillo", ylab = "Densidad", col = "lightblue", border = "darkblue")
# Superponer el gráfico de densidad
lines(density(brightness), col = "red", lwd = 2)
B). Representa gráficamente estos datos mediante un diagrama de caja (boxplot). ¿Dirias que los datos presentan “outliers”? Cuál es el segundo menor outlier?
# Crear un diagrama de caja para los datos de brillo
boxplot(brightness, main = "Boxplot de Brightness", ylab = "Brillo")
# Calcular los outliers
outliers <- boxplot.stats(brightness)$out # boxplot.stats() devuelve una lista que incluye los outliers
# Asegurarte de que hay suficientes outliers para buscar el segundo menor
if (length(outliers) > 1) {
sorted_outliers <- sort(outliers)
second_smallest_outlier <- sorted_outliers[2] # El segundo outlier después de ordenar
} else {
second_smallest_outlier <- NA # No aplicable si no hay suficientes outliers
}
# Imprimir el segundo menor outlier
second_smallest_outlier
## [1] 2.28
Efectivamente hay muchos outliers tanto arriba como abajo.
C). Deseamos conservar los datos que de ninguna forma puedan ser considerados atípicos. Crea una nueva variable denominada brightness.sin que contenga tan solo los valores que se encuentren por encima de la primera bisagra y por debajo de la cuarta.
# Calcular Q1, Q3 y IQR
Q1=quantile(brightness, 0.25)
Q3=quantile(brightness, 0.75)
IQR=Q3 - Q1
# Filtrar los valores que no son atípicos
brightness.sin=brightness[brightness > (Q1 - 1.5 * IQR) & brightness < (Q3 + 1.5 * IQR)]
# Filtrar los valores entre Q1 y Q3
brightness.sin=brightness[brightness > Q1 & brightness < Q3]
# Calcular Q1 y Q3
Q1=quantile(brightness, 0.25)
Q3=quantile(brightness, 0.75)
# Filtrar los valores entre Q1 y Q3
brightness.sin=brightness[brightness > Q1 & brightness < Q3]
El paquete MASS contiene la base de datos UScereal con información relativa a desayunos con cereales.
A). ¿Cuál es el tipo de datos de cada variable?
# Cargar el paquete MASS si no ha sido cargado previamente
library(MASS)
# Cargar los datos de UScereal
data("UScereal")
# Obtener la estructura de la base de datos UScereal para ver el tipo de datos de cada variable
str(UScereal)
## 'data.frame': 65 obs. of 11 variables:
## $ mfr : Factor w/ 6 levels "G","K","N","P",..: 3 2 2 1 2 1 6 4 5 1 ...
## $ calories : num 212 212 100 147 110 ...
## $ protein : num 12.12 12.12 8 2.67 2 ...
## $ fat : num 3.03 3.03 0 2.67 0 ...
## $ sodium : num 394 788 280 240 125 ...
## $ fibre : num 30.3 27.3 28 2 1 ...
## $ carbo : num 15.2 21.2 16 14 11 ...
## $ sugars : num 18.2 15.2 0 13.3 14 ...
## $ shelf : int 3 3 3 1 2 3 1 3 2 1 ...
## $ potassium: num 848.5 969.7 660 93.3 30 ...
## $ vitamins : Factor w/ 3 levels "100%","enriched",..: 2 2 2 2 2 2 2 2 2 2 ...
B). Utiliza los datos de cereales para investigar algunas asociaciones entre sus variables:
# Tabla de contingencia
mfr_shelf_table=table(UScereal$mfr, UScereal$shelf)
# Test chi-cuadrado
chisq_test=chisq.test(mfr_shelf_table)
## Warning in chisq.test(mfr_shelf_table): Chi-squared approximation may be
## incorrect
# Gráfico de mosaico para visualizar la asociación
mosaicplot(mfr_shelf_table, main = "Mosaic Plot de mfr vs. shelf")
# Gráfico de caja
boxplot(UScereal$fat ~ UScereal$vitamins, main = "Boxplot de fat vs. vitamins")
# Gráfico de caja
boxplot(UScereal$fat ~ UScereal$shelf, main = "Boxplot de fat vs. shelf")
# Gráfico de dispersión
plot(UScereal$carbo, UScereal$sugars, main = "Scatterplot de carbohydrates vs. sugars")
cor(UScereal$carbo, UScereal$sugars, use = "complete.obs")
## [1] -0.04082599
# Gráfico de caja
boxplot(UScereal$fibre ~ UScereal$mfr, main = "Boxplot de fibre vs. mfr")
# Gráfico de dispersión
plot(UScereal$sodium, UScereal$sugars, main = "Scatterplot de sodium vs. sugars")
cor(UScereal$sodium, UScereal$sugars, use = "complete.obs")
## [1] 0.2112437
El conjunto de datos mammals contiene datos sobre la relación entre peso corporal y peso del cerebro.
# Cargar el conjunto de datos mammals
data("mammals")
# Verificar las columnas del conjunto de datos
names(mammals)
## [1] "body" "brain"
# Calcular la correlación de Pearson entre el peso corporal y el peso del cerebro
correlation <- cor(mammals$body, mammals$brain, use = "complete.obs") # Asegura manejo de NA
correlation
## [1] 0.9341638
B). Representa los datos mediante la instrucción plot
# Crear un gráfico de dispersión para el peso corporal vs. el peso del cerebro
plot(mammals$body, mammals$brain, main = "Relación entre Peso Corporal y Peso del Cerebro",
xlab = "Peso Corporal (kg)", ylab = "Peso del Cerebro (g)", pch = 19, col = "blue")
C). Transforma los datos mediante la función log y repite el estudio. ¿Cómo cambian los resultados?
# Aplicar transformación logarítmica a ambos pesos
log_body=log(mammals$body)
log_brain=log(mammals$brain)
# Calcular la correlación entre los logaritmos de las variables
correlation_log=cor(log_body, log_brain)
print(paste("Correlación entre log(body) y log(brain):", correlation_log))
## [1] "Correlación entre log(body) y log(brain): 0.95957475837098"
# Crear un gráfico de dispersión para los datos transformados
plot(log_body, log_brain, main = "Relación Logarítmica entre Peso Corporal y Peso del Cerebro",
xlab = "Logaritmo del Peso Corporal", ylab = "Logaritmo del Peso del Cerebro", pch = 19, col = "red")
Enlaza la base de datos emissions del paquete UsingR.
library(UsingR)
# Cargar el conjunto de datos emissions
data("emissions")
# Ver las primeras filas de los datos
head(emissions)
## GDP perCapita CO2
## UnitedStates 8083000 29647 6750
## Japan 3080000 24409 1320
## Germany 1740000 21197 1740
## France 1320000 22381 550
## UnitedKingdom 1242000 21010 675
## Italy 1240000 21856 540
# Resumen de los datos
summary(emissions)
## GDP perCapita CO2
## Min. : 59900 Min. : 2507 Min. : 54.0
## 1st Qu.: 123100 1st Qu.:13393 1st Qu.: 77.0
## Median : 206250 Median :20993 Median : 200.0
## Mean : 830427 Mean :17724 Mean : 669.4
## 3rd Qu.: 683500 3rd Qu.:22250 3rd Qu.: 547.5
## Max. :8083000 Max. :29647 Max. :6750.0
# Calcular las correlaciones entre GDP, perCapita y CO2
correlations=cor(emissions[c("GDP", "perCapita", "CO2")], use = "complete.obs")
print(correlations)
## GDP perCapita CO2
## GDP 1.0000000 0.4325303 0.9501753
## perCapita 0.4325303 1.0000000 0.2757962
## CO2 0.9501753 0.2757962 1.0000000
# Gráficos de dispersión
pairs(emissions[c("GDP", "perCapita", "CO2")], main = "Relaciones entre GDP, perCapita y CO2")
Relación entre GDP y CO2: Parece haber una relación positiva entre el GDP y las emisiones de CO2. Esto sugiere que a medida que aumenta el GDP de un país, también lo hacen sus emisiones de CO2. La relación no parece ser estrictamente lineal, ya que hay una mayor dispersión en las emisiones de CO2 a niveles más altos de GDP.
Relación entre perCapita y CO2: La relación entre el PIB per cápita y las emisiones de CO2 no es tan clara como la del GDP. Algunos países con alto PIB per cápita parecen tener emisiones de CO2 relativamente bajas, mientras que otros con un PIB per cápita similar tienen emisiones más altas. Esto podría indicar que otros factores, como la eficiencia energética, políticas ambientales y la mezcla de fuentes de energía, también juegan un papel importante.
Relación entre GDP y perCapita: La relación entre el GDP y el PIB per cápita no es evidente en la gráfica. Esto se debe a que son medidas de la economía que están intrínsecamente relacionadas, ya que el PIB per cápita es el GDP dividido por la población del país. No se esperaría necesariamente ver una tendencia clara al graficar una contra la otra.
B). Construye un modelo de regresión para predecir las emisiones de CO2 a partir de cada una de las variables.
# Modelo de regresión para CO2 basado en GDP
model_gdp=lm(CO2 ~ GDP, data = emissions)
summary(model_gdp)
##
## Call:
## lm(formula = CO2 ~ GDP, data = emissions)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1107.35 -81.47 -32.69 126.33 1438.79
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.043e+01 9.441e+01 0.216 0.83
## GDP 7.815e-04 5.233e-05 14.933 1.2e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 427.4 on 24 degrees of freedom
## Multiple R-squared: 0.9028, Adjusted R-squared: 0.8988
## F-statistic: 223 on 1 and 24 DF, p-value: 1.197e-13
# Modelo de regresión para CO2 basado en perCapita
model_perCapita=lm(CO2 ~ perCapita, data = emissions)
summary(model_perCapita)
##
## Call:
## lm(formula = CO2 ~ perCapita, data = emissions)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1088.4 -681.4 -317.7 80.5 5479.7
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -223.99167 686.10910 -0.326 0.747
## perCapita 0.05040 0.03586 1.406 0.173
##
## Residual standard error: 1318 on 24 degrees of freedom
## Multiple R-squared: 0.07606, Adjusted R-squared: 0.03757
## F-statistic: 1.976 on 1 and 24 DF, p-value: 0.1726
C). Identifica los outliers y prueba de ajustar el modelo de nuevo sin ellos.
# Ajustar el modelo de regresión lineal original
model_CO2=lm(CO2 ~ GDP + perCapita, data = emissions)
# Calcular residuos estandarizados y distancias de Cook
residuals_standardized=rstandard(model_CO2)
cooks_distances=cooks.distance(model_CO2)
# Identificar outliers como aquellos con un residuo estandarizado grande en valor absoluto
outliers=which(abs(residuals_standardized) > 2)
# Identificar puntos influyentes con base en las distancias de Cook
influential_points=which(cooks_distances > (4 / length(cooks_distances)))
# Combinar outliers e influential_points para identificar observaciones a excluir
observations_to_exclude=union(outliers, influential_points)
# Excluir los outliers e influentials del conjunto de datos
emissions_clean=emissions[-observations_to_exclude, ]
# Ajustar el modelo de nuevo sin los outliers
model_CO2_clean=lm(CO2 ~ GDP + perCapita, data = emissions_clean)
# Resumen del nuevo modelo
summary(model_CO2_clean)
##
## Call:
## lm(formula = CO2 ~ GDP + perCapita, data = emissions_clean)
##
## Residuals:
## Min 1Q Median 3Q Max
## -357.01 -72.86 -17.64 44.02 519.82
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.056e+02 1.123e+02 1.831 0.0821 .
## GDP 7.151e-04 8.823e-05 8.106 9.51e-08 ***
## perCapita -1.083e-02 6.385e-03 -1.697 0.1053
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 189.5 on 20 degrees of freedom
## Multiple R-squared: 0.7699, Adjusted R-squared: 0.7469
## F-statistic: 33.45 on 2 and 20 DF, p-value: 4.166e-07
La base de datos MASS posee la siguiente base de datos: “anorexia” que contiene el cambio de peso en pacientes femeninas la cual posee 72 filas y 3 columnas.
A).¿Que Tipo de tratamiento más efectivo?
# Cargar el paquete MASS si no ha sido cargado previamente
library(MASS)
# Cargar la base de datos anorexia
data("anorexia")
# Calcular el cambio de peso para cada paciente
anorexia$Change = with(anorexia, Postwt - Prewt)
# Usar ANOVA para comparar los cambios de peso entre los diferentes tipos de tratamiento
anova_model=aov(Change ~ Treat, data = anorexia)
summary(anova_model)
## Df Sum Sq Mean Sq F value Pr(>F)
## Treat 2 615 307.32 5.422 0.0065 **
## Residuals 69 3911 56.68
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Si hay diferencias significativas, realizar pruebas post hoc
if (summary(anova_model)[[1]]$'Pr(>F)'[1] < 0.05) {
post_hoc=TukeyHSD(anova_model)
print(post_hoc)
}
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Change ~ Treat, data = anorexia)
##
## $Treat
## diff lwr upr p adj
## Cont-CBT -3.456897 -8.327276 1.413483 0.2124428
## FT-CBT 4.257809 -1.250554 9.766173 0.1607461
## FT-Cont 7.714706 2.090124 13.339288 0.0045127
Basándonos en estos resultados, el tratamiento que combina FT (Familial Therapy) con Cont (Control) muestra una diferencia significativa en el aumento de peso comparado con Cont solo, siendo esta diferencia positiva y estadísticamente significativa. Esto sugiere que FT-Cont podría ser el tratamiento más efectivo entre los evaluados para incrementar el peso en pacientes con anorexia, según el conjunto de datos utilizado.
Estos resultados nos indican que el tratamiento combinado puede tener un impacto más positivo en los pacientes en comparación con los tratamientos individuales.
B). ¿Cuantos pacientes ganaron y cuantos perdieron peso?
# Calcula el cambio de peso para cada paciente
anorexia$Change = with(anorexia, Postwt - Prewt)
# Cuenta los que ganaron peso (cambio de peso positivo)
ganaron_peso=sum(anorexia$Change > 0)
# Cuenta los que perdieron peso (cambio de peso negativo)
perdieron_peso=sum(anorexia$Change < 0)
# Imprime los resultados
cat("Número de pacientes que ganaron peso:", ganaron_peso, "\n")
## Número de pacientes que ganaron peso: 42
cat("Número de pacientes que perdieron peso:", perdieron_peso, "\n")
## Número de pacientes que perdieron peso: 29
C). Grafique el punto b de forma adecuada
# Calcular el cambio de peso para cada paciente
anorexia$Change = with(anorexia, Postwt - Prewt)
# Clasificar los cambios de peso
anorexia$WeightChangeCategory=ifelse(anorexia$Change > 0, "Ganaron peso",
ifelse(anorexia$Change < 0, "Perdieron peso", "Sin cambios"))
# Contar las categorías de cambio de peso
weight_change_counts=table(anorexia$WeightChangeCategory)
# Gráfico de barras para mostrar el número de pacientes por categoría de cambio de peso
barplot(weight_change_counts, main = "Cambio de peso en pacientes con anorexia",
ylab = "Numero de pacientes", col = c("green", "red", "blue"),
legend.text = names(weight_change_counts))
La base de datos MASS posee la siguiente base de datos: “Melanoma” que contiene 205 pacientes con melanomas y 7 columnas.
A). Obtenga el número de fallecidos por Melanoma y otras causas.
# Cargar el paquete MASS si no ha sido cargado previamente
library(MASS)
# Cargar la base de datos Melanoma
data("Melanoma")
head(Melanoma)
## time status sex age year thickness ulcer
## 1 10 3 1 76 1972 6.76 1
## 2 30 3 1 56 1968 0.65 0
## 3 35 2 1 41 1977 1.34 0
## 4 99 3 0 71 1968 2.90 0
## 5 185 1 1 52 1965 12.08 1
## 6 204 1 1 28 1971 4.84 1
str(Melanoma)
## 'data.frame': 205 obs. of 7 variables:
## $ time : int 10 30 35 99 185 204 210 232 232 279 ...
## $ status : int 3 3 2 3 1 1 1 3 1 1 ...
## $ sex : int 1 1 1 0 1 1 1 0 1 0 ...
## $ age : int 76 56 41 71 52 28 77 60 49 68 ...
## $ year : int 1972 1968 1977 1968 1965 1971 1972 1974 1968 1971 ...
## $ thickness: num 6.76 0.65 1.34 2.9 12.08 ...
## $ ulcer : int 1 0 0 0 1 1 1 1 1 1 ...
# Contar el número de fallecidos por Melanoma
fallecidos_melanoma=sum(Melanoma$status == 1, na.rm = TRUE)
# Contar el número de fallecidos por otras causas
fallecidos_otras_causas=sum(Melanoma$status == 0, na.rm = TRUE)
# Imprimir los resultados
cat("Número de fallecidos por Melanoma:", fallecidos_melanoma, "\n")
## Número de fallecidos por Melanoma: 57
cat("Número de fallecidos por otras causas:", fallecidos_otras_causas, "\n")
## Número de fallecidos por otras causas: 0
B). Determine la presencia y ausencia de Melanoma
# Inspeccionar las columnas para entender su estructura y contenido
str(Melanoma)
## 'data.frame': 205 obs. of 7 variables:
## $ time : int 10 30 35 99 185 204 210 232 232 279 ...
## $ status : int 3 3 2 3 1 1 1 3 1 1 ...
## $ sex : int 1 1 1 0 1 1 1 0 1 0 ...
## $ age : int 76 56 41 71 52 28 77 60 49 68 ...
## $ year : int 1972 1968 1977 1968 1965 1971 1972 1974 1968 1971 ...
## $ thickness: num 6.76 0.65 1.34 2.9 12.08 ...
## $ ulcer : int 1 0 0 0 1 1 1 1 1 1 ...
# Contar presencia de muerte por melanoma (asumiendo que 'status = 1' significa muerte por melanoma)
muertes_por_melanoma = sum(Melanoma$status == 1, na.rm = TRUE)
# Contar supervivencia o muerte por otras causas (asumiendo que otros valores en 'status' representan supervivencia o otras causas)
otros_casos = sum(Melanoma$status != 1, na.rm = TRUE)
# Imprimir los resultados
cat("Número de muertes por Melanoma:", muertes_por_melanoma, "\n")
## Número de muertes por Melanoma: 57
cat("Número de casos de supervivencia o muerte por otras causas:", otros_casos, "\n")
## Número de casos de supervivencia o muerte por otras causas: 148
C). ¿Que Relación entre tamaño de tumor y muerte?
# Trama de dispersión del tamaño del tumor vs. muerte
plot(Melanoma$thickness, Melanoma$status,
xlab = "Tamaño del Tumor", ylab = "Estado (1: Muerte, 0: Supervivencia)",
main = "Relación entre Tamaño del Tumor y Estado")
# Calcular la correlación entre el tamaño del tumor y el estado (muerte)
correlation=cor(Melanoma$thickness, Melanoma$status)
# Imprimir la correlación
cat("Correlación entre el tamaño del tumor y el estado:", correlation, "\n")
## Correlación entre el tamaño del tumor y el estado: -0.2047216
D). Grafique el punto b de forma adecuada.
# Cargar el paquete MASS si no ha sido cargado previamente
library(MASS)
# Cargar la base de datos Melanoma
data("Melanoma")
# Tabla de estado
table_status=table(Melanoma$status)
# Gráfico de barras para mostrar el estado de los pacientes
barplot(table_status, main = "Estado de Pacientes con Melanoma",
ylab = "Número de Pacientes", xlab = "Estado",
col = c("green", "red", "blue"),
names.arg = c("Categoría 1", "Categoría 2", "Categoría 3"))
# Añadir una leyenda
legend("topright", legend = c("Categoría 1", "Categoría 2", "Categoría 3"), fill = c("green", "red", "blue"))
La base de datos UsingR posee la siguiente base de datos: “babyboom” que contiene la estadística de nacimiento de 44 bebes en un periodo de 24 horas con peso y sexo, con 4 columnas.
A). ¿Cual es el número de niños y niñas?
# Cargar el paquete UsingR si no ha sido cargado previamente
if (!require(UsingR)) {
install.packages("UsingR")
library(UsingR)
} else {
library(UsingR)
}
# Cargar la base de datos babyboom
data("babyboom")
# Contar el número de niñas y niños
niñas=sum(babyboom$gender == "girl") # Niñas son representadas como "girl"
niños=sum(babyboom$gender == "boy") # Niños son representados como "boy"
# Imprimir los resultados
cat("Número de niñas:", niñas, "\n")
## Número de niñas: 18
cat("Número de niños:", niños, "\n")
## Número de niños: 26
B). ¿Cual es la cantidad de niños nacidos en las primeras 12h?
# Filtrar para obtener solo los nacimientos en las primeras 12 horas
nacimientos_primeras_12h=babyboom[babyboom$clock.time <= 720 & babyboom$gender == "boy", ]
# Contar el número de niños nacidos en este período
niños_primeras_12h=nrow(nacimientos_primeras_12h)
# Imprimir el resultado
cat("Número de niños nacidos en las primeras 12 horas:", niños_primeras_12h, "\n")
## Número de niños nacidos en las primeras 12 horas: 6
C). ¿Cuantos niños nacieron por debajo de 3000gr?
# Filtrar para obtener solo los nacimientos de niños con peso inferior a 3000 gramos
nacimientos_bajo_peso=babyboom[babyboom$wt < 3000 & babyboom$gender == "boy", ]
# Contar el número de niños con peso inferior a 3000 gramos
niños_bajo_peso=nrow(nacimientos_bajo_peso)
# Imprimir el resultado
cat("Número de niños nacidos con un peso inferior a 3000 gramos:", niños_bajo_peso, "\n")
## Número de niños nacidos con un peso inferior a 3000 gramos: 4
D). ¿Relación entre peso por debajo de 3000gr y sexo?
# Crear una nueva variable para categorizar el peso
babyboom$weight_category =ifelse(babyboom$wt < 3000, "Below 3000g", "3000g or more")
# Crear la tabla de contingencia entre el peso y el sexo
weight_sex_table =table(babyboom$weight_category, babyboom$gender)
# Imprimir la tabla de contingencia
print(weight_sex_table)
##
## girl boy
## 3000g or more 13 22
## Below 3000g 5 4
# Realizar la prueba chi-cuadrado
chi_squared_test=chisq.test(weight_sex_table)
## Warning in chisq.test(weight_sex_table): Chi-squared approximation may be
## incorrect
# Imprimir los resultados de la prueba
print(chi_squared_test)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: weight_sex_table
## X-squared = 0.38681, df = 1, p-value = 0.534
La prueba de Chi-cuadrado realizada para evaluar la relación entre el peso por debajo de 3000 gramos y el sexo da como resultado un p-valor de 0.534. Este p-valor es bastante alto, lo que indica que no hay una diferencia estadísticamente significativa entre los sexos en términos de tener un peso de nacimiento bajo. Esto significa que, basándonos en estos datos, el sexo del bebé no parece influir en si nacen con un peso por debajo de 3000 gramos.
E). ¿Grafique el promedio de pesos total, de niños y de niñas de forma adecuada?
# Instalar y cargar ggplot2 para la visualización
if (!require(ggplot2)) {
install.packages("ggplot2")
library(ggplot2)
}
## Loading required package: ggplot2
# Calcular el promedio de peso total
average_weight_total=mean(babyboom$wt)
# Calcular el promedio de peso por género
average_weights_by_gender=aggregate(wt ~ gender, data = babyboom, mean)
# Crear un dataframe para el gráfico
weight_data=data.frame(
gender = c("Total", as.character(average_weights_by_gender$gender)),
weight = c(average_weight_total, average_weights_by_gender$wt)
)
# Gráfico de barras usando ggplot2
ggplot(weight_data, aes(x = gender, y = weight, fill = gender)) +
geom_bar(stat = "identity", width = 0.5, show.legend = FALSE) +
labs(title = "Promedio de Peso de Bebés por Género",
x = "Género",
y = "Peso Promedio (libras)") +
theme_minimal()
La base de datos UsingR posee la siguiente base de datos: “Aids2” que contiene la estadística de 2843 pacientes con sida con 4 columnas.
A). Determine en número de contagios por estado.
# Instalar y cargar el paquete UsingR si no ha sido cargado previamente
if (!require(UsingR)) {
install.packages("UsingR")
library(UsingR)
} else {
library(UsingR)
}
# Cargar la base de datos Aids2
data("Aids2")
# Verificar la estructura de los datos para asegurarse de que todo está correcto
str(Aids2)
## 'data.frame': 2843 obs. of 7 variables:
## $ state : Factor w/ 4 levels "NSW","Other",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ sex : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 2 2 2 ...
## $ diag : int 10905 11029 9551 9577 10015 9971 10746 10042 10464 10439 ...
## $ death : int 11081 11096 9983 9654 10290 10344 11135 11069 10956 10873 ...
## $ status : Factor w/ 2 levels "A","D": 2 2 2 2 2 2 2 2 2 2 ...
## $ T.categ: Factor w/ 8 levels "hs","hsid","id",..: 1 1 1 5 1 1 8 1 1 2 ...
## $ age : int 35 53 42 44 39 36 36 31 26 27 ...
# Contar el número de casos por estado
cases_by_state=table(Aids2$status)
# Imprimir el resultado
print(cases_by_state)
##
## A D
## 1082 1761
B). ¿Cuanto es el número de fallecidos?
# Contar el número de fallecidos usando la columna status
status_counts=table(Aids2$status)
# Imprimir el resultado
print(status_counts)
##
## A D
## 1082 1761
# Extraer específicamente el número de fallecidos si "D" representa a los muertos
number_deceased=status_counts["D"]
# Imprimir el número de fallecidos
cat("Número de fallecidos:", number_deceased, "\n")
## Número de fallecidos: 1761
C). ¿Cual es la relación entre sexo y tipo de transmisión?
# Crear la tabla de contingencia entre el sexo y el tipo de transmisión
sex_transmission_table=table(Aids2$sex, Aids2$T.categ)
# Imprimir la tabla de contingencia
print(sex_transmission_table)
##
## hs hsid id het haem blood mother other
## F 1 0 20 20 0 37 4 7
## M 2464 72 28 21 46 57 3 63
# Realizar la prueba chi-cuadrado
chi_squared_test=chisq.test(sex_transmission_table)
## Warning in chisq.test(sex_transmission_table): Chi-squared approximation may be
## incorrect
# Imprimir los resultados de la prueba
print(chi_squared_test)
##
## Pearson's Chi-squared test
##
## data: sex_transmission_table
## X-squared = 1083.4, df = 7, p-value < 2.2e-16
El valor extremadamente bajo del p-valor en la prueba de Chi-cuadrado significa que es muy improbable que estas diferencias observadas en la distribución del tipo de transmisión entre géneros sean debido al azar. Por tanto, podemos concluir con bastante seguridad que existe una asociación estadística entre el género y el tipo de transmisión del VIH en esta población de estudio.
D). ¿Grafique de forma adecuada los tipos de transmisión?
# Cargar el paquete tidyverse si no ha sido cargado previamente
if (!require(tidyverse)) {
install.packages("tidyverse")
library(tidyverse)
} else {
library(tidyverse)
}
## Loading required package: 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
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ dplyr::select() masks MASS::select()
## ✖ dplyr::src() masks Hmisc::src()
## ✖ dplyr::summarize() masks Hmisc::summarize()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Cargar la base de datos Aids2 del paquete UsingR
if (!require(UsingR)) {
install.packages("UsingR")
library(UsingR)
} else {
library(UsingR)
}
data("Aids2")
# Transformar los datos a formato largo
aids_long=Aids2 %>%
pivot_longer(
cols = T.categ, # Columnas para pivotar a formato largo
names_to = "Transmission_Type", # Nombre de la nueva columna para los nombres
values_to = "Count" # Nombre de la nueva columna para los valores
) %>%
count(sex, Transmission_Type) # Agrupar y contar por sexo y tipo de transmisión
# Ver los datos transformados
print(aids_long)
## # A tibble: 2 × 3
## sex Transmission_Type n
## <fct> <chr> <int>
## 1 F T.categ 89
## 2 M T.categ 2754
# Gráfico de barras usando ggplot2
ggplot(aids_long, aes(x = sex, y = n, fill = Transmission_Type)) +
geom_bar(stat = "identity", position = "stack") +
labs(title = "Distribución de Tipos de Transmisión del VIH por Sexo",
x = "Sexo",
y = "Número de Casos") +
scale_fill_brewer(palette = "Paired") + # Utilizar una paleta de colores adecuada
theme_minimal()
La base de datos UsingR posee la siguiente base de datos: “crime” que contiene la tasa de crímenes de 50 estados de los E.E.U.U en los años 1983 y 1993, posee 3 columnas: Estado (no marcado), y1983, y1993. Se requiere un informe con los siguientes puntos.
A). La tasa total en 1993 fue mayor o menor que en 1983.
# Instalar y cargar el paquete UsingR si no ha sido cargado previamente
if (!require(UsingR)) {
install.packages("UsingR")
library(UsingR)
} else {
library(UsingR)
}
# Cargar la base de datos crime
data("crime")
# Calcular la tasa total de crímenes para 1983
total_crime_1983=sum(crime$y1983, na.rm = TRUE)
# Calcular la tasa total de crímenes para 1993
total_crime_1993=sum(crime$y1993, na.rm = TRUE)
# Imprimir los totales para comparación
cat("Tasa total de crímenes en 1983:", total_crime_1983, "\n")
## Tasa total de crímenes en 1983: 22313.5
cat("Tasa total de crímenes en 1993:", total_crime_1993, "\n")
## Tasa total de crímenes en 1993: 30948.3
# Determinar si la tasa fue mayor o menor en 1993 en comparación con 1983
if (total_crime_1993 > total_crime_1983) {
cat("La tasa total de crímenes en 1993 fue mayor que en 1983.\n")
} else if (total_crime_1993 < total_crime_1983) {
cat("La tasa total de crímenes en 1993 fue menor que en 1983.\n")
} else {
cat("La tasa total de crímenes fue igual en ambos años.\n")
}
## La tasa total de crímenes en 1993 fue mayor que en 1983.
B). Qué estado presenta la mayor tasa de crímenes en cada año.
# Encontrar el índice del máximo para cada año
index_max_1983=which.max(crime$y1983)
index_max_1993=which.max(crime$y1993)
# Extraer el estado con la mayor tasa de crímenes en 1983
state_max_1983=rownames(crime)[index_max_1983]
# Extraer el estado con la mayor tasa de crímenes en 1993
state_max_1993=rownames(crime)[index_max_1993]
# Imprimir los resultados
cat("Estado con la mayor tasa de crímenes en 1983:", state_max_1983, "con una tasa de", crime$y1983[index_max_1983], "\n")
## Estado con la mayor tasa de crímenes en 1983: DC con una tasa de 1985.4
cat("Estado con la mayor tasa de crímenes en 1993:", state_max_1993, "con una tasa de", crime$y1993[index_max_1993], "\n")
## Estado con la mayor tasa de crímenes en 1993: DC con una tasa de 2832.8
C). Que estado presenta la mayor tasa de crimen acumulado en ambos años.
# Añadir una nueva columna que sea la suma de las tasas de 1983 y 1993
crime$total=crime$y1983 + crime$y1993
# Encontrar el índice del máximo de la tasa de crimen acumulada
index_max_total=which.max(crime$total)
# Extraer el estado con la mayor tasa de crimen acumulada
state_max_total=rownames(crime)[index_max_total]
# Imprimir el resultado
cat("Estado con la mayor tasa de crimen acumulada en 1983 y 1993:", state_max_total, "con una tasa acumulada de", crime$total[index_max_total], "\n")
## Estado con la mayor tasa de crimen acumulada en 1983 y 1993: DC con una tasa acumulada de 4818.2
D). Gráfica el punto b de forma adecuada.
# Añadir una columna que sea la suma de las tasas de 1983 y 1993
crime$total=crime$y1983 + crime$y1993
# Ordenar los datos por la tasa total de crimen acumulada
crime=crime[order(crime$total, decreasing = TRUE), ]
# Gráfico de barras usando ggplot2
ggplot(crime, aes(x = reorder(rownames(crime), -total), y = total)) +
geom_bar(stat = "identity", fill = "steelblue") +
labs(title = "Tasa de Crimen Acumulada por Estado (1983 y 1993)",
x = "Estado",
y = "Tasa Total de Crimen Acumulada") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) # Rotar las etiquetas del eje X para mejor legibilidad