Bootstrap двусторонний большой набор данных

Возможный дубликат:
загрузить большой набор данных

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

rm(list=ls())

data <- 1:72

Создайте двухстороннюю матрицу данных:

charDataDiff <- matrix(data, nrow=9,ncol=8)
varNames <- c("A", "B", "C","A", "B", "C","A", "B", "C")

Добавьте столбец символов в матрицу charDataDiff:

charDataDiff <- cbind(varNames ,data.frame(charDataDiff))

Добавьте имена столбцов:

colnames(charDataDiff) <- c("patchId","s380","s390","s400","s410","s420","s430","s440","s450")

Разделите данные, используя переменную строки "patchId" в качестве критерия. Это создает три списка: по одному для каждой переменной.

idColor <-  c("A", "B", "C")

(patchSpectrum <- lapply(idColor, function(idColor) charDataDiff[charDataDiff$patchId==idColor,]))

Создал функцию sampleBoot для выборки patchSpectrum.

sampleBoot <-  function(nbootstrap=2, patch=3){
    return(lapply(1:nbootstrap, function(i)
             {patchSpectrum[[patch]][sample(1:nrow(patchSpectrum[[patch]]),replace=TRUE),]}))}

Список «k» отвечает на мой вопрос. Однако я думаю, что мой код медленный для большого набора данных и большой начальной загрузки. Я загружаю только 10 итераций для трех переменных строк. Приветствуется более быстрый и элегантный код.

numBoots <- 10
for (i in 1: numBoots)
        k <- lapply(1:3, function(n)
                    do.call(rbind, lapply(sampleBoot(i, n), function(x) apply(x[-1], 2, median))))
k

person Ragy Isaac    schedule 28.10.2012    source источник
comment
В вашем последнем цикле похоже, что k перезаписывается на каждой итерации, поэтому вы получаете только k для i == numBoots. Это предназначено?   -  person flodel    schedule 28.10.2012


Ответы (1)


Что я могу предоставить, так это чистый переписывание вашего кода:

  1. Я разбил длинные куски на функции с соответствующими именами, чтобы читалось лучше,
  2. Я избавился от столбца varNames, вместо этого использовал by для разделения ваших данных, как предложил @KenWilliams в вашем предыдущем вопросе,
  3. Я использовал replicate вместо lapply,
  4. Я избавился от ненужного цикла for, на который указал в своем комментарии.

Так он должен работать быстрее; если нет, я бы посоветовал вам попробовать профилировать его.


charDataDiff <- matrix(1:72, nrow = 9, ncol = 8)
colnames(charDataDiff) <- c("s380", "s390", "s400", "s410",
                            "s420", "s430", "s440", "s450")

varNames      <- c("A", "B", "C", "A", "B", "C", "A", "B", "C")
patchSpectrum <- by(charDataDiff, varNames, data.frame)

sampleOne   <- function(x) x[sample(seq_len(nrow(x)), replace = TRUE), ]
sampleBoot  <- function(x, n) replicate(n, sampleOne(x), simplify = FALSE)
applyMedian <- function(l) do.call(rbind, lapply(l, apply, 2, median))

k <- lapply(lapply(patchSpectrum, sampleBoot, n = 10), applyMedian)
person flodel    schedule 28.10.2012
comment
Спасибо, молодец, это ответ на мой вопрос. - person Ragy Isaac; 28.10.2012
comment
Большое спасибо, flodel, переписывание идеально. Я хотел бы дать вам больше баллов, но система не позволила бы мне это сделать. - person Ragy Isaac; 16.03.2013