1

我正在使用 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 中的错误(substitute(expr), data, enclos = parent.frame()):invalid 'envir' argument”。但这并没有告诉我任何我能理解的东西。

想法?

4

1 回答 1

2

感谢您在现有错误报告[#2294] objects not found when BTm not called in global environment上链接到这篇文章。

在内部设置数据时,BTm 在公式环境中查找对象,然后在全局环境中查找对象。如果没有为 BTm 指定公式,则公式在内部定义,并且按照当前的实现方式,继承调用 BTm 时构建的环境,而不是调用 BTm 的环境。

在我解决这个问题之前,有一个简单的解决方法 - 在函数中使用 BTm 时始终指定一个公式,以便公式的环境是在调用函数时创建的。例如

> 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 
于 2013-02-18T12:27:53.257 回答