SGPLOT LOESS Semi-log wont work with 0

Reply
New Contributor
Posts: 3

SGPLOT LOESS Semi-log wont work with 0

I have 0 in the dataset, I used

proc sgplot data=;

loess x=age y=pc/smooth=3 clm;

xaxis label='Age';

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

Respected Advisor
Posts: 4,930

Re: SGPLOT LOESS Semi-log wont work with 0

One problem might be that the loess fit generates some fitted values or confidence limits <= 0. - PG

PG
SAS Super FREQ
Posts: 3,755

Re: SGPLOT LOESS Semi-log wont work with 0

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.

New Contributor
Posts: 3

Re: SGPLOT LOESS Semi-log wont work with 0

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.

Thanks

Respected Advisor
Posts: 4,930

Re: SGPLOT LOESS Semi-log wont work with 0

Here is the outline of what I would try:

data graphX;
do x = myXmin to myXmax by smallAmount;
     output;
     end;
run;

data loessLog;
set myData;
logY = log10(y);
run;

proc loess data=loessLog;
model logY = x / clm smooth=0.2 degree=1;
score data=graphX / clm;
ods output scoreResults=loessScore;
run;

data expGraphX;
set loessScore(in=ok) myData;
if ok then do;
     predY = 10**p_y;
     lcl = 10**lcl_y;
     ucl = 10**ucl_y;
     end;
run;

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;
run;

PG

PG
New Contributor
Posts: 3

Re: SGPLOT LOESS Semi-log wont work with 0

PG:

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;

run;

more questions

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.

Respected Advisor
Posts: 4,930

Re: SGPLOT LOESS Semi-log wont work with 0

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.

PG

PG
Ask a Question
Discussion stats
  • 6 replies
  • 603 views
  • 6 likes
  • 3 in conversation