在函数中使用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
答
你应该看看位置参数的匹配和命名参数之间的差异。纠正所有错误后,错误仍然存在。
问题是您在函数体外创建公式,导致它与全局环境关联。你需要修复:
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
我认为你应该通过'id = data $ ID'。 – Roland
谢谢您的评论;我已经试过,但它没有工作.. – MaartjeG
那么,'traceback()'告诉你什么?您需要找出错误发生的位置。 – Roland