* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download Analyzing Clinical Drug Utilization
Psychedelic therapy wikipedia , lookup
Neuropsychopharmacology wikipedia , lookup
Orphan drug wikipedia , lookup
Polysubstance dependence wikipedia , lookup
Compounding wikipedia , lookup
Pharmacognosy wikipedia , lookup
Neuropharmacology wikipedia , lookup
Theralizumab wikipedia , lookup
Pharmaceutical industry wikipedia , lookup
Drug design wikipedia , lookup
Drug interaction wikipedia , lookup
Pharmacogenomics wikipedia , lookup
Prescription costs wikipedia , lookup
Paper PR01 Analyzing Clinical Drug Utilization Jianming He, Brian Griffin Solucient LLC, Berkeley Heights, NJ ABSTRACT This paper discusses several core programming issues in identifying and reporting clinical drug utilization pattern by using SAS programming language. The most concerned topics for drug therapy, like drug switching, concomitance, compliance of therapy etc, are discussed in detail. It lays out the framework to complete the study successfully. We will introduce a tool of SAS drug intelligence, which meets both technical and non-technical business analysts’ needs. A sample code performed on a mock up dataset is listed for reference. INTRODUCTION Clinical data analysis helps us understand drug effectiveness and efficiency. It provides insight on pharmaceutical marketing strategy and industry trends, to assist in targeting the right customers. Researchers are interested in patterns of drug usage, how drugs are used in combination therapy, how they are switched within drug class, or changes in rout for a given drug. For the inpatient typically drug data has a patient identifier, dosage, route, drug name, drug code, drug cost etc. In this paper we will concentrate in analyzing drug usage patterns. We will use data elements such as patient id (PID), drug name (DRUG), service day (SERD), etc as the sample dataset and name it as dataset “master”. Data master; Input pid Cards; 1 A 1 1 A 1 B 5 1 B 1 A 8 1 A ; drug $ serd @@; 2 1 A 3 1 A 4 6 1 B 7 1 A 7 9 2 … /* More Records here */ CORE ISSUES FOR IDENTIFYING DRUG UTILIZATION PATTERN 1) Drug Compliance Compliance measures whether a patient is taking their medication as prescribed. Some data sources only provide the medication start time and stop time. We will need to use drug guide lines to populate the service date in between start and stop times and assume the patient actually takes the medication. For example, ARANESP® (Darbepoetin alfa) is given once every two weeks. Let ’s assume we have a dataset with patient identifier ( PID), drug identifier (drug), drug start date (start), drug stop date (stop). The following code will populate the service day according to the drug usage guideline. If the data is populated with drug service date, then dosing frequencies can be compared to guidelines and best practices to check with compliance. do serd=start to stop; if mod(serd,14)=0; output; end; 2) Switching Pattern There are a couple of definitions on therapy lines. One definition is to choose therapy line according to the drug usage sequence. If we are just interested in no more than two drug therapy lines, it is fine to compare the drug initiation day. However, it does not work on more than two therapy lines. At the second switch, the second drug could switch back to the initial drug. Therefore we need determine therapy lines based on switching patterns. With regard to drug therapy, switching in medication is defined as a patient stops taking drug A and switches to drug B. Take a two drugs case as an example. A patient can switch from drug A to drug B at day 5 and switch back to drug A at day 7. We need to use the LAG function to show the switching patterns. 1 The diagram captures the patients (pid=1) ’s behavior in the data set “Master”. We are expecting to get a result as: SERD 5 7 CHANGE A->B B->A Drug B Drug A Day 1 Drug A 2 3 4 5 6 7 8 9 Diagram 1) Switching Therapy One solution is to use the LAG function to solve the problem. The following code will figure out the switching patterns. data switch; set master; by pid todrug notsorted; where todrug ne '' ; if first.todrug then do; fromdrug=lag(todrug); change =compress(fromdrug||'->'||todrug); if not first.pid then output; end; run; The above code delineates how a patient was switched from one drug to a second drug. However, if a combination of drugs are used at the same time (combination therapy), the code will pick only one drug depending on how the drug list is sorted. To capture how drugs in combination therapy are switched, we need to refresh the dataset further and use the code in the next section. Frequently studies are focused on how initial drugs are switched to second line drugs and how second line drugs are switched to third line drugs. For the higher order switching, it depends on the specific research needs. Second Initial drug CAB LAB Cancidas Fluconzole Sporanox Vfend CAB * * * * * * LAB * * * * * * Cancidas * * * * * * Fluconazole * * * * * * Sporanox * * * * * * Vfend * * * * * * Diagram 2) A sample template of reporting antifungal drug1 switching 3) Drug Combination Therapy When patient takes multiple medications simultaneously to treat a condition, this is called combination therapy. There are a number of distinct models used in determining combination therapy. Most drug combinations occur between two drugs. For the convenience of our discussion, in the rest of the paper we are dealing with two drugs combinations only. 1 CAB, Ampho B tablets, LAB, Ampho B lipid. These are all antifungal drugs. 2 In an out patient setting, there are some difficulties in discerning whether a patient is concomitantly taking medications or whether s/he has dropped off of one the medications. We may compute the combination therapy by the sequence of fills etc. In the inpatient environment, we may define the combination as the prescription overlaps. In this paper we will focus on the use of files where the daily administration of drugs is recorded such as would be found in hospital inpatient data. For instance, drug A and drug B are used in combination from day 4 to day 8. For this time frame, there is a combination therapy of drug A and drug B. We are primarily interested in two drug combination therapies. To capture all two drugs combinations out of the same therapeutic drug class, PROC PLAN in SAS/STAT provides effective solution. Drug B Drug A Day 1 2 3 4 5 6 7 8 9 Diagram 3) Combination Therapies If two drugs are set with a combination flag, the old dataset needs to be refreshed. This is especially important when mono therapy and combo therapy are analyzed in the same time. We may create new a drug name for the different combined set of drugs and set the previous drug index to zero. Reporting combination therapy can be formatted as a half triangle (see below). Take the antifungal drug market as an example, we may design the output templates as Diagram 4. There is no need to report diagonal cells because they represent mono therapies. As shown in the following template, there is no need to report in the shaded cells. CAB LAB Cancidas Fluconzole Sporanox Vfend * * * * * * * * * * * * * * CAB LAB Cancidas Fluconazole Sporanox * Vfend Diagram 4) A sample template of reporting Concomitance 4) Consecutive condition check When patients take medications, the days of administration are not always consecutive for a variety of reasons including missing data entry or lapses in prescribing. It is advised that a consecutive check on the generated switching or combination data be done. We want to ensure a drug is used in combination with another drug at least two days or more. Therefore, the consecutive check is important in our data manipulation. A LAG function is a good tool for this problem. Remember, the consecutive check is not a must, it depends on the different business questions. IMPLEMENTING STRATEGY What is the best way to do the data analysis for clinical drug utilization analysis? 1) Data cleaning. Both statistical and pharmacology knowledge is needed for a data quality check. It is advisable to check the dose and administration information as a guard against data entry error skewing study results. 3 2) It is better to perform the combination study first and then do the switching study. For a combination study, we need know if a consecutive usage check is needed and what is the threshold. Are we interested in more than three drug combinations? Once we set up the combination flag we may refresh the dataset to make the mono therapy flag zero. The new datasets will be a good starting point for switching research. Data Cleaning Drug usage trend study Combo Study N Consecutive Check? Y Consecutive check Switching Study N Need Fresh Data ? Y Refreshing Data Consecutive Check? N Y Consecutive Check Other Studies Diagram 5) Flow chart for the drug pattern identification 4 3) For switching studies, a business decision is needed for whether we need consecutive check or not. Are we interested in one Combination therapy or multiple difference combination therapies etc? 4) If the data is longitudinal, there are some other issues that might be involved. For example, persistency, whether a patient is still on therapy at a given timeframe, patient wash out time period, etc. Since those topics do not appear challenging in coding, they are not our focus. In the appendix, we show a sample code for a mock up clinical data set to address a topic. Interested readers can find out what the solution is for each topic. BUILDING A PRODUCT FOR CLINICAL DRUG INTELLIGENCE With SAS/Intranet or other OLAP tools like Microstrategy ©, we can build up a clinical drug intelligence solution tool for pharmaceutical or other health care business marketing department. SAS Clinical Drug Intelligence Tools 1.0 Choose a Standard Report Select a Standard Report from the drop-down list box. If you want to create a name for your report, type it in the Name Your Report field. Available Drug Therapy Reports Drug sw itching report Name Your Report Antifungal Drug Sw itching Patterns Diagram 6) An example of the drug market intelligence solution tool In this market basket analysis, we need address the effectiveness of: • Market segmentation (including patient, physician and hospital) • Characteristics of drug therapy • Cross effect of drugs therapy • Market share of chosen drugs Market segmentation definition is usually based on who the customer is. If targeting physicians, the characteristic of physician like specialty, graduate years etc will be factors for modeling. Hospitals can be broken by bed size, teaching or non teaching status. Patients can be segmented by diagnosis and procedures, or by drug therapies or even combination of them. For instance, for antifungal drug patients, we may break days of therapy by prophylaxis, first line treatment usage, subsequent treatment etc. Or, by diagnosis and procedures, we can break the days of therapy as cancer, HIV/AIDS, burn, renal insufficiency, liver dysfunction, diabetes, or other. For drug therapy we have the flexibility to choose selected drug route or dosage. Patients can also be broken by drug switching patterns etc. Besides those methods, statistical methods like cluster analysis or factor analysis are also applicable. We also have the capability to report the days of drug initiation trend, length of therapy, average dosage etc. Drop-down windows are created for analyzing drug occurrence, combination and switching of therapy. Diagram 6 shows such an example. 5 To help business analysts, this tool has the functionality to project patient counts and dosage units to national levels. To help make comparisons, risk adjustment and severity adjusting factors also need to be considered. Based on these techniques for drug utilization, a tool for drug market intelligence can refresh the clinical drug ad hoc studies from product centric to customer centric. Therefore, the ROI of the efforts can be tremendously increased. CONCLUSION A strategic solution for clinical drug utilization is always needed before coding because of the complexity of the question. It is important to select the right sequence of studies because one study may be the basis of the other. For a comprehensive strategic solution, we can use SAS to create a standard product to get better insight. REFERENCE SAS institute Inc. (1999), SAS online Document©, Cary, NC: SAS institute Inc. Aslam Chaudhry (2004), CRM: Making it Simple for the Banking Industry, Proceedings of the Twenty-ninth Annual SAS Users Group International Conference, Cary, NC: SAS Institute Inc. ACKNOWLEDGEMENTS Thanks to Anne Mahoney for valuable comments. SAS and all other Institute Inc. product or service names are registered trademarks or trademarks of SAS institute Inc. in the USA and other countries. ® indicates USA registration. Other brand and product names are trademarks of their respective companies. CONTACTS Jianming He Solucient LLC Berkeley Heights, NJ 07922 (734) 669-7835 [email protected] Brian Griffin Solucient LLC Berkeley Heights, NJ 07922 (734) 669-7834 [email protected] 6 APPENDIX ****************************************************************************** * A Sample Code for Clinical Drug Utilization Pattern * * * ****************************************************************************** ; ****************************************************************************** * Create a mock up dataset for clinical drug * * For example,we randomly choose a sample with 100 sample and 3 drugs.We want* * a dataset with patient id (PID),service day(SERD) and drug identifier (DRUG* * including zosyn,invanz and vancomycin as an example); * ******************************************************************************; proc format ; value drug 1='Zosyn' 2='Invanz' 3='Vancomycin' ; data seed(keep=pid drug serd l); do pid=1 to 100; do drug=1 to 3; eddate=max(ceil(ranuni(0)*5),ceil(ranuni(7)*7)); stdate=min(ceil(ranuni(0)*5),ceil(ranuni(7)*7)); do serd=stdate to eddate; l=1; label pid='Patient Id' serd='Service Day'; output; end; end; end; run; * Creating a Random Sample without Replacement; data master(drop=obsleft sampsize); sampsize=100; format drug drug.; obsleft=totobs; do while(sampsize>0); pickit+1; if ranuni(0)<sampsize/obsleft then do; set seed point=pickit nobs=totobs; output; sampsize=sampsize-1; end; obsleft=obsleft-1; end; stop; run; * Complete mock up dataset; ****************************************************************************** * Code for Drug Switching; * * * * We use Lag function to track how drug switching happens if the initial drug* * is a combo therapy, the following only pick the first drug depend on how * * they are sorted. We recommend to do switching pattern analysis after combo * * analysis * ******************************************************************************; proc sql noprint; 7 select distinct drug , count(distinct drug) into:drugl separated by ' ', :ct from master; quit; proc sort data=master nodupkey ; by pid serd drug; proc transpose data=master out=switch1 prefix=d ; by pid serd; id drug; var l; run; %macro switch; data switch2 (keep=pid todrug serd); set switch1 ; select; %do i=1 %to &ct; %let drug&i=%scan(&drugl, &i); when (d&&drug&i) todrug=&i; %end; otherwise; end; data finalswitch (drop=fromdrug todrug); set switch2; by pid todrug notsorted; where todrug ne . ; if first.todrug then do; fromdrug=lag(todrug); change =compress(put(fromdrug, drug.)||'->'||put(todrug,drug.)); if not first.pid then output; end; run; %mend; %switch; proc print data=finalswitch label; title1 'Switching pattern'; ****************************************************************************** * Combo therapy analysis * * * * We use proc plan to generate the combination patterns * ******************************************************************************; proc sort data=master(keep=pid serd drug l) nodupkey ; by pid serd drug; proc sql noprint; select distinct drug, count(distinct drug) into: drugl separated by ' ',:ct from master; quit; data _null_; com= fact(&ct)/(fact(%eval(&ct)-2) * fact(2)); call symput('combin', com); proc transpose data=master out=trans ; by pid serd ; id drug; var l; run; %macro combo; data temp; set trans; %do i=1 %to &ct; %let drug&i=%scan(&drugl, &i); if &&drug&i=. then &&drug&i=0; %end; if %do i=1 %to &ct; 8 %let drug&i=%scan(&drugl, &i); &&drug&i+ %end; 0>1; run; ods output Plan=combinations; proc plan; factors Block=&combin ordered Treat= 2 of &ct comb; run; data new; set combinations; j=_n_; format var1 var2 $15.; select (treat1); %do i=1 %to &ct; %let v&i=%scan(&drugl, &i); when (&i) var1="&&v&i"; %end; otherwise; end; select (treat2); %do i=1 %to &ct; %let v=%scan(&drugl, &i); when (&i) var2="&&v&i"; %end; otherwise; end; master=compress(var1||var2||'='||var1||'*'||var2); ifcon= 'if '||compress(var1||var2)||'=1 then do;'||var1||'=0;'||var2||'=0 ; end'; run; proc sql noprint; select distinct master , ifcon into: list1 separated by';', :refresh separated by ';' from new ; quit; data combo; set temp; &list1; &refresh; drop _name_ %do i=1 %to &ct ; %let drug&i=%scan(&drugl, &i); &&drug&i %end;; run; %mend combo; %combo; proc print data=combo label; title 'Combo Pattern'; run; ****************************************************************************** * Consective check * * Before coding, business rule needs to be make on threshold of therapy * * Pattern * ******************************************************************************; ods output variablesalpha=member; proc contents data=combo ;run; proc sql noprint; 9 select distinct variable, count(distinct variable)into :list separated by ' ',:ctl from member where upcase(variable) not in ('PID','SERD'); create table all as select distinct pid, min(serd) as start, max(serd) as end from combo group by pid order by pid; data alld; set all; do serd=start to end; output; end; proc sort data=alld ; by pid serd; proc sort data=combo; by pid serd; data new; merge alld(in=l) combo(in=m); by pid serd; if m then ident=1; else ident=0; %macro consecheck; %do i=1 %to &ctl; %let drug&i=%scan(&list,&i); data temp; set new(keep=pid serd &&drug&i); by pid; drug="&&drug&i"; if &&drug&i=1 and lag(&&drug&i) /*and lag2(&&drug&i)=1*/ then id=1; * Depending the threshold, if two consecutive days we need one LAG function; * If three consecutive days two LAG functions are needed; if id=1 then output; proc sql noprint; select count(*) into:con from temp; %if &con>0 %then %do; data temp; set temp; output; * if at least two consecutive days, use one following statement; * if at least three consecutive days, duplicate the following statement; serd=serd-1; &&drug&i=1; id=1; output; proc sort data=temp (keep =pid serd drug);by pid serd; proc append data=temp base=finalcheck; %end; %mend; %end; %consecheck; run; proc print data=finalcheck label; title 'Consective Check Pattern'; run; 10