2016-11-23 6 views
4

Hadley Wickham proposed, dass es möglich sein könnte Bootstrap mit dplyr Paket, seinen Vorschlag was improved und dann implemented in broom package durchzuführen. Wäre es auch möglich, eine k-fache Kreuzvalidierung durchzuführen?k-fache Kreuzvalidierung in dplyr?

Ich denke, dass der erste Schritt (Auswahl der Zug Gruppe) ist sehr einfach:

crossvalidate <- function (df, k = 5) { 
    n <- nrow(df) 
    idx <- sample(rep_len(1:k, n)) 
    attr(df, "indices") <- lapply(1:k, function(i) which(idx != i)) 
    attr(df, "drop") <- TRUE 
    attr(df, "group_sizes") <- nrow(df) - unclass(table(idx)) 
    attr(df, "biggest_group_size") <- max(attr(df, "group_sizes")) 
    attr(df, "labels") <- data.frame(replicate = 1:k) 
    attr(df, "vars") <- list(quote(replicate)) 
    class(df) <- c("grouped_df", "tbl_df", "tbl", "data.frame") 
    df 
} 

Aber irgendwie kann ich nicht immer und überall Dokumentation von attr(, "indices") zu lernen finden, wenn es irgendwie möglich ist, Indizes zu verwenden "Andere, dass" diejenigen ausgewählt für die Auswahl der Gruppe Gruppenindizes. Hast du eine Idee?

+4

Sie sollten auf einen Blick [ 'modelr'] (https://github.com/hadley/ Modeller), Hadleys Paket mit einer 'crossv_kfold'-Funktion. – Axeman

Antwort

1

https://rpubs.com/dgrtwo/cv-modelr - dort haben Sie ein Beispiel für k-fache Kreuzvalidierung mit dplyr Paket:

library(ISLR) 
library(dplyr) 
library(purrr) 
library(modelr) 
library(broom) 
library(tidyr) 
library(ISLR) 

set.seed(1) 

models <- Smarket %>% 
    select(Today, Lag1:Lag5) %>% 
    crossv_kfold(k = 20) %>% 
    mutate(model = map(train, ~ lm(Today ~ ., data = .))) 

predictions <- models %>% 
    unnest(map2(model, test, ~ augment(.x, newdata = .y))) 

predictions %>% 
    summarize(MSE = mean((Today - .fitted)^2), 
      MSEIntercept = mean((Today - mean(Today))^2)) 
Verwandte Themen