Invitation to join the AHRMM Learning UDI Community (LUC) Device Categorization Working Group

Please consider this invitation to join a new Association for Healthcare Resource & Materials Management (AHRMM) Learning UDI Community Working Group that will focus on Device Categorization—specifically, the analysis & evaluation of GMDN/SNOMED for PAD devices.

This LUC Working Group will provide an opportunity for you to finish what was raised as an issue during RAPID Phase I and take the work back to RAPID in Phase II/III. It is also an opportunity for you to set the foundation for device categorization work in other areas—hopefully by generalizing the findings to apply to other categories of medical devices.

The LUC Device Categorization WG Charter can be found at: http://www.ahrmm.org/resources/learning-udi-community/pdfs/work-groups/device-categorization-work-group-summary-statement-103116.pdf.

Please contact AHRMM (ahrmm@aha.org) with questions or if you are interested in joining this important Working Group or visit http://www.ahrmm.org/resources/learning-udi-community for information about other LUC Working Groups.

Statistical considerations for Increase in Prostate Cancer Distant Metastases at Diagnosis in the United States

Missing data: The assessment of patient cancer stage, Gleason score and distant metastasis in proportions excluded missing data. Incidence of prostate cancer metastasis at diagnosis was derived quarterly with SEER Collaborative Stage and missing values were imputed with observed rates. Sensitivity analysis was performed to assess the impact of missing data.

Restricted cubic spline model1: After standardization to the US 2000 Census population, restricted cubic spline model with four knots was used to examine temporal variation. Number of knots used was determined by comparing AIC to assess statistical fitness.

All analyses were performed using SAS v9.3 (SAS Institute Inc., Cary, NC). A p value of <0.05 was considered statistically significant.

Reference:
1Harrell F. Regression modeling strategies: with applications to linear models, logistic and ordinal regression, and survival analysis. Springer; 2015 Aug 14.

***for statistical log***;

***Table 1***;
**total numbers**;
proc freq data=pca_young;
tables year;
run;
proc freq data=pca_old;
tables year;
run;

**frequencies and percentages**;
%macro nway(indata, outdata);

%do x=1 %to &nvar.;
proc freq data=&indata.;
tables &expo * &&var&x / cmh;
format &&var&x &&fmt&x &expo &expofmt;
ods output CrossTabFreqs=data&x;
ods output CMH=cmh&x;
run;
**keep count and percentage**;
data table&x;
set data&x;
if &expo ne . and &&var&x ne .;
result=cats(put(Frequency, best.), ‘(‘, put(RowPercent, 6.1), ‘)’);
length varcat $12.;
varcat=put(&&var&x, &&fmt&x);
rename &&var&x=varnum;
keep &&var&x &expo result varcat;
run;
proc sort data=table&x; by varnum; run;
proc transpose data=table&x out=result&x;
var result;
by varnum varcat;
id &expo;
run;
**cmh**;
data pvalue&x;
set cmh&x;
if AltHypothesis=’Nonzero Correlation’;
if 0<=prob else if 0.001<=prob1 then upci=1;
if lowci=2010;
run;

proc means data=pca_old mean std q1 median q3;
var psa;
class year;
run;
*trend test*;
proc freq data=pca_old;
tables psa*year / noprint jt;
where year>=2010;
run;

**Test for trend**;
proc format;
value ct12a 11-21=’T1-T2a’ 22-40=’Other’;
value ct2b 11-21=’Other’ 22=’T2b’ 23-40=’Other’;
value ct2c 11-22=’Other’ 23-39=’T2c-T3′ 40=’Other’;
value ct4c 11-39=’Other’ 40=’T4′;
value gs26c 1=’2-6′ 2-3=’7-10′;
value gs7c 1=’Other’ 2=’7′ 3=’Other’;
value gs810c 1-2=’2-7′ 3=’8-10′;
value as 0=’AS’ 1-2=’No’;
value rp 0=’No’ 1=’RP’ 2=’No’;
value rt 0-1=’No’ 2=’RT’;
quit;

