Re: [R] Is there a regression surface demo?

2010-10-12 Thread Greg Snow
For another approach you might want to look at Predict.Plot and TkPredict from 
the TeachingDemos package.  The code from those could be adapted to do 3d plots.

-- 
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.s...@imail.org
801.408.8111


> -Original Message-
> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-
> project.org] On Behalf Of Joshua Wiley
> Sent: Monday, October 11, 2010 3:03 PM
> To: r-help@r-project.org
> Subject: Re: [R] Is there a regression surface demo?
> 
> Thanks for everyone's responses. Just to follow up, here is a working
> version of my original.  The code is not pretty, but it functions.
> Assuming you have the 'rgl' package installed and have sourced this
> function, here are some examples:
> 
> RegSurfaceDemo(mpg ~ vs + wt, data = mtcars)
> RegSurfaceDemo(mpg ~ vs * wt, data = mtcars)
> RegSurfaceDemo(qsec ~ disp * hp, data = mtcars)
> 
> It cannot handle factors, and the axes labels are hideous...I'll get
> to that eventually.
> 
> Thanks for all your help and suggestions.
> 
> Josh
> 
> RegSurfaceDemo <- function(formula, data, xlim = NULL, ylim = NULL,
>zlim = NULL, resolution = 10) {
>  require(rgl)
>  ## This cannot be the proper way to extract variable names from
> formula
>  vars <- rownames(attr(terms(formula), "factors"))
> 
>  ## if no limits set, make them nearest integer to
>  ## .75 the lowest value and 1.25 the highest
>  ranger <- function(x) {
>as.integer(range(x) * c(.75, 1.25))
>  }
>  if(is.null(xlim)) {xlim <- ranger(data[, vars[2]])}
>  if(is.null(ylim)) {ylim <- ranger(data[, vars[3]])}
>  if(is.null(zlim)) {zlim <- ranger(data[, vars[1]])}
> 
>  ## This does not actually work because the data frame
>  ## does not get named properly (actually it throws an error)
>  f <- function (x, y) {
>newdat <- data.frame(x, y)
>colnames(newdat) <- c(vars[2], vars[3])
>predict(my.model, newdata = newdat)
>  }
> 
>  ## Fit model
>  my.model <- lm(formula = formula, data = data)
> 
>  ## Create X, Y, and Z grids
>  X <- seq(from = xlim[1], to = xlim[2], length.out = resolution)
>  Y <- seq(from = ylim[1], to = ylim[2], length.out = resolution)
>  Z <- outer(X, Y, f)
> 
>  ## Create 3d scatter plot and add the regression surface
>  open3d()
>  with(data = data,
>   plot3d(x = get(vars[2]), y = get(vars[3]), z = get(vars[1]),
>  xlim = xlim, ylim = ylim, zlim = zlim))
>  par3d(ignoreExtent = TRUE)
>  surface3d(X, Y, Z, col = "blue", alpha = .6)
>  par3d(ignoreExtent = FALSE)
>  return(summary(my.model))
> }
> 
> 
> 
> On Mon, Oct 11, 2010 at 1:28 PM, Ista Zahn 
> wrote:
> > There is also wireframe() in lattice and bplot in rms.
> >
> > -Ista
> >
> > On Mon, Oct 11, 2010 at 3:49 PM, G. Jay Kerns  wrote:
> >> Dear Josh,
> >>
> >> On Mon, Oct 11, 2010 at 3:15 PM, Joshua Wiley
>  wrote:
> >>> Hi All,
> >>>
> >>> Does anyone know of a function to plot a regression surface for two
> >>> predictors?  RSiteSearch()s and findFn()s have not turned up what I
> >>> was looking for.  I was thinking something along the lines of:
> >>> http://mallit.fr.umn.edu/fr5218/reg_refresh/images/fig9.gif
> >>>
> >>> I like the rgl package because showing it from different angles is
> >>> nice for demonstrations.  I started to write my own, but it has
> some
> >>> issues (non functioning code start below), and I figured before I
> >>> tried to work out the kinks, I would ask for the list's feedback.
> >>>
> >>> Any comments or suggestions (about functions or preferred idioms
> for
> >>> what I tried below, or...) are greatly appreciated.
> >>>
> >>> Josh
> >>>
> >>
> >> [snip]
> >>
> >> I haven't tried to debug your code, but wanted to mention that the
> >> Rcmdr:::scatter3d function does 3-d scatterplots (with the rgl
> >> package) and adds a regression surface, one of 4 or 5 different
> types.
> >>  If nothing else, it might be a good place to start for making your
> >> own.
> >>
> >> A person can play around with the different types in the Rcmdr under
> >> the Graphs menu.  Or, from the command line:
> >>
> >> library(Rcmdr)
> >> with(rock, scatter3d(area, peri, shape))
> >>
> >> I hope that this helps,
> >> Jay
> >>
> >> 

Re: [R] Is there a regression surface demo?

