| fill1 | R Documentation |
A support function for the argument xij,
it generates a matrix
of an appropriate dimension.
fill1(x, values = 0, ncolx = ncol(x))
x |
A vector or matrix which is used to determine
the dimension of the
answer, in particular, the number of rows.
After converting |
values |
Numeric.
The answer contains these values,
which are recycled columnwise if necessary, i.e.,
as |
ncolx |
The number of columns of the returned matrix.
The default is the number of columns of |
The xij argument for vglm allows
the user to input
variables specific to each linear/additive predictor.
For example, consider
the bivariate logit model where the
first/second linear/additive
predictor is the logistic regression of the
first/second binary response
respectively. The third linear/additive predictor
is log(OR) =
eta3, where OR is the odds ratio.
If one has ocular pressure
as a covariate in this model then xij
is required to handle the
ocular pressure for each eye, since these will
be different in general.
[This contrasts with a variable such
as age, the age of the
person, which has a common value for both eyes.]
In order to input
these data into vglm one often
finds that functions
fill1, fill2, etc. are useful.
All terms in the xij
and formula arguments in vglm
must appear in the form2 argument too.
matrix(values, nrow=nrow(x), ncol=ncolx),
i.e., a matrix
consisting of values values,
with the number of rows matching
x, and the default number of columns
is the number of columns
of x.
The effect of the xij argument is after
other arguments such as
exchangeable and zero.
Hence xij does not affect constraint matrices.
Additionally, there are currently 3 other
identical fill1
functions, called fill2, fill3 and fill4;
if you need more then assign fill5 = fill6 = fill1 etc.
The reason for this is that if more than
one fill1 function is
needed then they must be unique.
For example, if M=4 then
xij = list(op ~ lop + rop + fill1(mop) + fill1(mop))
would reduce to
xij = list(op ~ lop + rop + fill1(mop)), whereas
xij = list(op ~ lop + rop + fill1(mop) + fill2(mop))
would retain
all M terms, which is needed.
In Examples 1 to 3 below, the xij argument
illustrates covariates
that are specific to a linear predictor.
Here, lop/rop are
the ocular pressures of the left/right eye
in an artificial dataset,
and mop is their mean.
Variables leye and reye
might be the presence/absence of a particular
disease on the LHS/RHS
eye respectively.
In Example 3, the xij argument illustrates fitting the
(exchangeable) model where there is a common smooth function
of the
ocular pressure. One should use regression splines since
s in vgam does not handle
the xij
argument. However, regression splines such as
bs and ns need
to have
the same basis functions here for both functions, and Example 3
illustrates a trick involving a function BS to obtain this,
e.g., same knots. Although regression splines create more than a
single column per term in the model matrix,
fill1(BS(lop,rop))
creates the required (same) number of columns.
T. W. Yee
vglm.control,
vglm,
multinomial,
Select.
fill1(runif(5))
fill1(runif(5), ncol = 3)
fill1(runif(5), val = 1, ncol = 3)
# Generate (independent) eyes data for the examples below; OR=1.
## Not run: nn <- 1000 # Number of people
eyesdata <- data.frame(lop = round(runif(nn), 2),
rop = round(runif(nn), 2),
age = round(rnorm(nn, 40, 10)))
eyesdata <- transform(eyesdata,
mop = (lop + rop) / 2, # Mean ocular pressure
op = (lop + rop) / 2, # Value unimportant unless plotting
# op = lop, # Choose this if plotting
eta1 = 0 - 2*lop + 0.04*age, # Linear predictor for left eye
eta2 = 0 - 2*rop + 0.04*age) # Linear predictor for right eye
eyesdata <- transform(eyesdata,
leye = rbinom(nn, size=1, prob = logitlink(eta1, inverse = TRUE)),
reye = rbinom(nn, size=1, prob = logitlink(eta2, inverse = TRUE)))
# Example 1. All effects are linear.
fit1 <- vglm(cbind(leye,reye) ~ op + age,
family = binom2.or(exchangeable = TRUE, zero = 3),
data = eyesdata, trace = TRUE,
xij = list(op ~ lop + rop + fill1(lop)),
form2 = ~ op + lop + rop + fill1(lop) + age)
head(model.matrix(fit1, type = "lm")) # LM model matrix
head(model.matrix(fit1, type = "vlm")) # Big VLM model matrix
coef(fit1)
coef(fit1, matrix = TRUE) # Unchanged with 'xij'
constraints(fit1)
max(abs(predict(fit1)-predict(fit1, new = eyesdata))) # Okay
summary(fit1)
plotvgam(fit1,
se = TRUE) # Wrong, e.g., coz it plots against op, not lop.
# So set op = lop in the above for a correct plot.
# Example 2. This uses regression splines on ocular pressure.
# It uses a trick to ensure common basis functions.
BS <- function(x, ...)
sm.bs(c(x,...), df = 3)[1:length(x), , drop = FALSE] # trick
fit2 <-
vglm(cbind(leye,reye) ~ BS(lop,rop) + age,
family = binom2.or(exchangeable = TRUE, zero = 3),
data = eyesdata, trace = TRUE,
xij = list(BS(lop,rop) ~ BS(lop,rop) +
BS(rop,lop) +
fill1(BS(lop,rop))),
form2 = ~ BS(lop,rop) + BS(rop,lop) + fill1(BS(lop,rop)) +
lop + rop + age)
head(model.matrix(fit2, type = "lm")) # LM model matrix
head(model.matrix(fit2, type = "vlm")) # Big VLM model matrix
coef(fit2)
coef(fit2, matrix = TRUE)
summary(fit2)
fit2@smart.prediction
max(abs(predict(fit2) - predict(fit2, new = eyesdata))) # Okay
predict(fit2, new = head(eyesdata)) # OR is 'scalar' as zero=3
max(abs(head(predict(fit2)) -
predict(fit2, new = head(eyesdata)))) # Should be 0
plotvgam(fit2, se = TRUE, xlab = "lop") # Correct
# Example 3. Capture-recapture model with ephemeral and enduring
# memory effects. Similar to Yang and Chao (2005), Biometrics.
deermice <- transform(deermice, Lag1 = y1)
M.tbh.lag1 <-
vglm(cbind(y1, y2, y3, y4, y5, y6) ~ sex + weight + Lag1,
posbernoulli.tb(parallel.t = FALSE ~ 0,
parallel.b = FALSE ~ 0,
drop.b = FALSE ~ 1),
xij = list(Lag1 ~ fill1(y1) + fill1(y2) + fill1(y3) +
fill1(y4) + fill1(y5) + fill1(y6) +
y1 + y2 + y3 + y4 + y5),
form2 = ~ sex + weight + Lag1 +
fill1(y1) + fill1(y2) + fill1(y3) + fill1(y4) +
fill1(y5) + fill1(y6) +
y1 + y2 + y3 + y4 + y5 + y6,
data = deermice, trace = TRUE)
coef(M.tbh.lag1)
## End(Not run)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.