2010-07-28 3 views
1

Рассмотрим следующий код:помочь мне улучшить мой самозагрузки

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) 

мне было интересно, если я могу поставить загрузку: загрузки() работать функция, которая имеет в своем выходе вектор длины п> 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()? Любые указатели очень ценятся.

.: EDIT :.

Анико предложил изменить мою функцию таким образом, чтобы включить индекс. При чтении документации для 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), он работает нормально.

ответ

2

С помощью файла для boot функции:

In all other cases statistic must take at least two arguments. The first argument passed will always be the original data. The second will be a vector of indices, frequencies or weights which define the bootstrap sample.

Так что вам нужно добавить второй параметр к вашей 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 
+0

Претензии к этой ошибке: x <- boot (data = data, statistic = bootstrapDistances2, R = 100, binx = binx) Ошибка в t.star [r,] <- статистика (данные , i [r,], ...): Количество элементов для замены не кратно номеру замены –

+0

После перезагрузки моей сессии R все работает нормально. Тьфу? Спасибо за ваше сотрудничество. –

0

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

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

+0

Теперь я вижу это - он говорит «статистика (ы)»! –

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