有哪些替代方法可以在公式中指定二项式成功/试验?

时间:2013-10-24 13:50:07

标签: r formula

假设您正在对二项式数据进行建模,其中每个响应是来自多个试验(N)的一些成功(y)以及一些解释变量(a和b)。有一些函数可以执行此类操作,并且它们似乎都使用不同的方法来指定y和N.

在glm中,你做glm(cbind(y,N-y)~a+b, data = d)(LHS的成功/失败矩阵)

在inla中,您执行inla(y~a+b, Ntrials=d$N, data=d)(分别指定试验次数)

在glmmBUGS中,你做glmmBUGS(y+N~a+b,data=d)(指定成功+试验作为LHS的条款)

在编写新方法时,我一直认为最好遵循glm的功能,因为人们通常会首先遇到二项式响应数据。但是,我永远不会记得它是cbind(y,N-y)还是cbind(y,N) - 我通常似乎在我的数据中有成功/数量的试验,而不是成功/失败次数 - YMMV。

当然,其他方法也是可能的。例如,使用RHS上的函数来标记变量是试验次数还是失败次数:

myblm( y ~ a + b + Ntrials(N), data=d)
myblm( y ~ a + b + Nfails(M), data=d)  # if your dataset has succ/fail variables

或定义一个运算符来执行一个cbind,所以你可以这样做:

myblm( y %of% N ~ a + b, data=d)
因此,它为LHS增添了一些含义,使其明确。

有没有人有更好的想法?什么是正确的方法?

3 个答案:

答案 0 :(得分:1)

您也可以让y成为分数,在这种情况下您需要提供weights。它不在formula参数中,而是几乎相同数量的击键,就好像它在formula中一样。这是一个例子

> set.seed(73574836)
> x <- runif(10)
> n <- sample.int(10, 2)
> y <- sapply(mapply(rbinom, size = 1, n, (1 + exp(1 - x))^-1), function(x) 
+   sum(x == 1))
> df <- data.frame(y = y, frac = y / n, x = x, weights = n)
> df
   y  frac      x weights
1  2 1.000 0.9051       2
2  5 0.625 0.3999       8
3  1 0.500 0.4649       2
4  4 0.500 0.5558       8
5  0 0.000 0.8932       2
6  3 0.375 0.1825       8
7  1 0.500 0.1879       2
8  4 0.500 0.5041       8
9  0 0.000 0.5070       2
10 3 0.375 0.3379       8
> 
> # the following two fits are identical
> summary(glm(cbind(y, weights - y) ~ x, binomial(), df))

Call:
glm(formula = cbind(y, weights - y) ~ x, family = binomial(), 
    data = df)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-1.731  -0.374   0.114   0.204   1.596  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)
(Intercept)   -0.416      0.722   -0.58     0.56
x              0.588      1.522    0.39     0.70

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 9.5135  on 9  degrees of freedom
Residual deviance: 9.3639  on 8  degrees of freedom
AIC: 28.93

Number of Fisher Scoring iterations: 3

> summary(glm(frac ~ x, binomial(), df, weights = weights))

Call:
glm(formula = frac ~ x, family = binomial(), data = df, weights = weights)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-1.731  -0.374   0.114   0.204   1.596  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)
(Intercept)   -0.416      0.722   -0.58     0.56
x              0.588      1.522    0.39     0.70

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 9.5135  on 9  degrees of freedom
Residual deviance: 9.3639  on 8  degrees of freedom
AIC: 28.93

Number of Fisher Scoring iterations: 3

上述工作的原因归结为glm实际上对二项式结果所做的事情。无论您如何指定结果,它都会计算每次观察的分数和与观察相关的权重。以下是来自?glm的摘录,其中提供了估算中的内容

  

如果通过提供双列响应来指定binomial glm模型,   prior.weights返回的权重是案例总数   (由提供的案例权重计算)和组件y   结果是成功的比例。

或者,您可以使用glm.fitglmmodel.frame制作包装器。请参阅...

中的?model.frame参数
  对于...方法,

model.frame,混合了诸如的其他参数   要传递给默认方法的数据na.actionsubset。任何   其他参数(例如offsetweights或其他名称   达到默认方法的参数)用于进一步创建   模型框架中的列,带括号括起的名称   "(offset)"

注释

之后我看到了Ben Bolker的评论。以上是他指出的内容。

答案 1 :(得分:0)

我喜欢glm文档中的这个方法:

  

对于二项式和准二项式家族,反应也可以   指定为一个因子(当第一个级别表示失败时,全部   其他人的成功)

这与我的经验中经常出现的成功和失败的方式很吻合。一个是全能(例如&#34;没有投票&#34;)并且有多种方式来实现另一个(例如&#34;投票给A&#34;,&#34;投票支持B&#34;)。我希望从我说出这个&#34;成功&#34;的方式中可以清楚地看出来。和&#34;失败&#34;由HEAD定义的可以任意定义,以便第一级对应于&#34;失败&#34;而所有其他级别都是成功的&#34;。

答案 2 :(得分:-2)

来自r的glm帮助页面: “......或作为一个双列矩阵,列中的数字为成功失败

所以它必须是cbind(Y,N-Y)