2013-05-20 3 views
1

함수에 대한 입력 인 많은 데이터 세트가 있습니다. 데이터는 데이터 테이블에 저장되며 필자의 함수 출력에 대한 신뢰 구간을 계산합니다. 그러나 입력 데이터가 모두 같아서 오류가 발생하는 경우가 있습니다. "x 값은 모두 100입니다. \ n 신뢰 구간을 계산할 수 없습니다."어떻게이 오류를 피할 수 있습니까 (예 : 신뢰 구간 설정 모든 값이 같은 경우 0 또는 NA와 같은 임의의 값으로)?샘플링 된 세트의 모든 값이 같을 때 R boot.ci 함수에서 오류를 피하십시오.

library(boot) 
library(data.table) 

problem=1 

data<-data.table(column1=c(1:100),column2=c(rep(100,99),problem)) 
resample.number=1000 
confidence=0.95 

sample.mean<-function(indata,x){mean(indata[x])} 

boot_obj<-lapply(data,boot,statistic = sample.mean,R = resample.number) 

boot.mean.f<-function(x,column){ 
    x[column][1] 
} 

means<-data.table(sapply(boot_obj,boot.mean.f)) 
bootci_obj<-lapply(boot_obj,boot.ci, conf = confidence, type = "perc") 
bootci.f<-function(x,column){ 
    x<-x[column][4] 
    x<-unlist(strsplit(as.character(x[1]),",")) 
    x<-sub("[:punct:].*","",x) 
    x<-sub("lis.*","",x) 
    x<-sub(").?","",x) 
    x<-na.omit(as.numeric(x)) 
} 

cis<-data.table(t(sapply(bootci_obj,bootci.f))) 
setnames(means,"V1","stat") 

cis[,V1:=NULL] 
cis[,V2:=NULL] 
setnames(cis,c("V3","V4"),c("lci","uci")) 

return(cbind(means,cis)) 

반환 : 예를 들어

stat  lci  uci 
1: 50.5 44.96025 56.26797 
2: 99.01 97.03000 100.00000 

problem=1 

리턴 변경 : 다른 오류로 연결 "n은 신뢰 구간을 계산할 수 없습니다 \ t의 모든 값은 100과 동일하다" .

내가 할 결과를 싶습니다

stat  lci  uci 
1: 50.5 44.96025 56.26797 
2: 100.0 0.0000 0.00000 

도움말/생각이 많이 감사합니다!

답변

5

긴 형식의 data.table로 작업하는 것이 훨씬 효율적이기 때문에 data.table을 스택했습니다. 나는 또한 모든 값이 같으면 신뢰 한계를 평균값과 같은 값으로 설정하는 것을 선호합니다. 원하는대로 조정하십시오. boot.ci 그냥 경고를 제공하고 모든 값이 동일한 경우, NA 값을 반환

library(boot) 
library(data.table) 

DT <- data.table(column1=1:100,column2=rep(100,100)) 
DT <- data.table(stack(DT)) 

resample.number=1000 
confidence=0.95 

sample.mean <- function(indata,x){mean(indata[x])} 
ci.mean <- function(x, resample.number,confidence) { 
    if(length(unique(x)) > 1) { 
    temp <- boot.ci(boot(x,statistic = sample.mean,R = resample.number), conf = confidence, type = "perc")$percent 
    list(mean=mean(x),lwr=temp[,4],upr=temp[,5]) 
    } else { 
    list(mean=mean(x),lwr=mean(x),upr=mean(x) 
    } 
} 

set.seed(42) 
DT[,ci.mean(values,resample.number,confidence),by=ind] 

#  ind mean  lwr  upr 
#1: column1 50.5 44.92305 55.93949 
#2: column2 100.0 100.00000 100.00000 

참고. 오류가 없으며 국가 표준 협회 (NAs)와 함께 일할 수 있다면 if 조건이 필요하지 않습니다.

+0

내 문제를 해결하기 위해보다 효율적인 코드도 제공했습니다. * LOVE * 스택 사용. 나는 또한 당신이 boot.ci 함수로부터 데이터를 추출한 더 읽기 쉬운 방법을 좋아한다. 내가 할 수 있다면 +10. – Docuemada