Функция для начальной загрузки образца и генерации стандартной ошибки (SE)

У меня есть 100 вероятностей, связанных с четырьмя уникальными людьми (AAA:DDD), которых я создал и отобразил здесь.

IndID <- as.factor(rep(c("AAA", "BBB", "CCC", "DDD"),25))
Prob <- runif(length(IndID),0,1)
Data <- data.frame(IndID, Prob)
Data <- Data[order(Data$IndID),]

> head(Data)
   IndID      Prob
1    AAA 0.5860417
5    AAA 0.1824266
9    AAA 0.3301014
13   AAA 0.5048122
17   AAA 0.3717195
21   AAA 0.9090825

> summary(Data)
 IndID         Prob        
 AAA:25   Min.   :0.01341  
 BBB:25   1st Qu.:0.19743  
 CCC:25   Median :0.48315  
 DDD:25   Mean   :0.50475  
          3rd Qu.:0.81789  
          Max.   :0.99805 

Я хочу загрузить (образец с заменой) вероятности для каждого отдельного AAA: DDD. Для каждой итерации я хочу дискретизировать вероятности до 0 и 1, используя отсечение 0,50, а затем суммировать вектор.

Я создал функцию ниже, которая дискретизирует и суммирует.

BiSum <- function(x){
    IndBi <- ifelse(x >= 0.50, 1,0)
    SumIndBi <- sum(IndBi)
    }

Я хочу применить функцию к вероятности для каждого человека в цикле for() и использовать функцию boot(), как показано ниже.

require(boot)

SE <- numeric(length(unique(Data$IndID)))
for (i in unique(Data$IndID)){
    IndProbs <- Data$Prob[Data$IndID == i]
    b <- boot(IndProbs, BiSum, R=10)
    SE[i] <- sqrt(var(b$t))     #This is a roundabout way to grab the SE from a boot() object
        }

Хотя я считаю функцию BiSum правильной, она неправильно включена в цикл for() и функцию boot(). Цикл выше приводит к ошибке:

Error in statistic(data, original, ...) : unused argument (original).

Моя цель: для каждого человека (AAA:DDD) я хочу запустить Prob, дискретизировать их, используя 0,50 в качестве отсечки, и суммировать полученные 0 и 1. Я хочу сделать это R = 10 (например, только низкое, но будет повторять R = 10000 с реальными данными) раз для каждого AAA: DDD, а затем извлечь стандартную ошибку объекта boot().

Предложения о том, как улучшить мой цикл выше, будут оценены. В частности, как правильно включить «статистический» аргумент в boot() внутри цикла.

Заранее спасибо.


person B. Davis    schedule 20.11.2013    source источник


Ответы (1)


Вы должны включить индексный аргумент idx для функции boot

BiSum <- function(x, idx){
     IndBi <- ifelse(x[idx] >= 0.50, 1,0)
     SumIndBi <- sum(IndBi)
}

Кроме того, чтобы получить SE, может быть чище использовать sd(b$t) вместо sqrt(var(b$t)

person TWL    schedule 20.11.2013
comment
Большое спасибо @TWL. Добавление idx отлично работает. Как видно из выходных данных SE, включенных сюда, в дополнение к IndID есть четыре дополнительных 0,00000. Есть мысли, откуда они? Спасибо еще раз. > SE AAA BBB 0.000000 0.000000 0.000000 0.000000 0.000000 2.436967 2.312056 CCC DDD EEE 2,487526 2,381884 2,497726 - person B. Davis; 20.11.2013
comment
Чтобы следовать вашему примеру, в цикле for вы индексируете уровни факторов AAA-DDD, в то время как числовой вектор SE не имеет назначенных имен. Функция не знает, куда поместить значения, и просто объединяет вывод с вектором SE. Вы должны присвоить имена уровней вектору перед запуском цикла for ‹code›names(SE) ‹-unique(Data$IndID)‹/code› - person TWL; 20.11.2013
comment
Снова идеально! Спасибо. - person B. Davis; 20.11.2013