2010-10-11 Thread Joshua Wiley
Thanks for everyone's responses. Just to follow up, here is a working
version of my original.  The code is not pretty, but it functions.
Assuming you have the 'rgl' package installed and have sourced this
function, here are some examples:

RegSurfaceDemo(mpg ~ vs + wt, data = mtcars)
RegSurfaceDemo(mpg ~ vs * wt, data = mtcars)
RegSurfaceDemo(qsec ~ disp * hp, data = mtcars)

It cannot handle factors, and the axes labels are hideous...I'll get
to that eventually.

Thanks for all your help and suggestions.

Josh

RegSurfaceDemo <- function(formula, data, xlim = NULL, ylim = NULL,
   zlim = NULL, resolution = 10) {
 require(rgl)
 ## This cannot be the proper way to extract variable names from formula
 vars <- rownames(attr(terms(formula), "factors"))

 ## if no limits set, make them nearest integer to
 ## .75 the lowest value and 1.25 the highest
 ranger <- function(x) {
   as.integer(range(x) * c(.75, 1.25))
 }
 if(is.null(xlim)) {xlim <- ranger(data[, vars[2]])}
 if(is.null(ylim)) {ylim <- ranger(data[, vars[3]])}
 if(is.null(zlim)) {zlim <- ranger(data[, vars[1]])}

 ## This does not actually work because the data frame
 ## does not get named properly (actually it throws an error)
 f <- function (x, y) {
   newdat <- data.frame(x, y)
   colnames(newdat) <- c(vars[2], vars[3])
   predict(my.model, newdata = newdat)
 }

 ## Fit model
 my.model <- lm(formula = formula, data = data)

 ## Create X, Y, and Z grids
 X <- seq(from = xlim[1], to = xlim[2], length.out = resolution)
 Y <- seq(from = ylim[1], to = ylim[2], length.out = resolution)
 Z <- outer(X, Y, f)

 ## Create 3d scatter plot and add the regression surface
 open3d()
 with(data = data,
  plot3d(x = get(vars[2]), y = get(vars[3]), z = get(vars[1]),
 xlim = xlim, ylim = ylim, zlim = zlim))
 par3d(ignoreExtent = TRUE)
 surface3d(X, Y, Z, col = "blue", alpha = .6)
 par3d(ignoreExtent = FALSE)
 return(summary(my.model))
}



On Mon, Oct 11, 2010 at 1:28 PM, Ista Zahn  wrote:
> There is also wireframe() in lattice and bplot in rms.
>
> -Ista
>
> On Mon, Oct 11, 2010 at 3:49 PM, G. Jay Kerns  wrote:
>> Dear Josh,
>>
>> On Mon, Oct 11, 2010 at 3:15 PM, Joshua Wiley  wrote:
>>> Hi All,
>>>
>>> Does anyone know of a function to plot a regression surface for two
>>> predictors?  RSiteSearch()s and findFn()s have not turned up what I
>>> was looking for.  I was thinking something along the lines of:
>>> http://mallit.fr.umn.edu/fr5218/reg_refresh/images/fig9.gif
>>>
>>> I like the rgl package because showing it from different angles is
>>> nice for demonstrations.  I started to write my own, but it has some
>>> issues (non functioning code start below), and I figured before I
>>> tried to work out the kinks, I would ask for the list's feedback.
>>>
>>> Any comments or suggestions (about functions or preferred idioms for
>>> what I tried below, or...) are greatly appreciated.
>>>
>>> Josh
>>>
>>
>> [snip]
>>
>> I haven't tried to debug your code, but wanted to mention that the
>> Rcmdr:::scatter3d function does 3-d scatterplots (with the rgl
>> package) and adds a regression surface, one of 4 or 5 different types.
>>  If nothing else, it might be a good place to start for making your
>> own.
>>
>> A person can play around with the different types in the Rcmdr under
>> the Graphs menu.  Or, from the command line:
>>
>> library(Rcmdr)
>> with(rock, scatter3d(area, peri, shape))
>>
>> I hope that this helps,
>> Jay
>>
>> __
>> R-help@r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
>
>
> --
> Ista Zahn
> Graduate student
> University of Rochester
> Department of Clinical and Social Psychology
> http://yourpsyche.org
>



-- 
Joshua Wiley
Ph.D. Student, Health Psychology
University of California, Los Angeles
http://www.joshuawiley.com/

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Is there a regression surface demo?

2010-10-11 Thread Ista Zahn
There is also wireframe() in lattice and bplot in rms.

-Ista

