Pregunta 1

# Leer archivo CSV
precios <- read.csv("Precios.csv")

# Visualizar las primeras filas del dataset original
head(precios)
##    Date      EUR       JPY
## 1 36525 1.000000 1.0000000
## 2 36526 1.000000 1.0000000
## 3 36527 1.000000 1.0000000
## 4 36528 1.013990 1.0104562
## 5 36529 1.024608 0.9928536
## 6 36530       NA 0.9845887
# Limpiar los datos eliminando filas con NA
precios_limpio_a <- precios[complete.cases(precios), ]

# Mostrar dimensiones antes y después
cat("Dim originales:", dim(precios), "\n")
## Dim originales: 7508 3
cat("Dim  con complete.cases():", dim(precios_limpio_a), "\n")
## Dim  con complete.cases(): 6055 3
dim(precios_limpio_a)
## [1] 6055    3
precios_b <- precios

# Función que reemplaza los NA intermedios (con vecinos válidos)
reemplazar_na_vecinos_iterativo <- function(x) {
  repeat {
    x_old <- x
    for (i in 2:(length(x) - 1)) {
      if (is.na(x[i]) && !is.na(x[i - 1]) && !is.na(x[i + 1])) {
        x[i] <- mean(c(x[i - 1], x[i + 1]))
      }
    }
    # Si ya no cambia nada, salimos
    if (all(x == x_old, na.rm = TRUE)) break
  }
  return(x)
}

# Aplicamos la función a cada columna numérica
precios_b$EUR <- reemplazar_na_vecinos_iterativo(precios_b$EUR)
precios_b$JPY <- reemplazar_na_vecinos_iterativo(precios_b$JPY)
precios_b<-precios_b[complete.cases(precios_b), ]

# Verificamos que ya no haya NA
dim(precios_b)
## [1] 7212    3

Comparacion entre ambas datas

# Estadísticas descriptivas para la base con complete.cases()
summary(precios_limpio_a[, 2:3])
##       EUR              JPY        
##  Min.   :0.8451   Min.   :0.7637  
##  1st Qu.:1.4408   1st Qu.:0.8880  
##  Median :1.5702   Median :0.9559  
##  Mean   :1.5609   Mean   :0.9957  
##  3rd Qu.:1.8116   3rd Qu.:1.0445  
##  Max.   :2.0828   Max.   :1.3905
# Estadísticas descriptivas para la base con imputación
summary(precios_b[, 2:3])
##       EUR              JPY        
##  Min.   :0.8451   Min.   :0.7637  
##  1st Qu.:1.4409   1st Qu.:0.8888  
##  Median :1.5704   Median :0.9570  
##  Mean   :1.5614   Mean   :0.9961  
##  3rd Qu.:1.8122   3rd Qu.:1.0448  
##  Max.   :2.0828   Max.   :1.3905
# Adicional: comparación de número de observaciones válidas
cat("Observaciones en precios_limpio_a:", nrow(precios_limpio_a), "\n")
## Observaciones en precios_limpio_a: 6055
cat("Observaciones en precios_b:", nrow(precios_b), "\n")
## Observaciones en precios_b: 7212

Summary de Log rendimientos, pongo un histograma

rendimientos <- data.frame(
  Date = precios_b$Date[-1],  # Una fila menos por el lag
  r_log_EUR = diff(log(precios_b$EUR)),
  r_log_JPY = diff(log(precios_b$JPY))
)

# Summary de los rendimientos
summary(rendimientos[, 2:3])
##    r_log_EUR            r_log_JPY         
##  Min.   :-3.825e-02   Min.   :-3.708e-02  
##  1st Qu.:-1.674e-03   1st Qu.:-1.858e-03  
##  Median : 0.000e+00   Median : 0.000e+00  
##  Mean   : 6.234e-05   Mean   :-3.010e-06  
##  3rd Qu.: 1.916e-03   3rd Qu.: 1.681e-03  
##  Max.   : 4.295e-02   Max.   : 4.501e-02
# Histograma de EUR
hist(rendimientos$r_log_EUR,
     breaks = 50,
     col = "skyblue",
     main = "Histograma de Rendimientos Logarítmicos EUR",
     xlab = "Rendimiento logarítmico")

# Histograma de JPY
hist(rendimientos$r_log_JPY,
     breaks = 50,
     col = "salmon",
     main = "Histograma de Rendimientos Logarítmicos JPY",
     xlab = "Rendimiento logarítmico")

Ahora lo calculamos para Precios2

# Leer archivo Precios2.csv
precios2 <- read.csv("Precios2.csv")

precios2$EUR <- reemplazar_na_vecinos_iterativo(precios2$EUR)
precios2$JPY <- reemplazar_na_vecinos_iterativo(precios2$JPY)
precios2<-precios2[complete.cases(precios2), ]

# Calcular rendimientos logarítmicos
rendimientos2 <- data.frame(
  Date = precios2$Date[-1],
  r_log_EUR = diff(log(precios2$EUR)),
  r_log_JPY = diff(log(precios2$JPY))
)