*<75*; proc freq data=pca_young; tables mets_dx*year / trend noprint; run; proc freq data=pca_young; tables cstage_t*year / trend noprint; format cstage_t ct12a.; run; proc freq data=pca_young; tables cstage_t*year / trend noprint; format cstage_t ct2b.; run; proc freq data=pca_young; tables cstage_t*year / trend noprint; format cstage_t ct2c.; run; proc freq data=pca_young; tables cstage_t*year / trend noprint; format cstage_t ct4c.; run; proc freq data=pca_young; tables dgs_cat*year / trend noprint; format dgs_cat gs26c.; run; proc freq data=pca_young; tables dgs_cat*year / trend noprint; format dgs_cat gs7c.; run; proc freq data=pca_young; tables dgs_cat*year / trend noprint; format dgs_cat gs810c.; run; proc freq data=pca_young; tables trt_cat*year / trend noprint; format trt_cat as.; run; proc freq data=pca_young; tables trt_cat*year / trend noprint; format trt_cat rp.; run; proc freq data=pca_young; tables trt_cat*year / trend noprint; format trt_cat rt.; run; *>=75*;
proc freq data=pca_old; tables mets_dx*year / trend noprint; run;

proc freq data=pca_old; tables cstage_t*year / trend noprint; format cstage_t ct12a.; run;
proc freq data=pca_old; tables cstage_t*year / trend noprint; format cstage_t ct2b.; run;
proc freq data=pca_old; tables cstage_t*year / trend noprint; format cstage_t ct2c.; run;
proc freq data=pca_old; tables cstage_t*year / trend noprint; format cstage_t ct4c.; run;

proc freq data=pca_old; tables dgs_cat*year / trend noprint; format dgs_cat gs26c.; run;
proc freq data=pca_old; tables dgs_cat*year / trend noprint; format dgs_cat gs7c.; run;
proc freq data=pca_old; tables dgs_cat*year / trend noprint; format dgs_cat gs810c.; run;

proc freq data=pca_old; tables trt_cat*year / trend noprint; format trt_cat as.; run;
proc freq data=pca_old; tables trt_cat*year / trend noprint; format trt_cat rp.; run;
proc freq data=pca_old; tables trt_cat*year / trend noprint; format trt_cat rt.; run;

proc format;
value pt2c 21-29=’T2′ 31-40=’Other’;
value pt3c 21-29=’Other’ 31-39=’T3′ 40=’Other’;
value pt4c 21-39=’Other’ 40=’T4′;
quit;

*<75*; proc freq data=rp_young; tables pstage_t*year / trend noprint; format pstage_t pt2c.; run; proc freq data=rp_young; tables pstage_t*year / trend noprint; format pstage_t pt3c.; run; proc freq data=rp_young; tables pstage_t*year / trend noprint; format pstage_t pt4c.; run; proc freq data=rp_young; tables gs_cat*year / trend noprint; format gs_cat gs26c.; run; proc freq data=rp_young; tables gs_cat*year / trend noprint; format gs_cat gs7c.; run; proc freq data=rp_young; tables gs_cat*year / trend noprint; format gs_cat gs810c.; run; proc freq data=rp_young; tables ln_pos*year / trend noprint; run; *>=75*;
proc freq data=rp_old; tables pstage_t*year / trend noprint; format pstage_t pt2c.; run;
proc freq data=rp_old; tables pstage_t*year / trend noprint; format pstage_t pt3c.; run;
proc freq data=rp_old; tables pstage_t*year / trend noprint; format pstage_t pt4c.; run;

proc freq data=rp_old; tables gs_cat*year / trend noprint; format gs_cat gs26c.; run;
proc freq data=rp_old; tables gs_cat*year / trend noprint; format gs_cat gs7c.; run;
proc freq data=rp_old; tables gs_cat*year / trend noprint; format gs_cat gs810c.; run;

