/*_________________________________________________________________________________________ Series: SAS Code for Accelerometer Data Cleaning and Management Name: Step 4 - Advanced Analysis Date: July 30, 2015 For: Healthy Start / Départ Santé Purpose: Summarize the previous information per person. Estimate the probability of adherence to physical activity guidelines. Input: Perday (from Step 3) (Daily count and step data) Output: Perperson (Average daily count and step data) Info: This series of codes is based on the scripts prepared by Statistics Canada for the analysis of data from the Health Measures Survey, the Actical Accelerometer Data Analysis Support Tool (Accel+), which is available from the CHEO Research Institute for Healthy Active Living and Obesity Research (HALO) (http://www.haloresearch.ca/accel/). The current version of this code was prepared by Jonathan Boudreau and Mathieu Bélanger at the Centre de Formation Médicale du Nouveau-Brunswick (CFMNB). Version: 1.3 Citation: Boudreau, J. & Bélanger, M. SAS Code for Accelerometer Data Cleaning and Management: Step 4 - Advanced Analysis, Version 1.3. http://mathieubelanger.recherche.usherbrooke.ca/Actical.htm#2-5. Updated July 30, 2015. Accessed [date accessed: month day, year]. _________________________________________________________________________________________*/ /****************** STEP 4.1 SPECIFY A WORK DIRECTORY ***********************************************/ /* Make sure you are using the same one as in Code Step 1, Code Step 2 and Code Step 3 */ *----------------------------------------------------------------------------------------------------*; %LET po_path1 = C:\Users\Example\SAS Output; /****************** STEP 4.2 SPECIFY A LOCATION FOR THE EXCEL FILE OUTPUT ****************************/ * Specify an Excel file to output your summary dataset. *----------------------------------------------------------------------------------------------------*; %LET xls_path = &po_path1.\AvgPATimes.xls; /****************** STEP 4.3 SET LABELS *********************************************************/ /* Define the labels to be applied to the subsets. */ *----------------------------------------------------------------------------------------------------*; %LET dc_text = Daycare Hours Only; /* Labels applied to values in the subset specified in Step 2.5 */ %LET ndc_text = Non-daycare Hours Only; /* Labels applied to values outside the subset specified in Step 2.5 */ /****************** STEP 4.4 SET BOUT LENGTH *********************************************************/ /* Set the bout length criterion (in epoch lengths). Must be the same value as in Code Step 3. */ *----------------------------------------------------------------------------------------------------*; %LET bout_lgth = 1; /****************** STEP 4.5 SET VALID WEAR TIME CRITERIA ********************************************/ /* Set the interval and minimum wear time for valid observations. By default, set to 10 hours of wear time in a day. */ *----------------------------------------------------------------------------------------------------*; %LET HOURS_FLG = ; /* Leave blank for the entire dataset (default), or set to _dc for the subset specified in Step 2.5, or _ndc for its compliment. */ %LET valid_wear = 10; /* Minimum number of hours of wear time (default = 10 hours). */ /****************** STEP 4.6 SET DAILY CRITERIA OF PHYSICAL ACTIVITY *********************************/ /* Specify the daily physical activity criteria for ages under 5, and ages 5 and up. By default, these values are set at respectively 180 minutes of light, moderate of vigorous physical activity per day, and 60 minutes of moderate or vigorous physical activity per day, for 5 days per week. Valid options for the level of physical activity are: _sed(sedentary), _lt(light), _m(moderate), _v(vigorous), _mv(moderate or vigorous) _pa(light, moderate or vigorous) */ *----------------------------------------------------------------------------------------------------*; %LET DAY_HOURS_FLG = ; /* Leave blank for the entire dataset (default), or set to _dc for the subset specified in Step 2.5, or _ndc for its compliment. */ %LET DAY_CRITERIA_BOUTS = ; /* Leave this value blank for bout intervals defined in Code Step 3.7, and set equal to &bout_lgth. for bouts defined in Code Step 3.6. */ %LET N_DAY_ACTIVE_CRITERIA = 5; /* Number of active days in a week to make a person active (default = 5). */ %LET DAY_FLG_TYPE_1 = _pa; /* Level of physical activity on which an active day is based for ages under 5 (default = _pa). */ %LET DAY_FLG_TYPE_2 = _mv; /* Level of physical activity on which an active day is based for ages 5 and up (default = _mv). */ %LET DAY_CRITERIA_1 = 180; /* Number of minutes of physical acticity to make a day active for ages under 5 (default = 180). */ %LET DAY_CRITERIA_2 = 60; /* Number of minutes of physical activity to make a day active for ages 5 and up (default = 60). */ /****************** STEP 4.7 SET WEEKLY CRITERIA OF PHYSICAL ACTIVITY ********************************/ /* Set the weekly criteria of physical activity. The default values are computed using the daily criteria in Code Step 4.5. */ *----------------------------------------------------------------------------------------------------*; %LET WEEK_HOURS_FLG = ; /* Leave blank for the entire dataset (default), or set to _dc for the subset specified in Step 2.5, or _ndc for its compliment. */ %LET WEEK_CRITERIA_BOUTS = ; /* Leave this value blank for bout intervals defined in Code Step 3.7, and set equal to &bout_lgth. for bouts defined in Code Step 3.6. */ %LET WEEK_FLG_TYPE_1 = &DAY_FLG_TYPE_1.; /* Level of physical activity on which an active week is based for ages under 5 (default = daily level). */ %LET WEEK_FLG_TYPE_2 = &DAY_FLG_TYPE_2.; /* Level of physical activity on which an active week is based for ages 5 and up (default = daily level). */ %LET WEEK_CRITERIA_1 = %EVAL(&DAY_CRITERIA_1. * &N_DAY_ACTIVE_CRITERIA./7); /* Weekly criteria for ages under 5. */ %LET WEEK_CRITERIA_2 = %EVAL(&DAY_CRITERIA_2. * &N_DAY_ACTIVE_CRITERIA./7); /* Weekly criteria for ages 5 and up. */ /****************** STEP 4.8 STEPS CRITERIA OF PHYSICAL ACTIVITY ***************************************/ /* Set the steps and interval on which to evaluate the number of steps. By default, the criteria is set to 10,000 steps per day on average. */ *----------------------------------------------------------------------------------------------------*; %LET STEP_HOURS_FLG = ; /* Leave blank for the entire dataset (default), or set to _dc for the subset specified in Step 2.5, or _ndc for its compliment. */ %LET STEP_CRITERIA = 10000; /* Daily step criteria (default = 10000). */ /****************** STEP 4.8 EXECUTION ****************************************************************/ /* From this point onwards, no modifications are required for Code Step 4. */ *----------------------------------------------------------------------------------------------------*; /* Outputs */ LIBNAME outlib "&po_path1"; *-----------------------------------------------------------------------------------------------------*; * Read in perday from Code Step 3. *; * Calculate the number of valid days, the variable averages on valid days, and the probability of *: * adhering to the guidelines defined in Code Steps 4.6 to 4.8. *; *-----------------------------------------------------------------------------------------------------*; DATA Perday; SET OUTLIB.PERDAY; RUN; PROC SORT DATA = Perday; BY clinicid; RUN; PROC CONTENTS DATA=Perday VARNUM NOPRINT OUT=VarTemp(KEEP=NAME VARNUM); RUN; PROC SORT DATA=VarTemp; BY VARNUM; RUN; PROC SQL NOPRINT; SELECT TRIM(LEFT(NAME)) INTO :vars SEPARATED BY ' ' FROM VarTemp WHERE TRIM(LEFT(NAME)) NOT IN ("am_identify_no" "clinicid" "dayworn" "dayofweek_worn"); SELECT TRIM(LEFT(NAME))||"_avg" INTO :vars_avg SEPARATED BY ' ' FROM VarTemp WHERE TRIM(LEFT(NAME)) NOT IN ("am_identify_no" "clinicid" "dayworn" "dayofweek_worn"); QUIT; PROC MEANS DATA = OUTLIB.PERDAY NOPRINT; BY CLINICID; VAR &vars; WHERE wear_hr >=&valid_wear.; OUTPUT OUT=Perperson(DROP=_type_ _freq_) N(wear_hr)=n_valid MEAN=&vars_avg; RUN; /* Active day criteria based on bouts determined in Code Step 3 for ages under 5. */ PROC MEANS DATA = OUTLIB.PERDAY NOPRINT; BY CLINICID; VAR tot_dur&DAY_FLG_TYPE_1.&WEEK_CRITERIA_BOUTS.&DAY_HOURS_FLG.; WHERE wear_hr >=&valid_wear. AND tot_dur&DAY_FLG_TYPE_1.&DAY_CRITERIA_BOUTS. >= &DAY_CRITERIA_1.; OUTPUT OUT=guide1(DROP=_type_ _freq_) N=n_active_1; RUN; /* Active day criteria based on bouts determined in Code Step 3 for ages 5 and up. */ PROC MEANS DATA = OUTLIB.PERDAY NOPRINT; BY CLINICID; VAR tot_dur&DAY_FLG_TYPE_2.&WEEK_CRITERIA_BOUTS.&DAY_HOURS_FLG.; WHERE wear_hr >=&valid_wear. AND tot_dur&DAY_FLG_TYPE_2.&DAY_CRITERIA_BOUTS. >= &DAY_CRITERIA_2.; OUTPUT OUT=guide2(DROP=_type_ _freq_) N=n_active_2; RUN; DATA PERPERSON; MERGE PERPERSON GUIDE1 GUIDE2; BY CLINICID; /* Replace structural missing values with 0 for the number of active days based on the daily criteria for ages under 5. */ IF MISSING(N_ACTIVE_1) AND NOT MISSING(N_VALID) THEN N_ACTIVE_1 = 0; /* Replace structural missing values with 0 for the number of active days based on the daily criteria for ages 5 and up. */ IF MISSING(N_ACTIVE_2) AND NOT MISSING(N_VALID) THEN N_ACTIVE_2 = 0; /* Weekly criteria for ages under 5. */ IF tot_dur&WEEK_FLG_TYPE_1.&WEEK_CRITERIA_BOUTS.&WEEK_HOURS_FLG._AVG >= &WEEK_CRITERIA_1. THEN WEEK_CRITERIA_1 = 1; ELSE WEEK_CRITERIA_1 = 0; /* Weekly criteria for ages 5 and up. */ IF tot_dur&WEEK_FLG_TYPE_2.&WEEK_CRITERIA_BOUTS.&WEEK_HOURS_FLG._AVG >= &WEEK_CRITERIA_2. THEN WEEK_CRITERIA_2 = 1; ELSE WEEK_CRITERIA_2 = 0; /* Daily criteria for ages under 5. */ PROB_DAY_CRITERIA_1 = 1-PROBBETA(&N_DAY_ACTIVE_CRITERIA./7,N_ACTIVE_1+1,N_VALID-N_ACTIVE_1+1); /* Daily criteria for ages 5 and up. */ PROB_DAY_CRITERIA_2 = 1-PROBBETA(&N_DAY_ACTIVE_CRITERIA./7,N_ACTIVE_2+1,N_VALID-N_ACTIVE_2+1); /* Steps criteria. */ IF AMSTEP&STEP_HOURS_FLG._AVG > &STEP_CRITERIA. THEN STEP_CRITERIA=1; ELSE STEP_CRITERIA=0; RUN; DATA PERPERSON; SET PERPERSON; RENAME /* All hours */ TOT_CNT_WR_AVG=CPM_AVG WEAR_HR_AVG=WEAR_HR_AVG TOT_DUR_PA&bout_lgth._AVG=PA_MIN_AVG TOT_DUR_MV&bout_lgth._AVG=MVPA_MIN_AVG TOT_DUR_V&bout_lgth._AVG=VIGOROUS_MIN_AVG TOT_DUR_M&bout_lgth._AVG=MODERATE_MIN_AVG TOT_DUR_LT&bout_lgth._AVG=LIGHT_MIN_AVG TOT_DUR_SED&bout_lgth._AVG=SEDENTARY_MIN_AVG TOT_DUR_PA_AVG=PA_BOUTS_AVG TOT_DUR_MV_AVG=MVPA_BOUTS_AVG TOT_DUR_V_AVG=VIGOROUS_BOUTS_AVG TOT_DUR_M_AVG=MODERATE_BOUTS_AVG TOT_DUR_LT_AVG=LIGHT_BOUTS_AVG TOT_DUR_SED_AVG=SEDENTARY_BOUTS_AVG AMSTEP_AVG=STEP_COUNT_AVG /* Subset hours only */ TOT_CNT_WR_DC_AVG=CPM_AVG_DC WEAR_HR_DC_AVG=WEAR_HR_AVG_DC TOT_DUR_PA&bout_lgth._DC_AVG=PA_MIN_AVG_DC TOT_DUR_MV&bout_lgth._DC_AVG=MVPA_MIN_AVG_DC TOT_DUR_V&bout_lgth._DC_AVG=VIGOROUS_MIN_AVG_DC TOT_DUR_M&bout_lgth._DC_AVG=MODERATE_MIN_AVG_DC TOT_DUR_LT&bout_lgth._DC_AVG=LIGHT_MIN_AVG_DC TOT_DUR_SED&bout_lgth._DC_AVG=SEDENTARY_MIN_AVG_DC TOT_DUR_PA_DC_AVG=PA_BOUTS_AVG_DC TOT_DUR_MV_DC_AVG=MVPA_BOUTS_AVG_DC TOT_DUR_V_DC_AVG=VIGOROUS_BOUTS_AVG_DC TOT_DUR_M_DC_AVG=MODERATE_BOUTS_AVG_DC TOT_DUR_LT_DC_AVG=LIGHT_BOUTS_AVG_DC TOT_DUR_SED_DC_AVG=SEDENTARY_BOUTS_AVG_DC AMSTEP_DC_AVG=STEP_COUNT_AVG_DC /* Non-subset hours only */ TOT_CNT_WR_NDC_AVG=CPM_AVG_NDC WEAR_HR_NDC_AVG=WEAR_HR_AVG_NDC TOT_DUR_PA&bout_lgth._NDC_AVG=PA_MIN_AVG_NDC TOT_DUR_MV&bout_lgth._NDC_AVG=MVPA_MIN_AVG_NDC TOT_DUR_V&bout_lgth._NDC_AVG=VIGOROUS_MIN_AVG_NDC TOT_DUR_M&bout_lgth._NDC_AVG=MODERATE_MIN_AVG_NDC TOT_DUR_LT&bout_lgth._NDC_AVG=LIGHT_MIN_AVG_NDC TOT_DUR_SED&bout_lgth._NDC_AVG=SEDENTARY_MIN_AVG_NDC TOT_DUR_PA_NDC_AVG=PA_BOUTS_AVG_NDC TOT_DUR_MV_NDC_AVG=MVPA_BOUTS_AVG_NDC TOT_DUR_V_NDC_AVG=VIGOROUS_BOUTS_AVG_NDC TOT_DUR_M_NDC_AVG=MODERATE_BOUTS_AVG_NDC TOT_DUR_LT_NDC_AVG=LIGHT_BOUTS_AVG_NDC TOT_DUR_SED_NDC_AVG=SEDENTARY_BOUTS_AVG_NDC AMSTEP_NDC_AVG=STEP_COUNT_AVG_NDC ; RUN; DATA PERPERSON; RETAIN CLINICID /* All hours */ WEAR_HR_AVG CPM_AVG PA_MIN_AVG MVPA_MIN_AVG VIGOROUS_MIN_AVG MODERATE_MIN_AVG LIGHT_MIN_AVG SEDENTARY_MIN_AVG PA_BOUTS_AVG MVPA_BOUTS_AVG VIGOROUS_BOUTS_AVG MODERATE_BOUTS_AVG LIGHT_BOUTS_AVG SEDENTARY_BOUTS_AVG STEP_COUNT_AVG /* Subset hours only */ WEAR_HR_AVG_DC CPM_AVG_DC PA_MIN_AVG_DC MVPA_MIN_AVG_DC VIGOROUS_MIN_AVG_DC MODERATE_MIN_AVG_DC LIGHT_MIN_AVG_DC SEDENTARY_MIN_AVG_DC PA_BOUTS_AVG_DC MVPA_BOUTS_AVG_DC VIGOROUS_BOUTS_AVG_DC MODERATE_BOUTS_AVG_DC LIGHT_BOUTS_AVG_DC SEDENTARY_BOUTS_AVG_DC STEP_COUNT_AVG_DC /* Non-subset hours only */ WEAR_HR_AVG_NDC CPM_AVG_NDC PA_MIN_AVG_NDC MVPA_MIN_AVG_NDC VIGOROUS_MIN_AVG_NDC MODERATE_MIN_AVG_NDC LIGHT_MIN_AVG_NDC SEDENTARY_MIN_AVG_NDC PA_BOUTS_AVG_NDC MVPA_BOUTS_AVG_NDC VIGOROUS_BOUTS_AVG_NDC MODERATE_BOUTS_AVG_NDC LIGHT_BOUTS_AVG_NDC SEDENTARY_BOUTS_AVG_NDC STEP_COUNT_AVG_NDC /* Active criteria */ N_VALID N_ACTIVE_1 N_ACTIVE_2 WEEK_CRITERIA_1 WEEK_CRITERIA_2 PROB_DAY_CRITERIA_1 PROB_DAY_CRITERIA_2 STEP_CRITERIA; SET PERPERSON; LABEL CLINICID="ID number" /* All hours */ WEAR_HR_AVG="Total number of wear hours on average on valid days" CPM_AVG="Average count per minute on valid days" PA_MIN_AVG="Average minutes of light to vigorous physical activity on valid days" MVPA_MIN_AVG="Average minutes of moderate to vigorous physical activity on valid days" VIGOROUS_MIN_AVG="Average minutes of vigorous physical activity on valid days" MODERATE_MIN_AVG="Average minutes of moderate physical activity on valid days" LIGHT_MIN_AVG="Average minutes of light physical activity on valid days" SEDENTARY_MIN_AVG="Average minutes of sedentary time on valid days" PA_BOUTS_AVG="Average minutes of light to vigorous physical activity in bouts on valid days" MVPA_BOUTS_AVG="Average minutes of moderate to vigorous physical activity in bouts on valid days" VIGOROUS_BOUTS_AVG="Average minutes of vigorous physical activity in bouts on valid days" MODERATE_BOUTS_AVG="Average minutes of moderate physical activity in bouts on valid days" LIGHT_BOUTS_AVG="Average minutes of light physical activity in bouts on valid days" STEP_COUNT_AVG="Average steps on valid days" /* Subset hours only */ WEAR_HR_AVG_DC="Total number of wear hours on average on valid days (&dc_text)" CPM_AVG_DC="Average count per minute on valid days (&dc_text)" PA_MIN_AVG_DC="Average minutes of light to vigorous physical activity on valid days (&dc_text)" MVPA_MIN_AVG_DC="Average minutes of moderate to vigorous physical activity on valid days (&dc_text)" VIGOROUS_MIN_AVG_DC="Average minutes of vigorous physical activity on valid days (&dc_text)" MODERATE_MIN_AVG_DC="Average minutes of moderate physical activity on valid days (&dc_text)" LIGHT_MIN_AVG_DC="Average minutes of light physical activity on valid days (&dc_text)" SEDENTARY_MIN_AVG_DC="Average minutes of sedentary time on valid days (&dc_text)" PA_BOUTS_AVG_DC="Average minutes of light to vigorous physical activity in bouts on valid days (&dc_text)" MVPA_BOUTS_AVG_DC="Average minutes of moderate to vigorous physical activity in bouts on valid days (&dc_text)" VIGOROUS_BOUTS_AVG_DC="Average minutes of vigorous physical activity in bouts on valid days (&dc_text)" MODERATE_BOUTS_AVG_DC="Average minutes of moderate physical activity in bouts on valid days (&dc_text)" LIGHT_BOUTS_AVG_DC="Average minutes of light physical activity in bouts on valid days (&dc_text)" STEP_COUNT_AVG_DC="Average steps on valid days (&dc_text)" /* Non-subset hours only */ WEAR_HR_AVG_NDC="Total number of wear hours on average on valid days (&ndc_text)" CPM_AVG_NDC="Average count per minute on valid days (&ndc_text)" PA_MIN_AVG_NDC="Average minutes of light to vigorous physical activity on valid days (&ndc_text)" MVPA_MIN_AVG_NDC="Average minutes of moderate to vigorous physical activity on valid days (&ndc_text)" VIGOROUS_MIN_AVG_NDC="Average minutes of vigorous physical activity on valid days (&ndc_text)" MODERATE_MIN_AVG_NDC="Average minutes of moderate physical activity on valid days (&ndc_text)" LIGHT_MIN_AVG_NDC="Average minutes of light physical activity on valid days (&ndc_text)" SEDENTARY_MIN_AVG_NDC="Average minutes of sedentary time on valid days (&ndc_text)" PA_BOUTS_AVG_NDC="Average minutes of light to vigorous physical activity in bouts on valid days (&ndc_text)" MVPA_BOUTS_AVG_NDC="Average minutes of moderate to vigorous physical activity in bouts on valid days (&ndc_text)" VIGOROUS_BOUTS_AVG_NDC="Average minutes of vigorous physical activity in bouts on valid days (&ndc_text)" MODERATE_BOUTS_AVG_NDC="Average minutes of moderate physical activity in bouts on valid days (&ndc_text)" LIGHT_BOUTS_AVG_NDC="Average minutes of light physical activity in bouts on valid days (&ndc_text)" STEP_COUNT_AVG_NDC="Average steps on valid days (&ndc_text)" /* Active criteria */ N_VALID="Number of valid days" N_ACTIVE_1="Number of active days according to daily criteria for ages under 5" N_ACTIVE_2="Number of active days according to daily criteria for ages 5 and up" WEEK_CRITERIA_1="Follows the weekly guideline criteria for ages under 5" WEEK_CRITERIA_2="Follows the weekly guideline criteria for ages 5 and up" PROB_DAY_CRITERIA_1="Probability of adherence to the daily guideline criteria for ages under 5" PROB_DAY_CRITERIA_2="Probability of adherence to the daily guideline criteria for ages 5 and up" STEP_CRITERIA="Follows the weekly step count criteria" ; RUN; /* Output a permanent dataset. */ DATA OUTLIB.PERPERSON; SET PERPERSON; RUN; /* Print output to Excel file. */ PROC EXPORT DATA = perperson OUTFILE = "&xls_path." REPLACE; RUN; *---------------------------------------------------------------------------------------------------*; * THIS CODE ENDS WITH A DATAFILE CALLED "PERPERSON". THIS IS THE FINAL OUTPUT DATAFILE. *; *---------------------------------------------------------------------------------------------------*;