# Mostrar resumen estadístico
summary(rendimientos2[, 2:3])
##    r_log_EUR            r_log_JPY         
##  Min.   :-3.694e-02   Min.   :-0.0448506  
##  1st Qu.: 0.000e+00   1st Qu.: 0.0000000  
##  Median : 0.000e+00   Median : 0.0000000  
##  Mean   : 6.255e-05   Mean   :-0.0000028  
##  3rd Qu.: 0.000e+00   3rd Qu.: 0.0000000  
##  Max.   : 4.421e-02   Max.   : 0.0396091
# Histograma de EUR
hist(rendimientos2$r_log_EUR,
     breaks = 50,
     col = "skyblue",
     main = "Histograma Rendimientos Logarítmicos EUR (Precios2)",
     xlab = "Rendimiento logarítmico")

# Histograma de JPY
hist(rendimientos2$r_log_JPY,
     breaks = 50,
     col = "salmon",
     main = "Histograma Rendimientos Logarítmicos JPY (Precios2)",
     xlab = "Rendimiento logarítmico")

Pregunta 1.f - Interpretación de los resultados

Al comparar las estadísticas descriptivas y los histogramas de los rendimientos logarítmicos de EUR y JPY entre las bases Precios.csv y Precios2.csv, se observan los siguientes puntos:

En resumen, los resultados son consistentes entre ambas bases, y reflejan las características típicas de las series financieras: rendimientos pequeños en promedio, posible asimetría leve, y colas pesadas.

Pregunta 2

Utilizando la base de datos Precios.csv y la base de datos limpiada con complete.cases():

a)Desviación mediana muestral (manual)

eur <- precios_limpio_a$EUR
jpy <- precios_limpio_a$JPY


mediana_eur <- median(eur)
mediana_jpy <- median(jpy)


desv_mediana_eur <- sum((eur - mediana_eur)^2) / (length(eur) - 1)
desv_mediana_jpy <- sum((jpy - mediana_jpy)^2) / (length(jpy) - 1)

cat("Desviación mediana muestral EUR:", desv_mediana_eur, "\n")
## Desviación mediana muestral EUR: 0.09147115
cat("Desviación mediana muestral JPY:", desv_mediana_jpy, "\n")
## Desviación mediana muestral JPY: 0.02231309

b)Covarianza mediana entre EUR y JPY

# Calcular la suma producto manual
producto <- (eur - mediana_eur) * (jpy - mediana_jpy)
cov_mediana <- sum(producto) / (length(eur) - 1)

# Mostrar resultado
cat("Covarianza mediana entre EUR y JPY:", cov_mediana, "\n")
## Covarianza mediana entre EUR y JPY: 0.02709172

Pregunta 2.c - Primeros 4 momentos de EUR con moments

library(moments)

eur <- precios_limpio_a$EUR

media_eur <- mean(eur)
varianza_eur <- var(eur)
asimetria_eur <- skewness(eur)
curtosis_eur <- kurtosis(eur)

cat("1er momento (media):", media_eur, "\n")
## 1er momento (media): 1.560866
cat("2do momento (varianza):", varianza_eur, "\n")
## 2do momento (varianza): 0.0913843
cat("3er momento (asimetría/skewness):", asimetria_eur, "\n")
## 3er momento (asimetría/skewness): -0.7001958
cat("4to momento (curtosis):", curtosis_eur, "\n")
## 4to momento (curtosis): 2.768171

Pregunta 3

Programa una función que se llame “momentos_distrib” que calcule los momentos de todos los vectores que conforman un data.frame, puedes asumir que el df contiene únicamente datos numéricos. La función debe como mínimo realizar las siguientes tareas:

Error cuando no es un data frame, caso 1

tryCatch({
  momentos_distrib(df = c("perro", 2, 3))
}, error = function(e) {
  cat("Error capturado:", e$message, "\n")
})
## Error capturado: Error: el objeto no es un data.frame

Caso2:

momentos_distrib(as.data.frame(cbind(
  c(1,2,3,4,3,4,2,1),
  c(2,54,6,4,2,33,5,55),
  c(0.1,0.2,-0.1,-10,1,-2,-3,-3)
)))
## [1] "Clases originales de las columnas:"
##        V1        V2        V3 
## "numeric" "numeric" "numeric"
##                V1         V2        V3
## media    2.500000  20.125000 -2.100000
## varianza 1.428571 553.553571 12.540000
## skewness 0.000000   0.715815 -1.492215
## kurtosis 1.640000   1.704556  4.211197

Caso 3: data.frame con columnas de texto (convertibles a numérico)

momentos_distrib(as.data.frame(cbind(
  c(1,2,3,4,3,4,2,1),
  as.character(c(2,54,6,4,2,33,5,55)),
  c(0.1,0.2,-0.1,-10,1,-2,-3,-3)
)))
## [1] "Clases originales de las columnas:"
##          V1          V2          V3 
## "character" "character" "character"
##                V1         V2        V3
## media    2.500000  20.125000 -2.100000
## varianza 1.428571 553.553571 12.540000
## skewness 0.000000   0.715815 -1.492215
## kurtosis 1.640000   1.704556  4.211197

Caso 4: aplicar a la base limpia de precios

momentos_distrib(as.data.frame(precios_limpio_a))
## [1] "Clases originales de las columnas:"
##      Date       EUR       JPY 
## "numeric" "numeric" "numeric"
##                   Date        EUR        JPY
## media     4.028943e+04  1.5608661 0.99573405
## varianza  4.674369e+06  0.0913843 0.02072787
## skewness -3.609700e-04 -0.7001958 1.14529394
## kurtosis  1.799553e+00  2.7681714 3.48851020