[R] Plotting observed vs. fitted values

Gray Calhoun gcalhoun at iastate.edu
Sun Nov 29 12:59:58 CET 2009


oscar linares wrote:
> Dear Wiza[R]ds,
> 
> I am very grateful to Duncan Murdoch for his assistance with this problem.
> His help was invaluable. However, the problem has become a little more
> complicated for me. Now, in each plot, I need to plot the observed and
> fitted values of a supine and upright posture experiment. Here is what I
> have and how far I got.
> 
> # tritiated (3H)-Norepinephrine(NE) disappearance from plasma
> # concentrations supine and upright
> # supine
> datasu <- data.frame(
> time=c(0,1,2,4,6,8,10,15,20),
> concsu=c(385.61,265.88,173.87,99.47,66.7,55.27,48.29,39.85,40.66)
> )
> # upright
> dataup <- data.frame(
> time=c(0,1,2,4,6,8,10,15,20),
> concup=c(767.27,529.03,328.13,225.94,164,151.1,132.02,121.15,70.88)
> )
> 
> # fit supine
> wt.su<- function(resp, time,A1,a1,A2,a2)
> {
>     pred <- A1*exp(-a1*time)+A2*exp(-a2*time)
>     (resp - pred) / sqrt(pred)
> }
> 
> fit.wt.su <- nls( ~ wt.su(concsu, time,A1,a1,A2,a2), data=datasu,
>               start=list(A1=500,a1=1,A2=100,a2=0.2),
>               trace = TRUE)
> 
> summary(fit.wt.su)
> 
> # fit upright
> wt.up<- function(resp, time,B1,b1,B2,b2)
> {
>     pred <- B1*exp(-b1*time)+B2*exp(-b2*time)
>     (resp - pred) / sqrt(pred)
> }
> 
> fit.wt.up <- nls( ~ wt.up(concup, time,B1,b1,B2,b2), data=dataup,
>               start=list(B1=500,b1=1,B2=100,b2=0.1),
>               trace = TRUE)
> 
> summary(fit.wt.up)
> 
> # Function that returns predicted values and graphics
> # by Duncan Murdoch
> 
> predictionssu <- function(fit, time) {
>   params <- summary(fit)$coefficients[, 1]
>   A1 <- params["A1"]
>   a1 <- params["a1"]
>   A2 <- params["A2"]
>   a2 <- params["a2"]
> 
>   A1*exp(-a1*time)+A2*exp(-a2*time)
> }
> 
> predictionsup <- function(fit, time) {
>   params <- summary(fit)$coefficients[, 1]
>   B1 <- params["B1"]
>   b1 <- params["b1"]
>   B2 <- params["B2"]
>   b2 <- params["b2"]
> 
>   B1*exp(-b1*time)+B2*exp(-b2*time)
> }
> 
> # plot observed and predicted values supine and upright in
> # each plot type (linear and smi-log)
> 
> # this does supine
> times <- seq(0,20, len=100)
> par(mfrow=c(2,1))
> plot(concsu ~ time, data=datasu)
> lines(times, predictionssu(fit.wt.su, times))
> plot(concsu ~ time, data=datasu, log="y")
> lines(times, predictionssu(fit.wt.su, times))
> 
> # Need upright in same plots (e.g., dashed line)
> 
> 
> Many thanks in advance...

Hi Oscar,
   The "lines" and "points" commands add to the current plot, so adding 
more points and dashed lines is straightforward (see the help page for 
"par" for more details on how to customize the line type).  The 
following code plots the supine and upright graphs together. (obviously 
it needs to go at the end of your code).

 > par(mfrow=c(2,1))
 > plot(c(datasu$concsu, dataup$concup) ~ c(datasu$time, dataup$time), 
xlab = "time", ylab = "conc")
 > lines(times, predictionssu(fit.wt.su, times))
 > lines(times, predictionsup(fit.wt.up, times), lty = "dashed")
 > plot(c(datasu$concsu, dataup$concup) ~ c(datasu$time, dataup$time), 
xlab = "time", ylab = "conc", log = "y")
 > lines(times, predictionssu(fit.wt.su, times))
 > lines(times, predictionsup(fit.wt.up, times), lty = "dashed")

The 'plot' command is ugly and could be improved; also both "conc" and 
"time" should be given better labels.  Since you have different data 
frames for "supine" and "upright", you don't need to distinguish the row 
names; you could have "conc" be the row in both data frames.  Even 
better, you could have "supine" vs. "upright" as a factor, and store all 
of your data in a single data frame; doing so would make it easier to 
use the lattice graphics package for this sort of problem.

-- 
Gray Calhoun

Assistant Professor of Economics, Iowa State University
http://www.econ.iastate.edu/~gcalhoun/

467 Heady Hall
Ames, IA 50011
Phone: (515) 294-6271
Fax:   (515) 294-0221




More information about the R-help mailing list