R模型拟合程序无法在函数中运行

时间:2013-02-16 14:46:04

标签: r

我正在使用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'参数”。但这并没有告诉我任何我能理解的事情。

思想?

1 个答案:

答案 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