2016-11-04 6 views
1

Я пытаюсь создать модель регрессии CV-кратности с использованием K = 5. Я попытался использовать функцию «boot» cv.glm, но у моего компьютера закончилась нехватка памяти, потому что загрузочный пакет всегда вычисляет рядом с ним LOOCV MSE. Поэтому я решил сделать это вручную, но я столкнулся со следующей проблемой. Я пытаюсь разделить свой dataframe на 5 векторов равной длины, содержащий образец 1/5 рядов моего df, но я получаю необъяснимые длины из 3-го сложения.Создание сгибов вручную для кросс-валидации K-fold R

a <- sample((d<-1:1000), size = 100, replace = FALSE) 
b <- sample((d<-1:1000), size = 100, replace = FALSE) 
c <- sample((d<-1:1000), size = 100, replace = FALSE) 
df <- data.frame(a,b,c) 
head(df) 

# create first fold (correct: n=20) 
set.seed(5) 
K1row <- sample(x = nrow(df), size = (nrow(df)/5), replace = FALSE, prob = NULL) 
str(K1row) # int [1:20] 21 68 90 28 11 67 50 76 88 96 ... 

# create second fold (still going strong: n=20) 
set.seed(5) 
K2row <- sample(x = nrow(df[-K1row,]), size = ((nrow(df[-K1row,]))/4), replace = FALSE, prob = NULL) 
str(K2row) # int [1:20] 17 55 72 22 8 53 40 59 69 76 ... 

# create third fold (this is where it goes wrong: n=21) 
set.seed(5) 
K3row <- sample(x = nrow(df[-c(K1row,K2row),]), size = ((nrow(df[-c(K1row,K2row),]))/3), replace = FALSE, prob = NULL) 
str(K3row) # int [1:21] 13 44 57 18 7 42 31 47 54 60 ... 

# create fourth fold (and it gets worse: n=26) 
set.seed(5) 
K4row <- sample(x = nrow(df[-c(K1row,K2row,K3row),]), size = ((nrow(df[-c(K1row,K2row,K3row),]))/2), replace = FALSE, prob = NULL) 
str(K4row) # int [1:26] 11 35 46 14 6 33 25 37 43 5 ... 

Длина вектора, по-видимому, увеличивается от K = 3. Может ли кто-нибудь объяснить мне, что я делаю неправильно? Мой код (и рассуждения) кажется логичным, но результат говорит иначе .. Мое большое спасибо заранее!

+0

Это потому, что у K1row и K2row есть некоторые общие элементы. Вы эффективно отбираете образцы с заменой. – ddunn801

ответ

1

Это потому, что у K1row и K2row есть некоторые общие элементы. Вы эффективно отбираете образцы с заменой. В приведенном ниже методе используется модуляция для разделения строк поровну.

set.seed(5) 
rand <- sample(nrow(df)) 

K1row <- rand[rand %% 5 + 1 == 1] 
K2row <- rand[rand %% 5 + 1 == 2] 
K3row <- rand[rand %% 5 + 1 == 3] 
K4row <- rand[rand %% 5 + 1 == 4] 
K5row <- rand[rand %% 5 + 1 == 5] 
+0

Спасибо за ваш быстрый комментарий ddunn801! Он отлично работает! Не могли бы вы объяснить немного больше об модульном расщеплении? Я не знаком с этим. И как создать запасную часть? –

+1

Modulo возвращает остаток после разделения. Пример: 17 по модулю 5 означает разделить 17 на 5 (это 3, остаток 2) и вернуть это 2. Это способ разделить любое количество на примерно равные ведра, потому что по модулю вы используете (скажем, 5) количество оставшихся есть (0, 1, 2, 3, 4, повтор). Ваш оригинальный метод не знает, какие строки были выбраны ранее, поэтому бывает, что один и тот же номер строки несколько раз. Запрошенная вами замена не работает по одному образцу, но не по каждому образцу. Если вы удовлетворены ответом, нажмите галочку, чтобы этот вопрос был отмечен как завершенный. – ddunn801

 Смежные вопросы

  • Нет связанных вопросов^_^