***Calculate incidence***;
**sum up population data to registry level**;
data pop_age_all;
set seer.Pop_agegroups;
if 2004<=year<=2013 and reg_no ne ’99’; if agegrp=’00’ then agegrp=’01’; age=agegrp-1; age_cat=put(age, agecat.); if age>=8 and sex=1;
run;
proc summary data=pop_age_all nway;
var population;
class year reg_no age age_cat;
output out=pop_byreg sum=;
run;

data pop_byreg_qtr;
set pop_byreg (in=a) pop_byreg (in=b) pop_byreg (in=c) pop_byreg (in=d);
if a then quarter=1;
if b then quarter=2;
if c then quarter=3;
if d then quarter=4;
run;

**number of mets PCa by age, registry and year/bimonth**;
proc summary data=local.pca_mark nway;
var pca mets_dx;
class year quarter reg_no age;
format age age.;
output out=mets_qtr_age_reg sum(pca )=pca mean(mets_dx)=mets_dx;
run;
data mets_qtr_age_reg;
set mets_qtr_age_reg;
age_cat=put(age, age.);
mets_est=pca*mets_dx;
run;

**merge population data to trend data**;
proc sort data=mets_qtr_age_reg; by year quarter reg_no age_cat; run;
proc sort data=pop_byreg_qtr; by year quarter reg_no age_cat; run;
data metspop_qtr_age_reg;
merge mets_qtr_age_reg (drop=age) pop_byreg_qtr;
by year quarter reg_no age_cat;
if pca=. then pca=0;
if mets_est=. then mets_est=0;
run;

**sum up**;
*75+*;
proc summary data=metspop_qtr_age_reg nway;
var mets_est population;
class year quarter age_cat;
where age>=15;
output out=mets_qtr_age_old sum=;
run;
*<75*;
proc summary data=metspop_qtr_age_reg nway;
var mets_est population;
class year quarter age_cat;
where age<15; output out=mets_qtr_age_young sum=; run; **read in us standard population**; proc import out=us_pop datafile=’C:\Users\jim2012\Documents\Database\SEER\us_st_population.csv’ dbms=csv replace; getnames=yes; GUESSINGROWS=32767; run; data us_pop_r; set us_pop; if age_cat>=8;
drop age_cat;
rename age=age_cat;
run;

**merge standard population with registry population and calculate standardized events**;
proc sort data=us_pop_r; by age_cat; run;
proc sort data=mets_qtr_age_old; by age_cat; run;
proc sort data=mets_qtr_age_young; by age_cat; run;
data metsus_qtr_age_old;
merge mets_qtr_age_old (in=a) us_pop_r;
by age_cat;
if a;
mets_old=mets_est/population*standard_2000;
run;
data metsus_qtr_age_young;
merge mets_qtr_age_young (in=a) us_pop_r;
by age_cat;
if a;
mets_young=mets_est/population*standard_2000;
run;

**sum up to quarter level**;
proc summary data=metsus_qtr_age_old nway;
var mets_old standard_2000;
class year quarter;
output out=mets_sum_qtr_old sum=;
run;
proc summary data=metsus_qtr_age_young nway;
var mets_young standard_2000;
class year quarter;
output out=mets_sum_qtr_young sum=;
run;

**calculate standardized incidence**;
data mets_std_qtr_old;
set mets_sum_qtr_old;
mets_std_old=mets_old/standard_2000*1000000;
run;
data mets_std_qtr_young;
set mets_sum_qtr_young;
mets_std_young=mets_young/standard_2000*1000000;
run;

data mets_qtr_combined;
merge mets_std_qtr_old mets_std_qtr_young;
by year;

if quarter=1 then timestamp=year;
keep year quarter mets_std_old mets_std_young timestamp;
run;

**edit dataset**;
data mets_qtr_combined_r;
set mets_qtr_combined;
qtr=(year-2004)*4+quarter;
run;