On Mon, Oct 11, 2010 at 3:49 PM, G. Jay Kerns  wrote:
> Dear Josh,
>
> On Mon, Oct 11, 2010 at 3:15 PM, Joshua Wiley  wrote:
>> Hi All,
>>
>> Does anyone know of a function to plot a regression surface for two
>> predictors?  RSiteSearch()s and findFn()s have not turned up what I
>> was looking for.  I was thinking something along the lines of:
>> http://mallit.fr.umn.edu/fr5218/reg_refresh/images/fig9.gif
>>
>> I like the rgl package because showing it from different angles is
>> nice for demonstrations.  I started to write my own, but it has some
>> issues (non functioning code start below), and I figured before I
>> tried to work out the kinks, I would ask for the list's feedback.
>>
>> Any comments or suggestions (about functions or preferred idioms for
>> what I tried below, or...) are greatly appreciated.
>>
>> Josh
>>
>
> [snip]
>
> I haven't tried to debug your code, but wanted to mention that the
> Rcmdr:::scatter3d function does 3-d scatterplots (with the rgl
> package) and adds a regression surface, one of 4 or 5 different types.
>  If nothing else, it might be a good place to start for making your
> own.
>
> A person can play around with the different types in the Rcmdr under
> the Graphs menu.  Or, from the command line:
>
> library(Rcmdr)
> with(rock, scatter3d(area, peri, shape))
>
> I hope that this helps,
> Jay
>
> __
> R-help@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



-- 
Ista Zahn
Graduate student
University of Rochester
Department of Clinical and Social Psychology
http://yourpsyche.org

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Is there a regression surface demo?

2010-10-11 Thread G. Jay Kerns
Dear Josh,

On Mon, Oct 11, 2010 at 3:15 PM, Joshua Wiley  wrote:
> Hi All,
>
> Does anyone know of a function to plot a regression surface for two
> predictors?  RSiteSearch()s and findFn()s have not turned up what I
> was looking for.  I was thinking something along the lines of:
> http://mallit.fr.umn.edu/fr5218/reg_refresh/images/fig9.gif
>
> I like the rgl package because showing it from different angles is
> nice for demonstrations.  I started to write my own, but it has some
> issues (non functioning code start below), and I figured before I
> tried to work out the kinks, I would ask for the list's feedback.
>
> Any comments or suggestions (about functions or preferred idioms for
> what I tried below, or...) are greatly appreciated.
>
> Josh
>

[snip]

I haven't tried to debug your code, but wanted to mention that the
Rcmdr:::scatter3d function does 3-d scatterplots (with the rgl
package) and adds a regression surface, one of 4 or 5 different types.
 If nothing else, it might be a good place to start for making your
own.

A person can play around with the different types in the Rcmdr under
the Graphs menu.  Or, from the command line:

library(Rcmdr)
with(rock, scatter3d(area, peri, shape))

I hope that this helps,
Jay

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


[R] Is there a regression surface demo?

2010-10-11 Thread Joshua Wiley
Hi All,

Does anyone know of a function to plot a regression surface for two
predictors?  RSiteSearch()s and findFn()s have not turned up what I
was looking for.  I was thinking something along the lines of:
http://mallit.fr.umn.edu/fr5218/reg_refresh/images/fig9.gif

I like the rgl package because showing it from different angles is
nice for demonstrations.  I started to write my own, but it has some
issues (non functioning code start below), and I figured before I
tried to work out the kinks, I would ask for the list's feedback.

Any comments or suggestions (about functions or preferred idioms for
what I tried below, or...) are greatly appreciated.

Josh


RegSurfaceDemo <- function(formula, data, xlim, ylim, zlim,
   resolution = 100) {
  require(rgl)
  ## This cannot be the proper way to extract variable names from formula
  vars <- rownames(attr(terms(formula), "factors"))

  ## if no limits set, make them nearest integer to
  ## .75 the lowest value and 1.25 the highest
  ranger <- function(x) {
as.integer(range(x) * c(.75, 1.25))
  }
  if(is.null(xlim)) {xlim <- ranger(data[, vars[2]])}
  if(is.null(ylim)) {ylim <- ranger(data[, vars[3]])}
  if(is.null(zlim)) {zlim <- ranger(data[, vars[1]])}

  ## This does not actually work because the data frame
  ## does not get named properly (actually it throws an error)
  ##f <- function (x, y) {
  ##  predict(my.model, newdata = data.frame(vars[2] = x, vars[3] = y))
  ##}

  ## Fit model
  my.model <- lm(formula = formula, data = data)

  ## Create X, Y, and Z grids
  X <- seq(from = xlim[1], to = xlim[2], length.out = resolution)
  Y <- seq(from = ylim[1], to = ylim[2], length.out = resolution)
  Z <- outer(X, Y, f)

  ## Create 3d scatter plot and add the regression surface
  open3d()
  with(data = data,
   plot3d(x = vars[2], y = vars[3], z = vars[1],
  xlim = xlim, ylim = ylim, zlim = zlim))
  par3d(ignoreExtent = TRUE)
  surface3d(X, Y, Z, col = "blue", alpha = .6)
  par3d(ignoreExtent = FALSE)
  return(summary(my.model))
}



-- 
Joshua Wiley
Ph.D. Student, Health Psychology
University of California, Los Angeles
http://www.joshuawiley.com/

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.