Я создал код, который подбирает разные типы копул к данным и выбирает лучший на основе наименьшего значения AIC. Код работает очень хорошо. Однако результат следующий:
Normal copula, dim. d = 3
Dimension: 3
Parameters:
rho.1 = 0.8094
dispstr: ex
Затем я могу получить из результата размер и параметры, но не имя связки. То есть мне нужно извлечь имя копуала. Например,
selected_copula@parameters
[1] 0.7833736
Я также хочу иметь возможность использовать selected_copula@copula
, чтобы получить имя наиболее подходящей связки, но это не работает.
Функция fitCopula
позволяет нам извлечь имя связки с помощью @copula
, чего я не могу сделать с помощью своего кода.
Полный код выглядит следующим образом:
library(copula)
fit_select_copula <- function(copula_list, data) {
fit_copula_models <- function(copula_list, data) {
num_copulas <- length(copula_list)
copula_results <- vector("list", length = num_copulas)
for (i in seq_along(copula_list)) {
copula <- copula_list[[i]]
fitted_model <- fitCopula(copula,data)
copula_results[[i]] <- list(
copula = fitted_model@copula,
loglik = fitted_model@loglik,
aic = AIC(fitted_model)
)
}
return(copula_results)
}
copula_results <- fit_copula_models(copula_list, data)
aic_values <- sapply(copula_results, function(x) x$aic)
lowest_aic_index <- which.min(aic_values)
selected_copula <- copula_results[[lowest_aic_index]]$copula
return(selected_copula)
}
# Example usage
data <- rCopula(1000, normalCopula(0.8, dim = 3)) # Replace with your actual data
copula_list <- list(
frank = frankCopula(6, 3),
clayton = claytonCopula(2, 3),
normal = normalCopula(0.7, 3)
)
selected_copula <- fit_select_copula(copula_list, data)
Я думаю, если вы хотите включить свои собственные имена в свой первоначальный список; Затем вам нужно добавить достаточную бухгалтерию, чтобы использовать ее в своих операциях.
library(copula)
fit_select_copula <- function(copula_list, data) {
fit_copula_models <- function(copula_list, data) {
num_copulas <- length(copula_list)
copula_names <- names(copula_list) # <<< ADDED THIS <<<<
copula_results <- vector("list", length = num_copulas)
for (i in seq_along(copula_list)) {
copula <- copula_list[[i]]
fitted_model <- fitCopula(copula,data)
copula_results[[i]] <- list(
copula_name = copula_names[[i]], # <<< ADDED THIS <<<<
copula = fitted_model@copula,
loglik = fitted_model@loglik,
aic = AIC(fitted_model)
)
}
return(copula_results)
}
copula_results <- fit_copula_models(copula_list, data)
aic_values <- sapply(copula_results, function(x) x$aic)
lowest_aic_index <- which.min(aic_values)
### ALTERED THIS ####
selected_copula <- list(name=copula_results[[lowest_aic_index]]$copula_name,
content = copula_results[[lowest_aic_index]]$copula)
return(selected_copula)
}
# Example usage
data <- rCopula(1000, normalCopula(0.8, dim = 3)) # Replace with your actual data
copula_list <- list(
frank = frankCopula(6, 3),
clayton = claytonCopula(2, 3),
normal = normalCopula(0.7, 3)
)
selected_copula <- fit_select_copula(copula_list, data)
поскольку у
copula_list
есть имена, просто сделайтеnames(copula_results) <- names(copula_list)