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