помогите мне улучшить мой бутстрап

Рассмотрим следующий код:

require(Hmisc)
num.boots <- 10
data <- rchisq(500, df = 5) #generate fake data

#create bins
binx <- cut(data, breaks = 10)
binx <- levels(binx)
binx <- sub("^.*\\,", "", binx)
binx <- as.numeric(substr(binx, 1, nchar(binx) - 1))

#pre-allocate a matrix to be filled with samples
output <- matrix(NA, nrow = num.boots, ncol = length(binx)) 

#do random sampling from the vector and calculate percent
# of values equal or smaller to the bin number (i)
for (i in 1:num.boots) {
    walk.pair.sample <- sample(data, size = length(data), replace = TRUE)
    data.cut <- cut2(x = walk.pair.sample, cuts = binx)
    data.cut <- table(data.cut)/sum(table(data.cut))
    output[i, ] <- data.cut
}

#do some plotting
plot(1:10, seq(0, max(output), length.out = nrow(output)), type = "n", xlab = "", ylab = "")

for (i in 1:nrow(output)) {
    lines(1:10, output[i, 1:nrow(output)])
}

#mean values by columns
output.mean <- apply(output, 2, mean)
lines(output.mean, col="red", lwd = 3)
legend(x = 8, y = 0.25, legend = "mean", col = "red", lty = "solid", lwd = 3)

Мне было интересно, могу ли я предоставить функции boot:boot() функцию, которая имеет на выходе вектор длины n > 1? Это вообще возможно?

Вот мои слабые попытки, но я, должно быть, делаю что-то не так.

require(boot)
bootstrapDistances <- function(data, binx) {
    data.cut <- cut2(x = data, cuts = binx)
    data.cut <- table(data.cut)/sum(table(data.cut))
    return(data.cut)
}

> x <- boot(data = data, statistic = bootstrapDistances, R = 100)
Error in cut.default(x, k2) : 'breaks' are not unique

Я действительно не понимаю, почему Hmisc::cut2() не работает должным образом в вызове boot(), но работает, когда я вызываю его в цикле for() (см. код выше). Возможна ли логика моей функции bootstrapDistances() с boot()? Любые указатели очень ценятся.

.:РЕДАКТИРОВАТЬ:.

Анико предложила изменить мою функцию таким образом, чтобы включить индекс. При чтении документации по boot() мне было непонятно, как это работает, что объясняет, почему эта функция может не работать. Вот новая функция, которую предложила Анико:

bootstrapDistances2 <- function(data, idx, binx) { 
  data.cut <- cut2(x = data[idx], cuts = binx) 
  data.cut <- table(data.cut)/sum(table(data.cut)) 
  return(data.cut) 
} 

Однако мне удалось выдать ошибку, и я все еще работаю над ее устранением.

> x <- boot(data = data, statistic = bootstrapDistances2, R = 100, binx = binx)
Error in t.star[r, ] <- statistic(data, i[r, ], ...) : 
  number of items to replace is not a multiple of replacement length

После того, как я перезапустил сеанс R (также попробовал другую версию, 2.10.1), похоже, он работает нормально.


person Roman Luštrik    schedule 28.07.2010    source источник


Ответы (2)


Из файла справки для функции boot:

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

Поэтому вам нужно добавить второй параметр в вашу функцию bootstrapDistances, которая сообщит ей, какие элементы данных выбраны:

bootstrapDistances2 <- function(data, idx, binx) { 
  data.cut <- cut2(x = data[idx], cuts = binx) 
  data.cut <- table(data.cut)/sum(table(data.cut)) 
  return(data.cut) 
} 

И результаты:

x <- boot(data = data, statistic = bootstrapDistances2, R = 100, binx=binx)
x

ORDINARY NONPARAMETRIC BOOTSTRAP


Call:
boot(data = data, statistic = bootstrapDistances2, R = 100, binx = binx)


Bootstrap Statistics :
     original   bias    std. error
t1*     0.208  0.00134 0.017342783
t2*     0.322  0.00062 0.021700803
t3*     0.190 -0.00034 0.018873433
t4*     0.136 -0.00116 0.016206197
t5*     0.078 -0.00120 0.011413265
t6*     0.036  0.00070 0.008510837
t7*     0.016  0.00074 0.005816417
t8*     0.006  0.00024 0.003654581
t9*     0.000  0.00000 0.000000000
t10*    0.008 -0.00094 0.003368961
person Aniko    schedule 28.07.2010
comment
Спасибо за попытку, но я получаю эту ошибку: x ‹- загрузка (данные = данные, статистика = bootstrapDistances2, R = 100, binx = binx) Ошибка в t.star[r, ] ‹- статистика (данные, i[r, ], ...) : количество элементов для замены не кратно длине замены - person Roman Luštrik; 29.07.2010
comment
После перезапуска моего сеанса R все заработало нормально. Фу? Спасибо за ваше сотрудничество. - person Roman Luštrik; 29.07.2010

Хороший ответ, Анико.

Кроме того, на странице справки для «boot» указано, что статистическая функция начальной загрузки может возвращать вектор, а не просто скаляр.

person pteetor    schedule 28.07.2010
comment
Теперь я вижу это - там написано статистика(ы)! - person Roman Luštrik; 29.07.2010