**apply cubic transformation to 75+**;
%MACRO RCSPLINE(x,knot1,knot2,knot3,knot4,knot5,knot6,knot7,
knot8,knot9,knot10, norm=2);
%LOCAL j v7 k tk tk1 t k1 k2;
%LET v7=&x;
%IF %LENGTH(&v7)=8 %THEN %LET v7=%SUBSTR(&v7,1,7);
*%*Get no. knots, last knot, next to last knot;
%DO k=1 %TO 10;
%IF %QUOTE(&&knot&k)= %THEN %GOTO nomorek;
%END;
%LET k=11;
%nomorek:
%LET k=%EVAL(&k-1);
%LET k1=%EVAL(&k-1);
%LET k2=%EVAL(&k-2);
%IF &k %ELSE %DO;
%LET tk=&&knot&k;
%LET tk1=&&knot&k1;
DROP _kd_;
_kd_=
%IF &norm=0 %THEN 1;
%ELSE %IF &norm=1 %THEN &tk – &tk1;
%ELSE (&tk – &knot1)**0.666666666666;;
%DO j=1 %TO &k2;
%LET t=&&knot&j;
&v7&j=max((&x-&t)/_kd_,0)**3+((&tk1-&t)*max((&x-&tk)/_kd_,0)**3-(&tk-&t)*max((&x-&tk1)/_kd_,0)**3)/(&tk-&tk1)%STR(;);
%END;
%END;
%MEND;

**test knots**;
*test 3 knots: 0.1, 0.5, 0.9*;
data mets_qtr_old_rcs;
set mets_qtr_combined_r (keep=qtr mets_std_old);
%rcspline (x=qtr, knot1=4, knot2=20, knot3=36);
run;
*AIC 288.1, deviation ;
proc genmod data=mets_qtr_old_rcs plots=none;
model mets_std_old = qtr qtr1 / dist=poisson link=log;
output out=mets_old_pred pred=old_pred upper=old_up lower=old_low;
run;

*test 4 knots: 0.05, 0.35, 0.65, 0.95*;
data mets_qtr_old_rcs;
set mets_qtr_combined_r (keep=qtr mets_std_old);
%rcspline (x=qtr, knot1=2, knot2=14, knot3=26, knot4=38);
run;
*AIC 287.8, use 4 knots determined by lowest AIC;
proc genmod data=mets_qtr_old_rcs plots=none;
model mets_std_old = qtr qtr1 qtr2 / dist=poisson link=log;
output out=mets_old_pred pred=old_pred upper=old_up lower=old_low;
run;

*test 5 knots: 0.05, 0.275, 0.5, 0.725, 0.95*;
data mets_qtr_old_rcs;
set mets_qtr_combined_r (keep=qtr mets_std_old);
%rcspline (x=qtr, knot1=2, knot2=11, knot3=20, knot4=29, knot5=38);
run;
*AIC 289.7;
proc genmod data=mets_qtr_old_rcs plots=none;
model mets_std_old = qtr qtr1 qtr2 qtr3/ dist=poisson link=log;
output out=mets_old_pred pred=old_pred upper=old_up lower=old_low;
run;

**75+: use 4 knots**;
data mets_qtr_old_rcs;
set mets_qtr_combined_r (keep=qtr mets_std_old);
%rcspline (x=qtr, knot1=2, knot2=14, knot3=26, knot4=38);
run;
*log likelihood 15860.9029, df 36;
proc genmod data=mets_qtr_old_rcs plots=none;
model mets_std_old = qtr qtr1 qtr2 / dist=poisson link=log;
output out=mets_old_pred pred=old_pred upper=old_up lower=old_low;
run;

**=30 then cut_old=1;
if cut_old=1 then qtr1=qtr-29;
run;
*log likelihood 15860.8635, df 37;
proc genmod data=mets_qtr_combined_r1;
model mets_std_old = qtr qtr1 / dist=poisson link=log;
run;

*compare model fit, p=0.84;
data p_fit;
log2=15860.9029-15860.8635;
p_fit = 1 – probchi(log2, 1);
put “p value for fitness: p=” p_fit;
run;

