2017-03-01 7 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 

は方法を知っている誰もがありますこれを解決するには?私は今、2日間立ち往生しています。

トレースバックは私にあなたが位置引数のマッチングと名前付き引数との違いになります以下

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

関連する問題