## Section 2: Example data set.seed(1090) dat <- as.data.frame(matrix(round(runif(21), digits = 2), ncol = 7)) colnames(dat) <- c("y1", "y2", "y3", "x1", "x2", "x3", "x4") for(i in c(2, 6:7)) dat[[i]] <- factor(dat[[i]] < 0.5, labels = c("a", "b")) dat$y2[1] <- NA dat ## Section 2.1: Multiple parts ## Formula F1 <- Formula(log(y1) ~ x1 + x2 | I(x1^2)) length(F1) ## model.frame mf1 <- model.frame(F1, data = dat) mf1 ## parts model.response(mf1) model.matrix(F1, data = mf1, rhs = 1) model.matrix(F1, data = mf1, rhs = 2) ## Section 2.2: Multiple responses ## Formula F2 <- Formula(y1 + y2 ~ x3) length(F2) ## model.frame mf2 <- model.frame(F2, data = dat) mf2 ## parts model.response(mf2) model.part(F2, data = mf2, lhs = 1) model.part(F1, data = mf1, lhs = 1, drop = TRUE) ## Section 3 ## Formula F3 <- Formula(y1 + y2 | log(y3) ~ x1 + I(x2^2) | 0 + log(x1) | x3 / x4) F3 length(F3) attr(F3, "lhs") ## formula and terms formula(F3) formula(F3, lhs = 2, rhs = -2) formula(F3, lhs = c(TRUE, FALSE), rhs = 0) terms(F3) formula(terms(F3)) formula(terms(F3, lhs = 2, rhs = -2)) formula(terms(F3, lhs = c(TRUE, FALSE), rhs = 0)) ## model.frame, model.matrix, model.part mf3 <- model.frame(F3, data = dat, subset = y1 < 0.75, weights = x1) mf3 model.matrix(F3, data = mf3, rhs = 2) model.part(F3, data = mf3, lhs = 1) model.part(F3, data = mf3, lhs = 2) model.weights(mf3) ## misc update(F1, . ~ . - x1 | . + x1) update(F1, . + y2 | y3 ~ .) as.Formula(y1 ~ x1, y2 ~ x2, ~ x3) ## Section 4: Model fitting ivcoef <- function(formula, data, subset, na.action, ...) { mf <- match.call(expand.dots = FALSE) m <- match(c("formula", "data", "subset", "na.action"), names(mf), 0) mf <- mf[c(1, m)] f <- Formula(formula) mf[[1]] <- as.name("model.frame") mf$formula <- f mf <- eval(mf, parent.frame()) y <- model.response(mf) x <- model.matrix(f, data = mf, rhs = 1) z <- model.matrix(f, data = mf, rhs = 2) xz <- as.matrix(lm.fit(z, x)$fitted.values) lm.fit(xz, y)$coefficients } ivcoef(log(y1) ~ x1 | x2, data = dat)