2013-11-20 39 views
1

我有100個概率與我在此處創建並顯示的四個獨特個體(AAA:DDD)關聯。引導樣本並生成標準錯誤(SE)的函數

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.50截斷將概率離散爲0和1,然後對向量進行求和。

我已經創建了下面的函數進行離散和求和。

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)我想引導習題,離散他們使用0.50作爲隔斷,總結所產生的0和1。我想對每個AAA:DDD執行此操作R = 10(僅對於實例較低,但對於實際數據重複R = 10000)次,然後提取對象的標準錯誤。

關於如何改善我的循環以上的建議,將不勝感激。具體如何正確地將「統計」參數納入循環中的boot()

在此先感謝。

回答

1

你必須包括對boot功能

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

而且索引參數idx,讓SE,它可能是清潔劑使用sd(b$t)代替sqrt(var(b$t)

+0

多謝@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 –

+2

要跟隨你的榜樣,在for循環您索引因子水平AAA-DDD,而數字矢量SE沒有按」沒有分配名稱。函數不知道將值放在哪裏,並簡單地將輸出與SE向量連接起來。在運行for循環之前,您必須爲矢量指定級別名稱names(SE) <- unique(Data$IndID) TWL

+0

再次完美!謝謝。 –