我正在使用Firth和Turner的BradleyTerry2包进行配对比较,但使用主拟合函数 BTm 遇到了一个神秘的问题。以下是来自他们自己的示例的最小数据设置:
data(citations, package = "BradleyTerry2")
citations.sf <- countsToBinomial(citations)
names(citations.sf)[1:2] <- c("journal1", "journal2")
所以在控制台上有以下工作:
citeModel <- BTm(cbind(win1, win2), journal1, journal2, data = citations.sf)
但以下不工作
f1 <- function(x){ BTm(cbind(win1, win2), journal1, journal2, data=x) }
f1(citations.sf)
虽然这个(统计上没有意义但是)结构相似的线性模型示例确实正常工作,正如我所期望的那样:
f2 <- function(x){ lm(log(win1/win2) ~ journal1, data=x) }
f2(citations.sf)
f1的错误是“eval中的错误(替换(expr),data,enclos = parent.frame()):无效的'envir'参数”。但这并没有告诉我任何我能理解的事情。
思想?
答案 0 :(得分:2)
感谢您在现有错误报告[#2294] objects not found when BTm not called in global environment上链接到此帖子。
在内部设置数据时,BTm会在公式环境中查找对象,然后在全局环境中查找对象。如果未将公式指定为BTm,则公式在内部定义,并且如当前实现的那样,继承在调用BTm时构造的环境,而不是调用BTm的环境。
在我解决这个问题之前,有一个简单的解决方法 - 在函数内部使用BTm时总是指定一个公式,这样公式的环境就是在调用函数时创建的。 E.g。
> f1 <- function(x){ BTm(cbind(win1, win2), journal1, journal2, ~.., data=x) }
> f1(citations.sf)
Bradley Terry model fit by glm.fit
Call: BTm(outcome = cbind(win1, win2), player1 = journal1, player2 = journal2,
formula = ~.., data = x)
Coefficients:
..Comm Statist ..JASA ..JRSS-B
-2.9491 -0.4796 0.2690
Degrees of Freedom: 6 Total (i.e. Null); 3 Residual
Null Deviance: 1925
Residual Deviance: 4.293 AIC: 46.39