2017-01-19 14 views
0

Это сообщение было изменено, чтобы более точно описать ситуацию. Я использую форму отладки ножей для моей работы. Файлы с привязкой будут использоваться для калибровки модели, а неиспользуемые данные будут использоваться для проверки.Создание объектов dataframe, которые производятся во время выборки сальника ножа

Вместо выполнения анализа немедленно, я хочу, чтобы сохранить образцы jackknifed как dataframes, а также данные, которые были удалены для каждого образца ...

Это трудно объяснить, так что я буду использовать пример для иллюстрации:

Целью примера является создание наборов данных 4 раза. Каждый раз должно быть 2 набора данных - 1 длины 9 (калибровочный) и 1 длины 3 (один валидационный).

df <- 
    data.frame(value1 = 1:(3*4), 
      value2 = seq(from = 1000, by = 50, length.out = 3*4), 
      tosplit = rep(1:4, each = 3)) 

df #df represents the dataframe in its entirety 

dfs <- split(df, df$tosplit) #df is now split into 4 equal parts of 3 

##### 

> #Replicate 1 
> r1_3parts <- do.call("rbind", dfs[1:3]) 
> r1_1parts <- do.call("rbind", dfs[4]) 
> 
> r1_3parts 
    value1 value2 tosplit 
1.1  1 1000  1 
1.2  2 1050  1 
1.3  3 1100  1 
2.4  4 1150  2 
2.5  5 1200  2 
2.6  6 1250  2 
3.7  7 1300  3 
3.8  8 1350  3 
3.9  9 1400  3 
> r1_1parts 
    value1 value2 tosplit 
4.10  10 1450  4 
4.11  11 1500  4 
4.12  12 1550  4 
> 
> #Replicate 2 
> r2_3parts <- do.call("rbind", dfs[2:4]) 
> r2_1parts <- do.call("rbind", dfs[1]) 
> 
> r2_3parts 
    value1 value2 tosplit 
2.4  4 1150  2 
2.5  5 1200  2 
2.6  6 1250  2 
3.7  7 1300  3 
3.8  8 1350  3 
3.9  9 1400  3 
4.10  10 1450  4 
4.11  11 1500  4 
4.12  12 1550  4 
> r2_1parts 
    value1 value2 tosplit 
1.1  1 1000  1 
1.2  2 1050  1 
1.3  3 1100  1 
> 
> #Replicate 3 
> r3_3parts <- do.call("rbind", dfs[c(3:4, 1)]) 
> r3_1parts <- do.call("rbind", dfs[2]) 
> 
> r3_3parts 
    value1 value2 tosplit 
3.7  7 1300  3 
3.8  8 1350  3 
3.9  9 1400  3 
4.10  10 1450  4 
4.11  11 1500  4 
4.12  12 1550  4 
1.1  1 1000  1 
1.2  2 1050  1 
1.3  3 1100  1 
> r3_1parts 
    value1 value2 tosplit 
2.4  4 1150  2 
2.5  5 1200  2 
2.6  6 1250  2 
> 
> 
> #Replicate 4 
> r4_3parts <- do.call("rbind", dfs[c(4, 1:2)]) 
> r4_1parts <- do.call("rbind", dfs[3]) 
> 
> r4_3parts 
    value1 value2 tosplit 
4.10  10 1450  4 
4.11  11 1500  4 
4.12  12 1550  4 
1.1  1 1000  1 
1.2  2 1050  1 
1.3  3 1100  1 
2.4  4 1150  2 
2.5  5 1200  2 
2.6  6 1250  2 
> r4_1parts 
    value1 value2 tosplit 
3.7  7 1300  3 
3.8  8 1350  3 
3.9  9 1400  3 
> 

Это не кажется, вариант в пакеты, которые я могу найти - они по умолчанию просто создать статистику для вас. Я хочу увидеть образцы наборов данных, а также указать их относительный размер. Возможно ли это в существующем пакете, или если нет, есть ли подходящий способ определить это более автоматизированным способом?

ответ

1

Без случайного компонента это на самом деле не ударяет меня как бутстрап. Кажется, вы преследуете вариацию на перестановку.

Кадр данных можно разбить с помощью довольно простой функции.

df <- 
    data.frame(value1 = 1:(3*4), 
      value2 = seq(from = 1000, by = 50, length.out = 3*4), 
      tosplit = rep(1:4, each = 3)) 

split_into_two <- function(data, split_var, split_val){ 
    split <- data[[split_var]] %in% split_val 

    split(data, split) 
} 

split_into_two(df, "tosplit", 1:3) 

Чтобы получить четыре перестановки, которые вы описываете, мы можем использовать lapply:

lapply(list(1:3, 2:4, c(4, 1:2), c(3:4, 1)), 
     function(x) split_into_two(df, "tosplit", x)) 

Это экономит много копирования и вставки.

+0

Спасибо @Benjamin. Мне сообщили, что это была начальная загрузка, и во всех обсуждениях с моим доктором PhD он упоминался как таковой. Но теперь я вижу, что более подходящим определением для этого является передискретизация Джек-нофа. Я обновлю описание, чтобы соответствовать этому. – Visser