BookmarkSubscribeRSS Feed
kpberger
Obsidian | Level 7

Hi all. I have a data set with measured concentrations of biomarkers in serum. For values below the limit of detection (LOD), I would like to impute random values from the distribution of 0-LOD using maximum likelihood estimation. The LOD changes with each observation (based on amount of serum available). I've read some SAS blog posts on computing MLEs but this is all a bit over my head (statistics does not come easily to me!).

 

Here is some example data. "abovelod' is a binary indicator of if the concentration is above the LOD or not. "lod" is the LOD value for each person. "concentration" is the value I'd like to impute.

 

data biomarkers; input id abovelod lod concentration;
datalines;
1 1 0.5	0.6
2 0	0.6	.
3 1 0.4 1.2
4 1 0.8	0.9
5 0 0.2 .
6 0 0.7	.
7 1 0.4 1.5
8 1 0.3 0.8
9 1 0.2 1.1
10 1 0.5 0.7
;
run;
data biomarkers; set biomarkers;
ln_concentration=log(concentration);
run;

Any direction appreciated, I know this is a larger ask.

 

Also, I would appreciate keeping the discussion away from how to handle values below the LOD. Thank you!

 

Edit: Variable "concentration" can be assumed to be log normal.

2 REPLIES 2
ballardw
Super User

Since you have different limits for each subject, and at least as shown, a very small sample of LOD values I'm not sure what you would actually mean by "mle" in this case.

From the range 0 to LOD is easy:

data biomarkers; 
   input id abovelod lod concentration;
   if not(abovelod) then do;
      concentration = rand('uniform');
      if concentration > lod then do until (concentration le lod);
         concentration = rand('uniform');
      end;
   end;
datalines;
1 1 0.5	0.6
2 0 0.6	.
3 1 0.4 1.2
4 1 0.8	0.9
5 0 0.2 .
6 0 0.7	.
7 1 0.4 1.5
8 1 0.3 0.8
9 1 0.2 1.1
10 1 0.5 0.7
;
mkeintz
PROC Star

Back in the reptilian part of my brain, I thought there was more to "rand('uniform'".  I checked. And there is: you can use the 2nd and 3rd argument of "rand('uniform',...,...)" to replace the do group

 

   if not(abovelod) then do;

with

 

  id not(abovelod) then concentration=rand('uniform',0,lod);
--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 2 replies
  • 748 views
  • 4 likes
  • 3 in conversation