在函数中使用geeglm时的范围问题

问题描述:

我有一个关于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

你应该看看位置参数的匹配和命名参数之间的差异。纠正所有错误后,错误仍然存​​在。

问题是您在函数体外创建公式,导致它与全局环境关联。你需要修复:

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