Building off the Weibull survival simulation, and a quick snippet of code to create a watermark background, we can create a quick report with SAS ODS. If you want to play along at home, just add the following code to the survival simulation: it will seed the random number generator so you should get the exact same data:
set.seed(1)
Now, let's start up a report with SAS 9.2 using ODS: we can load in the data using IMPORT, and start playing around with LIFETEST, LIFEREG, and PHREG. This won't be extensive or exhaustive- just an excuse to show off a new trick. If you're new to survival analysis in SAS, or survival analysis in general, there's plenty of material over at UCLA's Institute for Digital Research and Education- possibly one of the best stat resources out there.
/* This will keep the watermark properly aligned*/
options papersize = (8.5in 11in);
proc import
datafile = "C:\Data\Didactic\Data\Survival sim 2013-03-20.csv"
out = surv dbms = csv replace;
run;
/* create our template using the results */
proc template;
define style watermark;
parent = styles.printer;
style header from header / background=_undef_;
style body from document / background=_undef_
backgroundimage = "C:\Data\Didactic\Results\2013-03-20\wm - CONFIDENTIAL 03-19-2013 300 dpi.png";
end;
run;
/* begin the PDF report */
ods pdf file = "C:\Data\Didactic\Results\2013-03-20\Survival Sim - 2013-03-05.pdf"
style = watermark;
ods noproctitle;
ods escapechar="^";
ods pdf text = "^S={just = center font_weight = bold font_style = italic
font_size = 18pt}Survival Simulated Data";
/* plot survival, log survival, and log-log survival */
ods proclabel = "Survival - X1";
title "Survival Function - Stratified by X1";
proc lifetest data = surv plots = (s, ls, lls) graphics notable;
time time_to_event*event(0);
strata x1;
run;
ods proclabel = "Survival - X2";
title "Survival Function - Stratified by X2";
proc lifetest data = surv plots = (s, ls, lls) graphics notable;
time time_to_event*event(0);
strata x2;
run;
ods proclabel = "Survival - X3";
title "Survival Function - Stratified by X3";
proc lifetest data = surv plots = (s, ls, lls) graphics notable;
time time_to_event*event(0);
strata x3;
run;
ods proclabel = "Weibull GLM";
title "Parametric Regression - Weibull";
proc lifereg data = surv;
class x1 x2 x3;
model time_to_event*event(0) = x1 x2 x3 x4 x5 x6
x7 x8 x9 x10 x11 / dist = weibull;
run;
ods proclabel = "Cox PH Model";
title "Nonparametric Regression - Cox Proportional Hazards";
proc phreg data = surv;
class x1 x2 x3;
model time_to_event*event(0) = x1 x2 x3
x4 x5 x6 x7 x8 x9 x10 x11;
run;
ods pdf close;
The results aren't too shabby, and should give you something like this:
Another day, we can delve deeper into the dataset in SAS, or maybe boot up the Survival package in R.
Showing posts with label ODS. Show all posts
Showing posts with label ODS. Show all posts
Wednesday, March 20, 2013
Monday, March 18, 2013
R: Create Watermark for SAS ODS Reports
Now to see if we can add some watermarks in SAS ODS - I've seen pages on how to create watermarked reports using background images. The first part is creating the background image: we can steal some code from the earlier post on watermarks in R, and adapt it to create PNG backdrops for our reports.
So let's create a function which does this for us: we just tell it what we want the watermark to say, and pass it a couple parameters: the color, size, angle, and font of the text.
# create a date-stamped folder for the results
run.date <- format(Sys.Date(), "%m-%d-%Y")
working.dir <- paste0("c:/Data/Didactic/Results/", run.date)
create.watermark <- function(wm = "", rep.wm = T, n.reps = 5,
result.dir, res.wm = 1200, cex.wm = 2, font.wm = 2,
col.wm = rgb(1, 0, 0, .2), angle.wm = 45,
page.width = 8.5, page.height = 11, page.unit = "in") {
if (file.exists(working.dir)) {
setwd(file.path(working.dir))
} else {
dir.create(working.dir, recursive = T, showWarnings = F)
setwd(working.dir)
}
if (rep.wm == T) {
x.loc <- seq(0, 1, length.out = n.reps)
y.loc <- seq(1, 0, length.out = n.reps)
} else {
x.loc <- .5; y.loc <- .5;
n.reps <- 1
}
setwd(result.dir)
# create a date-stamped .png file
png(paste0("Watermark Background - ", wm, " ", run.date,
" ", res.wm, " dpi.png"),
width = page.width, height = page.height, res = res.wm,
units = page.unit)
par(mar = c(0, 0, 0, 0))
plot.new()
text(grconvertX(x.loc, from = "npc"),
grconvertY(y.loc, from = "npc"),
labels = paste(rep(wm, n.reps), collapse = " "),
cex = cex.wm, font = font.wm,
col = col.wm,
srt = angle.wm)
dev.off()
}
The program creates the image, and labels it appropriately with the watermark, run date, and resolution. In part 2, I'll see if I can make a nice looking report with the background image, maybe even using a report on simulated survival data.
Now, let's see if it works. First, let's create a repeated watermark across the page:
create.watermark(wm = "CONFIDENTIAL", result.dir = working.dir, res.wm = 300)
Next, just one single large watermark in the background:
create.watermark(wm = "FOR PEER REVIEW ONLY", rep.wm = F,
col.wm = rgb(0, 0, 1, .2), result.dir = working.dir, cex.wm = 5, res.wm = 300)
Suggestions for further improvements welcome!
So let's create a function which does this for us: we just tell it what we want the watermark to say, and pass it a couple parameters: the color, size, angle, and font of the text.
# create a date-stamped folder for the results
run.date <- format(Sys.Date(), "%m-%d-%Y")
working.dir <- paste0("c:/Data/Didactic/Results/", run.date)
create.watermark <- function(wm = "", rep.wm = T, n.reps = 5,
result.dir, res.wm = 1200, cex.wm = 2, font.wm = 2,
col.wm = rgb(1, 0, 0, .2), angle.wm = 45,
page.width = 8.5, page.height = 11, page.unit = "in") {
if (file.exists(working.dir)) {
setwd(file.path(working.dir))
} else {
dir.create(working.dir, recursive = T, showWarnings = F)
setwd(working.dir)
}
if (rep.wm == T) {
x.loc <- seq(0, 1, length.out = n.reps)
y.loc <- seq(1, 0, length.out = n.reps)
} else {
x.loc <- .5; y.loc <- .5;
n.reps <- 1
}
setwd(result.dir)
# create a date-stamped .png file
png(paste0("Watermark Background - ", wm, " ", run.date,
" ", res.wm, " dpi.png"),
width = page.width, height = page.height, res = res.wm,
units = page.unit)
par(mar = c(0, 0, 0, 0))
plot.new()
text(grconvertX(x.loc, from = "npc"),
grconvertY(y.loc, from = "npc"),
labels = paste(rep(wm, n.reps), collapse = " "),
cex = cex.wm, font = font.wm,
col = col.wm,
srt = angle.wm)
dev.off()
}
The program creates the image, and labels it appropriately with the watermark, run date, and resolution. In part 2, I'll see if I can make a nice looking report with the background image, maybe even using a report on simulated survival data.
Now, let's see if it works. First, let's create a repeated watermark across the page:
create.watermark(wm = "CONFIDENTIAL", result.dir = working.dir, res.wm = 300)
Next, just one single large watermark in the background:
create.watermark(wm = "FOR PEER REVIEW ONLY", rep.wm = F,
col.wm = rgb(0, 0, 1, .2), result.dir = working.dir, cex.wm = 5, res.wm = 300)
Suggestions for further improvements welcome!
Subscribe to:
Posts (Atom)