***sensitivity analysis for missing value***;
**sum up population data to registry level**;
data pop_age_all;
set seer.Pop_agegroups;
if 2004<=year<=2013 and reg_no ne ’99’; if agegrp=’00’ then agegrp=’01’; age=agegrp-1; age_cat=put(age, agecat.); if age>=8 and sex=1;
run;
proc summary data=pop_age_all nway;
var population;
class year reg_no age age_cat;
output out=pop_byreg sum=;
run;

data pop_byreg_qtr;
set pop_byreg (in=a) pop_byreg (in=b) pop_byreg (in=c) pop_byreg (in=d);
if a then quarter=1;
if b then quarter=2;
if c then quarter=3;
if d then quarter=4;
run;

**number of mets PCa by age, registry and year/bimonth**;
*non-missing patients and obaserved rates*;
proc summary data=local.pca_mark nway;
var pca mets_dx;
class year quarter reg_no age;
format age age.;
output out=mets_qtr_age_reg sum(pca mets_dx)=pca mets_dx mean(mets_dx)=mets_pc;
run;
data mets_qtr_age_reg;
set mets_qtr_age_reg;
age_cat=put(age, age.);
mets_est=mets_pc*pca;
run;

*number of patients with missing*;
proc summary data=local.pca_mark nway;
var pca;
class year quarter reg_no age;
format age age.;
where mets_dx=.;
output out=mets_qtr_age_reg_miss sum=pca_miss;
run;
data mets_qtr_age_reg_miss;
set mets_qtr_age_reg_miss;
age_cat=put(age, age.);
run;

**merge population data to trend data**;
proc sort data=mets_qtr_age_reg; by year quarter reg_no age_cat; run;
proc sort data=mets_qtr_age_reg_miss; by year quarter reg_no age_cat; run;
proc sort data=pop_byreg_qtr; by year quarter reg_no age_cat; run;
data metspop_qtr_age_reg;
merge mets_qtr_age_reg (drop=age)
mets_qtr_age_reg_miss (keep=year quarter reg_no age_cat pca_miss)
pop_byreg_qtr;
by year quarter reg_no age_cat;
if pca_miss=. then pca_miss=0;
if mets_dx=. then mets_dx=0;
if mets_est=. then mets_est=0;
*apply range from Bezzoni et al.*;
mets_low=mets_dx+pca_miss*0.03;
mets_up=mets_dx+pca_miss*0.15;
run;

**sum up**;
*75+*;
proc summary data=metspop_qtr_age_reg nway;
var mets_est mets_low mets_up population;
class year quarter age_cat;
where age>=15;
output out=mets_qtr_age_old sum=;
run;
*<75*;
proc summary data=metspop_qtr_age_reg nway;
var mets_est mets_low mets_up population;
class year quarter age_cat;
where age<15;
output out=mets_qtr_age_young sum=;
run;

**merge standard population with registry population and calculate standardized events**;
proc sort data=us_pop_r; by age_cat; run;
proc sort data=mets_qtr_age_old; by age_cat; run;
proc sort data=mets_qtr_age_young; by age_cat; run;
data metsus_qtr_age_old;
merge mets_qtr_age_old (in=a) us_pop_r;
by age_cat;
if a;
mets_old=mets_est/population*standard_2000;
mets_old_low=mets_low/population*standard_2000;
mets_old_up=mets_up/population*standard_2000;
run;
data metsus_qtr_age_young;
merge mets_qtr_age_young (in=a) us_pop_r;
by age_cat;
if a;
mets_young=mets_est/population*standard_2000;
mets_young_low=mets_low/population*standard_2000;
mets_young_up=mets_up/population*standard_2000;
run;

**sum up to quarter level**;
proc summary data=metsus_qtr_age_old nway;
var mets_old mets_old_low mets_old_up standard_2000;
class year quarter;
output out=mets_sum_qtr_old sum=;
run;
proc summary data=metsus_qtr_age_young nway;
var mets_young mets_young_low mets_young_up standard_2000;
class year quarter;
output out=mets_sum_qtr_young sum=;
run;

