Проблемы с областями видимости при использовании geeglm внутри функции

У меня есть вопрос, касающийся функции в использовании R I. Это функция, которую я хочу использовать для начальной загрузки моих кластеризованных данных. Я хочу использовать свою модель для каждой копии начальной загрузки. Когда я использую свою функцию, я получаю сообщение о том, что объект "id" не найден. Я думаю, что это может быть связано с использованием глобальной и локальной среды.

Мои данные имеют следующую структуру:

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

Есть кто-нибудь, кто знает, как это решить? Я застрял на два дня.

Traceback говорит мне следующее

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

1 ответ

Вы должны посмотреть на разницу между сопоставлением позиционных аргументов и именованными аргументами. После того, как я исправил все ошибки, ошибка все еще сохраняется.

Проблема заключается в том, что вы создаете формулу вне тела функции, в результате чего она связана с глобальной средой. Вам нужно исправить это:

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
Другие вопросы по тегам