08-07-2013 06:18 PM
I have 0 in the dataset, I used
proc sgplot data=;
loess x=age y=pc/smooth=3 clm;
yaxis type=log logbase=10 logstyle=logexpand label='Outcome' values=(0.1 1 10 100);
I have tried the following:
1) set 0 to missing, got error msg, Log axis cannot support zero or negative values in the data range.
2) delete 0, got error msg, Log axis cannot support zero or negative values in the data range (I really dont understand this case)
3) set 0 to a very small number, 0.0001, the semi-log scale will work, but 0.0001 will shown, even you have specified the range to be 0.1-100
4) I also try min=0.1 max=100 on yaxis, got same error msg as 1) and 2) above
Please share your experience... Thanks
08-09-2013 08:54 AM
I like to analyze the data in one step and plot it in the next if I think data transforms are required of the results. So you might use PROC LOESS to analyze the data, then use a DATA step to transform the resultsm, and PROC SGPLOT to display the transformed results.
08-09-2013 09:44 AM
PG and Rick: Thanks for your help.
I used Proc LOESS to get Pred and CLM variables, yes, I found LCLM to have negative value.
because I want my log scale to be from 0.1 to 100, so I assume I will need to set raw value < 0.1 to missing, and lclm < 0.1 to missing, correct ?
the next question is, then how can I plot the predicated, and CLM.
I used proc gplot (not sgplot)
value*age=1 pred*age=2 lclm*age=3 uclm*age=4/overlay skipmiss
because I had the smooth option, the result of 2), 3) and 4) were actually not line, but curves,
I am not too familiar with proc sgplot, need to read the docu. how to plot these curves
any suggestions will be greatly appreciated.
08-09-2013 10:24 AM
Here is the outline of what I would try:
do x = myXmin to myXmax by smallAmount;
logY = log10(y);
proc loess data=loessLog;
model logY = x / clm smooth=0.2 degree=1;
score data=graphX / clm;
ods output scoreResults=loessScore;
set loessScore(in=ok) myData;
if ok then do;
predY = 10**p_y;
lcl = 10**lcl_y;
ucl = 10**ucl_y;
proc sgplot data=expGraphX;
band x=x lower=lcl upper=ucl;
series x=x y=predY;
scatter x=x y=y;
yaxis type=log logbase=10;
08-09-2013 11:18 AM
Thanks for your code.
I want to present the original data in log scale, so I am not sure I should run proc loess on log-transformed data.
this is what I have done.
1) ran proc loess on my un-transformed data, got pred, lclm and uclm.
2) set pred, lclm, uclm < 0.1 to missing.
3) proc sort data=stat_1; by age;
proc sgplot data=stat_1 noautolegend ;
band x=age lower=lclm upper=uclm ;
series x=age y=pred/break;
scatter x=age y=rawdata;
xaxis label="Age (years)" ;
yaxis label="Raw Data"
logbase=10 type=log min=0.1 max=100;
1) I used values =(0.1 1 10 100) in yaxis statement, and it only shown 0.1 and 100, without 1, 10, and dont have any minor tick marks.
maybe I should try more options on yaxis.
2) for lclm and uclm that I set to missing, wont have any impact on the band, it will be omitted...
3) it produced the graph without any obvious problems, but I am not sure if the bands and smooth line are presented correctly.
need to do more research.
Thank you so much for your help.
08-09-2013 11:50 AM
1) Sometimes it's better to use less options with log axes.
3) Sometimes you can get away with using PBSPLINE instead of SERIES to get the smooth line to look smoother. I prefer to get a dense and evenly spaced series of predicted values, and use those to draw the smooth lines, as shown in my earlier post.