pbreheny/visreg

support for rms objects

Closed this issue · 5 comments

The rms package has several fine methods for depiction of partial effects. The visreg package offers additional options and over-all, a simpler interface to the creation complex figures such as the outcome of a multi-nominal logistic regression.

image

Thanks!

Here is a tiny example.

library(rms)

x.1 <- rnorm(20)
x.2 <- rnorm(20)
x.3 <- rnorm(20)
y <- x.1 + x.2 + x.3 + x.1 * x.2 + rnorm(20)

fit <- ols(y ~ x.1 + x.2 + x.3)

## please?
# visreg::visreg(fit)

I don't understand what you're asking for. The code

visreg::visreg(fit)

works just fine for your example above. Does it not work for you?

Wow! I was using my own examples to test and something strange must have happened. Sorry about that!

For the record the following works as expected:

library(rms)
library(visreg)

x.1 <- rnorm(20)
x.2 <- rnorm(20)
x.3 <- rnorm(20)
y <- x.1 + x.2 + x.3 + x.1 * x.2 + rnorm(20)

fit1 <- ols(y ~ x.1 + x.2 + x.3)
fit2 <- ols(y ~ rcs(x.1, 3) + x.2 + x.3)

par(mfrow=c(2,3))

# works
visreg(fit1)
visreg(fit2)

I did notice one small issue: the y-axis labels do not follow the standard convention for lm and other model objects. The graphic output from visreg(ols.model) uses f(varname) as the y-axis label.

Is this by design? Attempting to alter via arguments visreg(ols.model, ylab='MAST', main='Title') resulted in an error:

Error in model.frame.default(Terms, newdata, na.action = na.action, ...) : 
  variable lengths differ (found for '(main)')

This looks like an error emitted by predict.ols.

Any ideas?

Thanks again, this package is going to make my life much simpler.

In general, when you pass an option to visreg(), that option is passed along to the relevant predict() function as well. Sometimes this results in a plotting option being passed to predict(); usually this doesn't cause a problem, but that seems not to be the case with predict.ols(). I suppose I could give some thought as to whether this behavior could be improved, but as visreg is currently designed, you'll have to split up your call to visreg() and plot():

v <- visreg(fit, 'x.1')
plot(v, main='main')

Thanks for the suggestions!

I was able to get the desired output using:

p <- visreg( fit, plot=FALSE)
plot(p, main='main', ylab='ylab', ...)