[R] pls help to print out first row of terms(model) output in example program
Paul Johnson
pauljohn32 at gmail.com
Mon Dec 19 22:15:17 CET 2011
Greetings.
I've written a convenience function for multicollinearity diagnosis.
I'd like to report to the user the formula that is used in a
regression. I get output like this:
> mcDiagnose(m1)
[1] "The following auxiliary models are being estimated and returned in a list:"
[1] "`x1` ~ ."
formula(fmla)()
[1] "`x2` ~ ."
I'd like to fill in the period with the variable names that are in there.
I know the information is in there, I just need to get it. The terms
output for a fitted model has the output at the very top, in the first
line, above the attributes. I just want to print out that first line,
here:
> terms(m2)
y ~ log(10 + x1) + poly(x2, 2)
attr(,"variables")
list(y, log(10 + x1), poly(x2, 2))
attr(,"factors")
log(10 + x1) poly(x2, 2)
y 0 0
log(10 + x1) 1 0
poly(x2, 2) 0 1
attr(,"term.labels")
[1] "log(10 + x1)" "poly(x2, 2)"
[snip]
In my working example code below , I need the help where I have "##fix
me fix me##
##Paul Johnson
## 2011-12-19
## mcDiagnose.R
lmAuxiliary <- function(model){
dat <- as.data.frame(model.matrix(model))
## ivnames <- attr(delete.response(terms(model)), "term.labels")
## previous does not work with transforms like poly
hasIntercept <- attr(terms(model), "intercept")
if (hasIntercept) dat <- dat[ , -1] # removes intercept. assumes
intercept in column 1
ivnames <- colnames(dat)
print("The following auxiliary models are being estimated and
returned in a list:")
results <- list()
for (i in ivnames) {
fmla <- paste( "`", i, "`", " ~ ." , sep="");
print(fmla)
maux <- lm( formula(fmla), data=dat)
results[[ i ]] <- maux
print(maux$call[2])
###fix me fix me ##
}
results
}
mcDiagnose <- function(model){
auxRegs <- lmAuxiliary(model)
auxRsq <- numeric(length=length(auxRegs))
j <- 0
for ( i in auxRegs ){
j <- j + 1
sumry <- summary(i)
auxRsq[j] <- sumry$r.squared
}
print("Drum roll please!")
print("And your R_j Squareds are (auxiliary Rsq)")
print(names(auxRegs))
print(auxRsq)
}
x1 <- rnorm(100)
x2 <- rnorm(100)
y <- rnorm(100)
m1 <- lm(y~x1+x2)
mcDiagnose(m1)
m2 <- lm(y~log(10+x1) + poly(x2,2))
mcDiagnose(m2)
--
Paul E. Johnson
Professor, Political Science
1541 Lilac Lane, Room 504
University of Kansas
More information about the R-help
mailing list