2017-03-01 10 views
1

R의 함수에 관한 질문이 있습니다. 클러스터 된 데이터를 부트 스트래핑하는 데 사용하려는 함수입니다. 각 부트 스트랩 복제본에 내 gee 모델을 사용하고 싶습니다. 내 기능을 사용할 때 객체 "id"가 발견되지 않는다는 오류가 발생합니다. 나는 그것이 지구 환경의 사용과 관련이있을 것이라고 생각합니다.함수 내에서 geeglm을 사용할 때 범위 지정 문제

내 데이터는 다음과 같은 구조했습니다

Outcome Time Treatment Cluster ID 
500  1 1   Carl 1 
800  2 1   Carl 1 
1000 3 1   Carl 1 
1200 1 2   Pete 2 
400  2 2   Pete 2 
550  3 2   Pete 2 
300  1 1   Rose 3 

내 구문은 다음

clusbootreg <- function(formula,family,data,id, waves,corstr,cluster, reps=4){ 
    reg1 <- geeglm(formula,family,data,id,waves,corstr) 
    clusters <- names(table(cluster)) 
    sterrs <- matrix(NA, nrow=reps, ncol=length(coef(reg1))) 
    for(i in 1:reps){ 
    index <- sample(1:length(clusters), length(clusters), replace=TRUE) 
    aa <- clusters[index] 
    bb <- table(aa) 
    bootdat <- NULL 
    for(j in 1:max(bb)){ 
     cc <- data[cluster %in% names(bb[bb %in% j]),] 
     for(k in 1:j){ 
     bootdat <- rbind(bootdat, cc) 
     } 
    } 
    sterrs[i,] <- coef(geeglm(formula,family,bootdat,id,waves,corstr)) 
    } 
    val <- cbind(coef(reg1),apply(sterrs,2,sd)) 
    colnames(val) <- c("Estimate","Std. Error") 
    return(val) 
} 

clusbootreg(formula=Outcome~Treatment+Time+Time*Treatment,family=Gamma(link = "log"),data=data,id=ID,waves=Time, cluster=data$Cluster, reps=4) 

다음과 같은 오류 메시지가 나타납니다

Error in eval(expr, envir, enclos) : object 'id' not found 

이 방법을 알고있는 사람이 있습니까 이 문제를 해결하려면? 나는 이틀 동안 붙어있다.

역 추적은 나에게 알려주는

11: eval(expr, envir, enclos) 
10: eval(extras, data, env) 
9: model.frame.default(formula = formula, data = data, subset = waves, 
     weights = id, na.action = corstr, drop.unused.levels = TRUE) 
8: stats::model.frame(formula = formula, data = data, subset = waves, 
     weights = id, na.action = corstr, drop.unused.levels = TRUE) 
7: eval(expr, envir, enclos) 
6: eval(mf, parent.frame()) 
5: glm(formula = formula, family = family, data = data, weights = id, 
     subset = waves, na.action = corstr) 
4: eval(expr, envir, enclos) 
3: eval(glmcall, parent.frame()) 
2: geeglm(formula, family, data, id, waves, corstr) at #2 
+0

'id = data $ ID'를 전달해야한다고 생각합니다. – Roland

+0

의견을 보내 주셔서 감사합니다. 나는 이미 그것을 시도했지만 작동하지 않았다 .. – MaartjeG

+0

글쎄,'traceback()'은 무엇을 말하는가? 오류가 발생한 정확한 위치를 찾아야합니다. – Roland

답변

0

당신은 위치 인수 매칭 및 명명 된 인수의 차이를 조사해야 다음. 모든 실수를 바로 잡은 후에도 오류는 계속 발생합니다.

문제는 함수 본문 외부에서 수식을 만들어 전역 환경과 연결되는 문제입니다. 다음을 수정해야합니다 :

testDF <- read.table(text = "Outcome Time Treatment Cluster ID 
        500  1 1   Carl 1 
        800  2 1   Carl 1 
        1000 3 1   Carl 1 
        1200 1 2   Pete 2 
        400  2 2   Pete 2 
        550  3 2   Pete 2 
        300  1 1   Rose 3", header = TRUE) 

library(geepack) 

clusbootreg <- function(formula,family,data,id, waves,corstr,cluster, reps=4){ 

    environment(formula) <- environment() #associate the correct environment with the formula 
    geeglm(formula,family,data,id = id, waves = waves, corstr = corstr) 

} 

clusbootreg(formula=Outcome~Treatment+Time+Time*Treatment, 
      family=Gamma(link = "log"), 
      data=testDF,id=testDF$ID,waves=testDF$Time, 
      cluster=data$Cluster, reps=4, corstr = "independence") 
#works 
+0

시간 내 주셔서 감사합니다. 왜 더 자세히보아야하지만 완벽하게 작동합니다. – MaartjeG