**calculate standardized incidence**;
data mets_std_qtr_old;
set mets_sum_qtr_old;
mets_std_old=mets_old/standard_2000*1000000;
mets_std_old_low=mets_old_low/standard_2000*1000000;
mets_std_old_up=mets_old_up/standard_2000*1000000;
run;
data mets_std_qtr_young;
set mets_sum_qtr_young;
mets_std_young=mets_young/standard_2000*1000000;
mets_std_young_low=mets_young_low/standard_2000*1000000;
mets_std_young_up=mets_young_up/standard_2000*1000000;
run;

data mets_qtr_combined;
merge mets_std_qtr_old mets_std_qtr_young;
by year;

if quarter=1 then timestamp=year;
qtr=(year-2004)*4+quarter;

keep year quarter qtr mets_std_old mets_std_old_low mets_std_old_up
mets_std_young mets_std_young_low mets_std_young_up timestamp;
run;

**apply model**;
*old observed*;
data old_obs_rcs;
set mets_qtr_combined (keep=qtr mets_std_old);
%rcspline (x=qtr, knot1=2, knot2=14, knot3=26, knot4=38);
run;
proc genmod data=old_obs_rcs plots=none;
model mets_std_old = qtr qtr1 qtr2 / dist=poisson link=log;
output out=mets_old_pred1 pred=old_obs;
run;

*old lower end*;
data old_low_rcs;
set mets_qtr_combined (keep=qtr mets_std_old_low);
%rcspline (x=qtr, knot1=2, knot2=14, knot3=26, knot4=38);
run;
proc genmod data=old_low_rcs plots=none;
model mets_std_old_low = qtr qtr1 qtr2 / dist=poisson link=log;
output out=mets_old_pred2 pred=old_low;
run;

*old upper end*;
data old_up_rcs;
set mets_qtr_combined (keep=qtr mets_std_old_up);
%rcspline (x=qtr, knot1=2, knot2=14, knot3=26, knot4=38);
run;
proc genmod data=old_up_rcs plots=none;
model mets_std_old_up = qtr qtr1 qtr2 / dist=poisson link=log;
output out=mets_old_pred3 pred=old_up;
run;

*young observed*;
proc genmod data=mets_qtr_combined plots=none;
model mets_std_young = qtr / dist=poisson link=log;
output out=mets_young_pred1 PREDICTED=young_obs;
run;

proc genmod data=mets_qtr_combined plots=none;
model mets_std_young_low = qtr / dist=poisson link=log;
output out=mets_young_pred2 PREDICTED=young_low;
run;

proc genmod data=mets_qtr_combined plots=none;
model mets_std_young_up = qtr / dist=poisson link=log;
output out=mets_young_pred3 PREDICTED=young_up;
run;

data mets_range;
merge mets_qtr_combined (keep=qtr timestamp)
mets_old_pred1 (keep=qtr old_obs)
mets_old_pred2 (keep=qtr old_low)
mets_old_pred3 (keep=qtr old_up)
mets_young_pred1 (keep=qtr young_obs)
mets_young_pred2 (keep=qtr young_low)
mets_young_pred3 (keep=qtr young_up);
by qtr;
run;

 

FDA Issues Draft Guidance: Form and Content of the Unique Device Identifier (UDI)

When finalized, this draft document will clarify for industry, FDA-accredited issuing agencies, and FDA staff the requirements under 21 CFR 801.40. Specifically, this draft guidance defines the expected content and forms of the Unique Device Identifier (UDI), to assist both labelers, as defined under 21 CFR 801.3, and FDA-accredited issuing agencies, as defined under 21 CFR 830.3, to better ensure the UDIs developed under systems for the issuance of UDIs are in compliance with the Unique Device Identification System Rule, 78 FR 58786 (September 24, 2013) (UDI Rule).

Read the draft guidance.