binom2.orUC.RdDensity and random generation for a bivariate binary regression model using an odds ratio as the measure of dependency.
rbinom2.or(n, mu1, mu2 = if (exchangeable) mu1 else
stop("'mu2' not specified"),
oratio = 1, exchangeable = FALSE, tol = 0.001,
twoCols = TRUE, colnames = if (twoCols) c("y1","y2")
else c("00", "01", "10", "11"), ErrorCheck = TRUE)
dbinom2.or(mu1, mu2 = if (exchangeable) mu1 else
stop("'mu2' not specified"), oratio = 1,
exchangeable = FALSE, tol = 0.001,
colnames = c("00", "01", "10", "11"), ErrorCheck = TRUE)number of observations.
Same as in runif.
The arguments mu1, mu2, oratio
are recycled to
this value.
The marginal probabilities.
Only mu1 is needed if exchangeable = TRUE.
Values should be between 0 and 1.
Odds ratio. Must be numeric and positive. The default value of unity means the responses are statistically independent.
Logical. If TRUE, the two marginal probabilities are
constrained to be equal.
Logical.
If TRUE, then a \(n\) \(\times\) \(2\)
matrix of 1s
and 0s is returned.
If FALSE, then a \(n\) \(\times\) \(4\)
matrix of 1s
and 0s is returned.
The dimnames argument of
matrix is
assigned list(NULL, colnames).
Tolerance for testing independence. Should be some small positive numerical value.
Logical. Do some error checking of the input parameters?
The function rbinom2.or generates data coming from a
bivariate binary response model.
The data might be fitted with
the VGAM family function binom2.or.
The function dbinom2.or does not really compute the
density (because that does not make sense here) but rather
returns the four joint probabilities.
The function rbinom2.or returns
either a 2 or 4 column matrix of 1s and 0s, depending on the
argument twoCols.
The function dbinom2.or returns
a 4 column matrix of joint probabilities; each row adds up
to unity.
nn <- 1000 # Example 1
ymat <- rbinom2.or(nn, mu1 = logitlink(1, inv = TRUE),
oratio = exp(2), exch = TRUE)
(mytab <- table(ymat[, 1], ymat[, 2], dnn = c("Y1", "Y2")))
#> Y2
#> Y1 0 1
#> 0 143 104
#> 1 133 620
(myor <- mytab["0","0"] * mytab["1","1"] / (mytab["1","0"] *
mytab["0","1"]))
#> [1] 6.409774
fit <- vglm(ymat ~ 1, binom2.or(exch = TRUE))
coef(fit, matrix = TRUE)
#> logitlink(mu1) logitlink(mu2) loglink(oratio)
#> (Intercept) 1.038187 1.038187 1.842738
bdata <- data.frame(x2 = sort(runif(nn))) # Example 2
bdata <- transform(bdata,
mu1 = logitlink(-2 + 4 * x2, inverse = TRUE),
mu2 = logitlink(-1 + 3 * x2, inverse = TRUE))
dmat <- with(bdata, dbinom2.or(mu1 = mu1, mu2 = mu2,
oratio = exp(2)))
ymat <- with(bdata, rbinom2.or(n = nn, mu1 = mu1, mu2 = mu2,
oratio = exp(2)))
fit2 <- vglm(ymat ~ x2, binom2.or, data = bdata)
coef(fit2, matrix = TRUE)
#> logitlink(mu1) logitlink(mu2) loglink(oratio)
#> (Intercept) -2.368063 -1.100885 1.951243
#> x2 4.576599 3.249613 0.000000
if (FALSE) { # \dontrun{
matplot(with(bdata, x2), dmat, lty = 1:4, col = 1:4,
main = "Joint probabilities", ylim = 0:1, type = "l",
ylab = "Probabilities", xlab = "x2", las = 1)
legend("top", lty = 1:4, col = 1:4,
legend = c("1 = (y1=0, y2=0)", "2 = (y1=0, y2=1)",
"3 = (y1=1, y2=0)", "4 = (y1=1, y2=1)"))
} # }