Рассмотрим следующий код:
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), похоже, он работает нормально.