library(MASS)
library(UsingR)
## Loading required package: HistData
## Loading required package: Hmisc
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:base':
##
## format.pval, units
2.1 A
# a) Número de conjuntos de datos en el paquete
num_datasets <- length(data(package="UsingR")$results[, "Item"])
# Imprimir el número de conjuntos de datos
cat("El paquete UsingR contiene", num_datasets, "conjuntos de datos.\n")
## El paquete UsingR contiene 123 conjuntos de datos.
B
# Gráficos de histograma y boxplot para los conjuntos de datos "bumpers", "firstchi" y "math"
par(mfrow=c(3, 2)) # Organizar las gráficas en 3 filas y 2 columnas
# Histograma para "bumpers"
hist(bumpers, main="Histograma - bumpers")
# Boxplot para "bumpers"
boxplot(bumpers, main="Boxplot - bumpers")
# Histograma para "firstchi"
hist(firstchi, main="Histograma - firstchi")
# Boxplot para "firstchi"
boxplot(firstchi, main="Boxplot - firstchi")
# Histograma para "math"
hist(math, main="Histograma - math")
# Boxplot para "math"
boxplot(math, main="Boxplot - math")
C
# Estimación visual y cálculo de medias, medianas y desviaciones estándar
# Estimación visual
cat("Estimación visual de los datos:\n")
## Estimación visual de los datos:
print(summary(bumpers))
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 618 1478 2129 2122 2774 3298
print(summary(firstchi))
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 14.00 20.00 23.00 23.98 26.00 42.00
print(summary(math))
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 38.00 49.00 54.00 54.90 61.75 75.00
# Cálculo de medias, medianas y desviaciones estándar
cat("\nCálculos estadísticos:\n")
##
## Cálculos estadísticos:
cat("Media de bumpers:", mean(bumpers), "\n")
## Media de bumpers: 2122.478
cat("Mediana de bumpers:", median(bumpers), "\n")
## Mediana de bumpers: 2129
cat("Desviación estándar de bumpers:", sd(bumpers), "\n")
## Desviación estándar de bumpers: 798.4574
cat("Media de firstchi:", mean(firstchi), "\n")
## Media de firstchi: 23.97701
cat("Mediana de firstchi:", median(firstchi), "\n")
## Mediana de firstchi: 23
cat("Desviación estándar de firstchi:", sd(firstchi), "\n")
## Desviación estándar de firstchi: 6.254258
cat("Media de math:", mean(math), "\n")
## Media de math: 54.9
cat("Mediana de math:", median(math), "\n")
## Mediana de math: 54
cat("Desviación estándar de math:", sd(math), "\n")
## Desviación estándar de math: 9.746264
2.2 A
# a) Representación de los datos mediante histograma y gráfico de densidad
# Histograma
hist(brightness, main="Histograma - brightness", xlab="Brillo", ylab="Frecuencia", col="lightblue", border="black")
# Gráfico de densidad superpuesto
lines(density(brightness), col="red", lwd=2)
B
# Representación de los datos mediante un diagrama de caja
boxplot(brightness, main="Diagrama de Caja - brightness", col="lightgreen")
# Determinar si hay outliers y encontrar el segundo menor outlier
outliers <- boxplot(brightness)$out
if(length(outliers) > 1) {
outliers_sorted <- sort(outliers)
second_min_outlier <- outliers_sorted[2]
cat("El segundo menor outlier es:", second_min_outlier, "\n")
} else {
cat("No hay suficientes outliers para encontrar el segundo menor.\n")
}
## El segundo menor outlier es: 2.28
C
# Crear una nueva variable brightness.sin con los valores que no sean atípicos
Q1 <- quantile(brightness, 0.25)
Q3 <- quantile(brightness, 0.75)
IQR <- Q3 - Q1
brightness.sin <- brightness[brightness > Q1 - 1.5 * IQR & brightness < Q3 + 1.5 * IQR]
# Resumen de la nueva variable
summary(brightness.sin)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 5.570 7.750 8.500 8.423 9.090 11.260
2.3 A
# Carga del paquete MASS
library(MASS)
# Carga de la base de datos UScereal
data("UScereal")
# a) 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
# Investigar algunas asociaciones entre las variables
# i. La relación entre fat y vitamins
plot(UScereal$fat, UScereal$vitamins, xlab="Fat", ylab="Vitamins", main="Fat vs Vitamins")
# ii. La relación entre fat y shelf
boxplot(fat ~ shelf, data=UScereal, xlab="Shelf", ylab="Fat", main="Fat vs Shelf")
# iii. La relación entre carbohydrates y sugars
plot(UScereal$carbo, UScereal$sugars, xlab="Carbohydrates", ylab="Sugars", main="Carbohydrates vs Sugars")
# iv. La relación entre fibre y sugars
plot(UScereal$fibre, UScereal$sugars, xlab="Fibre", ylab="Sugars", main="Fibre vs Sugars")
# v. La relación entre fibre y shelf
boxplot(fibre ~ shelf, data=UScereal, xlab="Shelf", ylab="Fibre", main="Fibre vs Shelf")
# vi. La relación entre sodium y sugars
plot(UScereal$sodium, UScereal$sugars, xlab="Sodium", ylab="Sugars", main="Sodium vs Sugars")
2.4 A
# Carga del paquete MASS
library(MASS)
# Carga de la base de datos mammals
data("mammals")
# a) Correlación lineal entre las variables peso corporal y peso del cerebro
correlation <- cor(mammals$body, mammals$brain)
cat("La correlación lineal entre el peso corporal y el peso del cerebro es:", correlation, "\n")
## La correlación lineal entre el peso corporal y el peso del cerebro es: 0.9341638
B
# Representación de los datos mediante la instrucción plot
plot(mammals$body, mammals$brain, xlab="Peso Corporal", ylab="Peso del Cerebro", main="Relación entre Peso Corporal y Peso del Cerebro")
C
# c) Transformación de los datos mediante la función log y repetición del estudio
log_body <- log(mammals$body)
log_brain <- log(mammals$brain)
# Correlación lineal con los datos transformados
correlation_log <- cor(log_body, log_brain)
cat("La correlación lineal entre el logaritmo del peso corporal y el logaritmo del peso del cerebro es:", correlation_log, "\n")
## La correlación lineal entre el logaritmo del peso corporal y el logaritmo del peso del cerebro es: 0.9595748
# Representación de los datos transformados
plot(log_body, log_brain, xlab="Logaritmo del Peso Corporal", ylab="Logaritmo del Peso del Cerebro", main="Relación entre Logaritmo del Peso Corporal y Logaritmo del Peso del Cerebro")
2.5 A
# Carga del paquete UsingR y enlace de la base de datos emissions
library(UsingR)
data("emissions")
# a) Estudio de la relación entre las variables GDP, perCapita y CO2
correlation_matrix <- cor(emissions[, c("GDP", "perCapita", "CO2")])
print(correlation_matrix)
## GDP perCapita CO2
## GDP 1.0000000 0.4325303 0.9501753
## perCapita 0.4325303 1.0000000 0.2757962
## CO2 0.9501753 0.2757962 1.0000000
B
# b) Construcción de modelos de regresión para predecir las emisiones de CO2
# Modelo de regresión utilizando 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 utilizando 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
# Modelo de regresión utilizando GDP y perCapita
model_GDP_perCapita <- lm(CO2 ~ GDP + perCapita, data=emissions)
summary(model_GDP_perCapita)
##
## Call:
## lm(formula = CO2 ~ GDP + perCapita, data = emissions)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1037.3 -167.4 10.8 153.2 1052.0
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.100e+02 2.044e+02 2.495 0.0202 *
## GDP 8.406e-04 5.198e-05 16.172 4.68e-14 ***
## perCapita -3.039e-02 1.155e-02 -2.631 0.0149 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 382.8 on 23 degrees of freedom
## Multiple R-squared: 0.9253, Adjusted R-squared: 0.9188
## F-statistic: 142.5 on 2 and 23 DF, p-value: 1.102e-13
C
# Identificación de outliers y ajuste del modelo sin ellos
# Identificación de outliers en el modelo de regresión utilizando GDP y perCapita
outliers <- boxplot(model_GDP_perCapita$residuals, plot=FALSE)$out
# Eliminación de outliers
emissions_clean <- emissions[-which(model_GDP_perCapita$residuals %in% outliers), ]
# Ajuste del modelo sin outliers
model_GDP_perCapita_clean <- lm(CO2 ~ GDP + perCapita, data=emissions_clean)
summary(model_GDP_perCapita_clean)
##
## Call:
## lm(formula = CO2 ~ GDP + perCapita, data = emissions_clean)
##
## Residuals:
## Min 1Q Median 3Q Max
## -469.70 -50.26 30.88 79.67 348.27
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.917e+02 1.160e+02 1.653 0.1132
## GDP 8.490e-04 2.774e-05 30.603 <2e-16 ***
## perCapita -1.307e-02 6.453e-03 -2.026 0.0557 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 196.3 on 21 degrees of freedom
## Multiple R-squared: 0.9811, Adjusted R-squared: 0.9793
## F-statistic: 544.3 on 2 and 21 DF, p-value: < 2.2e-16
2.6 A
# Carga del paquete MASS
library(MASS)
# Carga de la base de datos anorexia
data("anorexia")
# a) Determinar el tipo de tratamiento más efectivo
# Calcular el promedio de cambio de peso para cada tipo de tratamiento
avg_weight_change <- aggregate(anorexia$Postwt - anorexia$Prewt, by=list(anorexia$Treat), FUN=mean)
# Encontrar el tratamiento con el mayor promedio de cambio de peso
most_effective_treatment <- avg_weight_change[which.max(avg_weight_change$x), "Group.1"]
cat("El tipo de tratamiento más efectivo es:", most_effective_treatment, "\n")
## El tipo de tratamiento más efectivo es: 3
B
# b) Determinar cuántos pacientes ganaron y perdieron peso
# Contar el número de pacientes que ganaron peso (Postwt > Prewt)
patients_gained_weight <- sum(anorexia$Postwt > anorexia$Prewt)
# Contar el número de pacientes que perdieron peso (Postwt < Prewt)
patients_lost_weight <- sum(anorexia$Postwt < anorexia$Prewt)
cat("Número de pacientes que ganaron peso:", patients_gained_weight, "\n")
## Número de pacientes que ganaron peso: 42
cat("Número de pacientes que perdieron peso:", patients_lost_weight, "\n")
## Número de pacientes que perdieron peso: 29
C
# c) Graficar el número de pacientes que ganaron y perdieron peso
barplot(c(patients_gained_weight, patients_lost_weight),
names.arg=c("Ganaron peso", "Perdieron peso"),
xlab="Resultado", ylab="Número de pacientes",
col=c("green", "red"),
main="Ganancia y pérdida de peso en pacientes con anorexia")
2.7 A
# Carga del paquete MASS
library(MASS)
# Carga de la base de datos Melanoma
data("Melanoma")
# a) Obtener el número de fallecidos por Melanoma y otras causas
deaths_melanoma <- sum(Melanoma$Status == "dead" & Melanoma$Type == "malignant melanoma")
deaths_other_causes <- sum(Melanoma$Status == "dead" & Melanoma$Type != "malignant melanoma")
cat("Número de fallecidos por Melanoma:", deaths_melanoma, "\n")
## Número de fallecidos por Melanoma: 0
cat("Número de fallecidos por otras causas:", deaths_other_causes, "\n")
## Número de fallecidos por otras causas: 0
B
# Determinar la presencia y ausencia de Melanoma
presence_melanoma <- sum(Melanoma$Type == "malignant melanoma")
absence_melanoma <- nrow(Melanoma) - presence_melanoma
cat("Número de pacientes con Melanoma:", presence_melanoma, "\n")
## Número de pacientes con Melanoma: 0
cat("Número de pacientes sin Melanoma:", absence_melanoma, "\n")
## Número de pacientes sin Melanoma: 205
C
# Convertir el indicador de muerte a tipo numérico
death_indicator <- as.numeric(Melanoma$Status == "dead")
# Calcular la correlación entre el tamaño del tumor y el indicador de muerte
correlation_tumor_size_death <- cor(as.numeric(Melanoma$Thick), death_indicator)
cat("Correlación entre tamaño de tumor y muerte:", correlation_tumor_size_death, "\n")
## Correlación entre tamaño de tumor y muerte: NA
D
# Graficar la presencia y ausencia de Melanoma
barplot(c(presence_melanoma, absence_melanoma),
names.arg=c("Con Melanoma", "Sin Melanoma"),
xlab="Condición", ylab="Número de pacientes",
col=c("blue", "orange"),
main="Presencia y ausencia de Melanoma")
2.8 A
# Carga del paquete UsingR
library(UsingR)
# Carga de la base de datos babyboom
data("babyboom")
# a) Número de niños y niñas
num_ninos <- sum(babyboom$gender == "M")
num_ninas <- sum(babyboom$gender == "F")
cat("Número de niños:", num_ninos, "\n")
## Número de niños: 0
cat("Número de niñas:", num_ninas, "\n")
## Número de niñas: 0
B
# Cantidad de niños nacidos en las primeras 12 horas
num_ninos_primeras_12h <- sum(babyboom$gender[1:24] == "M")
cat("Cantidad de niños nacidos en las primeras 12 horas:", num_ninos_primeras_12h, "\n")
## Cantidad de niños nacidos en las primeras 12 horas: 0
C
# Niños nacidos por debajo de 3000g
num_ninos_bajo_3000g <- sum(babyboom$weight[babyboom$gender == "M"] < 3000)
cat("Cantidad de niños nacidos por debajo de 3000g:", num_ninos_bajo_3000g, "\n")
## Cantidad de niños nacidos por debajo de 3000g: 0
D
# Relación entre peso por debajo de 3000g y sexo
tabla_sexo_peso <- table(babyboom$gender[babyboom$weight < 3000])
cat("Relación entre peso por debajo de 3000g y sexo:\n", tabla_sexo_peso, "\n")
## Relación entre peso por debajo de 3000g y sexo:
## 0 0
E
# Gráfico del promedio de pesos total, de niños y de niñas
library(ggplot2)
# Calcular los promedios
promedio_total <- mean(babyboom$weight)
## Warning in mean.default(babyboom$weight): argument is not numeric or logical:
## returning NA
promedio_ninos <- mean(babyboom$weight[babyboom$gender == "M"])
## Warning in mean.default(babyboom$weight[babyboom$gender == "M"]): argument is
## not numeric or logical: returning NA
promedio_ninas <- mean(babyboom$weight[babyboom$gender == "F"])
## Warning in mean.default(babyboom$weight[babyboom$gender == "F"]): argument is
## not numeric or logical: returning NA
# Crear un data frame con los promedios
df_promedios <- data.frame(Grupo = c("Total", "Niños", "Niñas"),
Promedio = c(promedio_total, promedio_ninos, promedio_ninas))
# Graficar el promedio de pesos
ggplot(df_promedios, aes(x=Grupo, y=Promedio, fill=Grupo)) +
geom_bar(stat="identity") +
labs(title="Promedio de pesos",
x="Grupo",
y="Promedio de peso (g)") +
theme_minimal()
## Warning: Position guide is perpendicular to the intended axis.
## ℹ Did you mean to specify a different guide `position`?
## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_bar()`).
2.9 A
# Carga del paquete UsingR
library(UsingR)
# Carga de la base de datos Aids2
data("Aids2")
# Número de contagios por estado
num_contagios_estado <- table(Aids2$state)
cat("Número de contagios por estado:\n", num_contagios_estado, "\n")
## Número de contagios por estado:
## 1780 249 226 588
B
# Número de fallecidos
#num_fallecidos <- sum(Aids2$death)
# cat("Número de fallecidos:", num_fallecidos, "\n")
# Número de fallecidos
num_fallecidos <- sum(Aids2$fallecido == "Sí")
cat("Número de fallecidos:", num_fallecidos, "\n")
## Número de fallecidos: 0
C
# Verificamos el patrón de valores faltantes en la base de datos 'Aids2'
summary(Aids2)
## state sex diag death status T.categ
## NSW :1780 F: 89 Min. : 8302 Min. : 8469 A:1082 hs :2465
## Other: 249 M:2754 1st Qu.:10163 1st Qu.:10672 D:1761 blood : 94
## QLD : 226 Median :10665 Median :11235 hsid : 72
## VIC : 588 Mean :10584 Mean :10990 other : 70
## 3rd Qu.:11103 3rd Qu.:11504 id : 48
## Max. :11503 Max. :11504 haem : 46
## (Other): 48
## age
## Min. : 0.00
## 1st Qu.:30.00
## Median :37.00
## Mean :37.41
## 3rd Qu.:43.00
## Max. :82.00
##
# Creamos subconjuntos de 'Aids2' sin valores faltantes en las variables 'sexo' y 'transmision'
datos_sexo <- Aids2[!is.na(Aids2$sexo), ]
datos_transmision <- Aids2[!is.na(Aids2$transmision), ]
# Comprobamos si la cantidad de filas en ambos subconjuntos es la misma
if (nrow(datos_sexo) != nrow(datos_transmision)) {
# Si hay un desajuste, realizamos un análisis de casos completos
# Eliminamos filas con valores faltantes en cualquier variable
datos <- Aids2[complete.cases(Aids2), ]
# Creamos la tabla 'relacion_sexo_transmision' a partir del subconjunto limpio 'datos'
relacion_sexo_transmision <- table(datos$sexo, datos$transmision)
# Informamos que se realizó un análisis de casos completos
print("Análisis de casos completos realizado debido al patrón de valores faltantes.")
} else {
# Si las longitudes coinciden, creamos la tabla directamente con los subconjuntos limpios
relacion_sexo_transmision <- table(datos_sexo$sexo, datos_transmision$transmision)
}
# Imprimimos la tabla 'relacion_sexo_transmision'
print(relacion_sexo_transmision)
## < table of extent 0 x 0 >
D
# Carga del paquete UsingR y de la base de datos Aids2
library(UsingR)
data("Aids2")
# Crear una tabla de frecuencias de los tipos de transmisión
frecuencia_transmision <- table(Aids2$transmision)
# Filtrar los nombres de los tipos de transmisión para asegurar que sean válidos y no estén vacíos
nombres_transmision <- names(frecuencia_transmision)
nombres_transmision <- nombres_transmision[nombres_transmision != ""] # Eliminar nombres vacíos
# Graficar los tipos de transmisión solo si hay nombres válidos
if (length(nombres_transmision) > 0) {
barplot(frecuencia_transmision,
main = "Tipos de Transmisión de SIDA",
xlab = "Tipo de Transmisión",
ylab = "Frecuencia",
col = "skyblue",
las = 2, # Rotar etiquetas del eje x si son largas
names.arg = nombres_transmision) # Establecer nombres de los tipos de transmisión en el eje x
} else {
cat("No hay nombres válidos de tipos de transmisión para graficar.\n")
}
## No hay nombres válidos de tipos de transmisión para graficar.
2.10 A
# Carga de la base de datos 'crime' desde el paquete UsingR
library(UsingR)
data("crime")
# Calcular la suma de las tasas de crimen en 1983 y 1993
total_1983 <- sum(crime$y1983)
total_1993 <- sum(crime$y1993)
# Comparar las tasas totales
if (total_1993 > total_1983) {
cat("La tasa total en 1993 fue mayor que en 1983.\n")
} else if (total_1993 < total_1983) {
cat("La tasa total en 1993 fue menor que en 1983.\n")
} else {
cat("La tasa total en 1993 fue igual a la de 1983.\n")
}
## La tasa total en 1993 fue mayor que en 1983.
B
# Encontrar el estado con la mayor tasa de crimen en 1983
estado_max_1983 <- crime$Estado[which.max(crime$y1983)]
cat("El estado con la mayor tasa de crimen en 1983 fue:", estado_max_1983, "\n")
## El estado con la mayor tasa de crimen en 1983 fue:
# Encontrar el estado con la mayor tasa de crimen en 1993
estado_max_1993 <- crime$Estado[which.max(crime$y1993)]
cat("El estado con la mayor tasa de crimen en 1993 fue:", estado_max_1993, "\n")
## El estado con la mayor tasa de crimen en 1993 fue:
C
# Carga de la base de datos 'crime' desde el paquete UsingR
library(UsingR)
data("crime")
# Calcular la tasa acumulada de crimen para cada estado
crime$Total <- crime$y1983 + crime$y1993
# Encontrar el estado con la mayor tasa acumulada de crimen
estado_max_acumulado <- crime$Estado[which.max(crime$Total)]
# Verificar si la respuesta está vacía o no
if (length(estado_max_acumulado) == 0) {
cat("No se encontró un estado con la mayor tasa de crimen acumulado en ambos años.\n")
} else {
cat("El estado con la mayor tasa de crimen acumulado en ambos años fue:", estado_max_acumulado, "\n")
}
## No se encontró un estado con la mayor tasa de crimen acumulado en ambos años.
D
# Graficar los estados con la mayor tasa de crimen en 1983 y 1993
barplot(c(crime$y1983[which.max(crime$y1983)], crime$y1993[which.max(crime$y1993)]),
names.arg = c("1983", "1993"),
main = "Mayor tasa de crimen por año",
xlab = "Año",
ylab = "Tasa de crimen",
col = c("skyblue", "lightgreen"))
```