BookmarkSubscribeRSS Feed
dlambert1227
Calcite | Level 5

I use a program that someone created decades ago, and that person is no longer available. It appears the program is computing distance scores, and I want to get it to spit out a data file that contains all of those scores. But I admittedly don't fully understand what the program is doing at each step, and I don't know how to get it to produce the data file I want. Google and AI have been little to no help. 

 

The syntax I have is below. The variables I want spit out into a data file are the ones in green font, 

d_imp1-d_imp41 d_lev1-d_lev41 distance
 
Can someone please point me down the right path?
-------------------------------------------------------------------------------------------------------

 

* Important: Length of JOB_EVAL and JOBTITLE variables need to be the same;
options pageno=1 obs=max mprint mlogic symbolgen nodsnferr;
title1 'Job Analysis Survey';
title2 'testing'; *<<<;
%macro merge1(cut,folder,client,filename,var1,value1,var2,value2,clifam1,clifam2);
%local cut folder client filename var1 value1 var2 value2 clifam1 clifam2;
libname client "c:\project folders\linkup-&folder\&client";
libname temp 'c:\project folders\linkup-eas\_master 5-2008\TempFiles';
libname val 'c:\project folders\linkup-eas\_master 5-2008';
 
proc access dbms=xls;
  create work.norm.access;
  path='c:\project folders\linkup-eas\_master 5-2008\fitnorm.xls'; * <<<;
  getnames=y;
  range='a1..b100';
  scantype=y;
  worksheet=fitnorm;
  type 1=n 2=n;
  mixed=yes;
  assign=n;
 
  list all;
 
  create work.norm.view;
  select all;
run;
 
proc sort tagsort data=work.norm out=s_norm;
  by fitvalue;
proc transpose data=s_norm out=rot_norm;
  var d2;
run;
 
data client;
  length battlink $ 75;
  set client.&filename;
  battlink=upcase(battlink);
  if &var1=upcase("&value1"); * <<< select cases - comment out if no parameters specified;
  *if &var2="&value2"; * <<< select cases - comment out if no parameters specified;
 
proc means data=client noprint;
  var t_imp1-t_imp41 t_lev1-t_lev41;
  output out=m_client mean=IMP1-IMP41 LEV1-LEV41;
proc transpose data=m_client out=rotm_cli prefix=client;
  var imp1-imp41 lev1-lev41;
run;
 
proc sort tagsort data=val.PSI_VAL out=s_psi; by soc;
 
data s_onet(drop=i);
  set val.ONet_GWA;
 
array rate(82) imp1-imp41 lev1-lev41;
rat_miss=0;
do i=1 to 82;
   if rate{i}=. then rat_miss+1;
end;
 
if rat_miss=82 then delete;
 
proc sort tagsort;
  by soc;
proc transpose data=s_onet out=rot_onet(drop=_label_);
  var imp1-imp41 lev1-lev41;
  id soc;
run;
 
proc sort tagsort data=rotm_cli; by _name_;
proc sort tagsort data=rot_onet; by _name_;
 
* compute for r;
data corr;
  merge rotm_cli rot_onet;
  by _name_;
 
proc corr data=corr outp=pcorr(drop=_name_ where=(_type_='CORR')) noprint;
  with client1;
proc transpose data=pcorr out=rotpcorr(rename=(col1=corr));
run;
 
data corr2(drop=_name_);
  length soc $ 10;
  set rotpcorr;
 
soc=left(translate(_name_, '-', 'N', '', '_', '.', 'D'));
 
proc sort tagsort;
  by soc;
run;
 
* compute for distance and fit;
data psi(drop=i);
  length psifam $ 25;
  merge s_psi(in=a) s_onet(in=b) corr2(in=c);
  by soc;
  if a and b and c;
 
* jobs included in the validation of families - appendix B of the IST linkup report;
if soc in ('11-3051.00',
   '11-3040.00',
   '51-1011.00') then psifam='Managerial/Supervisory';
   else if soc in ('43-2021.02',
   '43-3011.00',
   '43-3031.00',
   '43-4051.02',
   '43-4071.00',
   '43-5021.00',
   '43-5032.00',
   '43-5061.00',
   '43-5081.03',
   '43-6011.00',
   '43-6014.00',
   '43-9011.00',
   '43-9021.00',
   '43-9022.00',
   '43-9041.01',
   '43-9061.00') then psifam='Clerical/Administrative';
   else if soc in ('17-3023.01',
   '19-4041.02',
   '43-5041.00',
   '49-2022.01',
   '49-2022.05',
   '49-2092.01',
   '49-3011.01',
   '49-3023.01',
   '49-9031.02',
   '49-9051.00',
   '49-9098.00',
   '51-2011.01',
   '51-4012.00',
   '51-4041.00',
   '51-5021.00',
   '51-8013.02',
   '51-9198.01',
   '53-3021.00',
   '53-7051.00') then psifam='Production/Mechanical';
   else if soc in ('15-1021.00',
   '17-2011.00',
   '17-2071.00',
   '17-2112.00',
   '17-2141.00',
   '49-2094.00',
           '17-3013.00') then psifam='Technical'; * <<< ;
 
* compute for corrected validity (p) for each test here;
array r(306) eas01_r eas02_r eas03_r eas04_r eas05_r eas06_r eas07_r eas08_r eas09_r eas10_r
            bst01_r bst02_r bst03_r bst04_r bst05_r bst06_r bst07_r bst08_r bst09_r bst10_r
    bst11_r bst12_r bst13_r bst14_r bst15_r vpw4_r vpw4b_r vpw5_r vpw6_r vpw4sv_r vpw6sv_r vpw6t_r 
            vptec_r vpte_r vptc_r vpsvst_r vpsv_r vps_r vpt_r gpsagr_r gpscon_r gpsext_r gpssta_r gpsope_r gpsprs_r
            gpssel_r gpscar_r gpsdep_r gpschl_r gpsopl_r peta1_r peta_r petb_r ist1_r ist2_r 
            mptc_r msjia_r amap_r mdti_r fst_r fstnew_r pst_r mmt_r salsjt_r srvsjt_r psrea_r psric_r psrie_r psrir_r
            prb_r w5asrt_r w5sp_r osa_r leab_r fsab_r spfld_r spfa_r spfb_r spfc_r spfe_r spff_r spfg_r spfh_r spfi_r spfl_r
    spfm_r spfn_r spfo_r spfq1_r spfq2_r spfq3_r spfq4_r sglex_r sglan_r sgltm_r sglin_r sglsc_r
SDNAT_r SDNAAS_r SDNAEC_r SDNASC_r SDNAFR_r HCFOV_r HCFAC_r HCFAD_r HCFCO_r HCFEQ_r HCFDP_r HCFCC_r HCFQF_r HCFCM_r
NFOV_r NFAC_r NFAD_r NFCO_r NFEQ_r NFDM_r NFDP_r NFCC_r NFQF_r NFCM_r LDOv_r LDAc_r LDAd_r LDCO_r LDCM_r LDDE_r LDIn_r
LDIIA_r LDMC_r LDMO_r LDNeg_r LDONI_r LDPM_r LDPO_r LDPI_r LDPF_r LDSA_r LDSAS_r LDWC_r SACOV_r SACCF_r SACMT_r SACOW_r 
            SACPA_r SACPO_r SACPP_r SACQF_r SACRR_r SACSF_r SACWM_r SACCM_r SLPOV_r SLPFC_r SLPRO_r SLPCS_r SLPDM_r SLPDR_r SLPIN_r 
            SLPII_r SLPLS_r SLPPO_r SLPBR_r SLPAD_r SLPSO_r SLPMR_r SLPCM_r SAMOV_r SAMAT_r SAMAD_r SAMLP_r SAMPA_r SAMPL_r SAMPT_r SAMPM_r 
            SAMRS_r SAMRR_r SAMSO_r SAMTW_r SAMWE_r SAMWT_r SAMMR_r SAMCD_r SAMCM_r SCFOV_r SCFSR_r SCFQR_r SCFIR_r SCFDR_r SCFAT_r 
            SCFAB_r SCFTR_r SCFIN_r SCFCM_r BMAR_r PROAC_r PROAD_r PROCO_r PROLP_r PROMF_r PRORD_r PROVD_r PROCM_r SVFOV_r 
            SVFQR_r SVFSR_r SVFPR_r SVFAR_r SVFTR_r SVFSP_r SVFSL_r SVFCM_r SFPOV_r SFPQR_r SFPST_r SFPPR_r SFPSR_r SFPAR_r SFPTR_r 
            SFPIN_r SFPSP_r SFPSO_r SFPCM_r TMCB_r CALOV_r CALCM_r CALAC_r CALAM_r CALAL_r CALAD_r CALAT_r CALBR_r CALBA_r CALCD_r CALCT_r 
CALCO_r CALCP_r CALCR_r CALCA_r CALCN_r CALCL_r CALCI_r CALDC_r CALDE_r CALDI_r CALDR_r CALET_r CALFB_r CALIP_r CALIS_r CALIA_r
CALIN_r CALIY_r CALDS_r CALLC_r CALLM_r CALLH_r CALCG_r CALMI_r CALNE_r CALOC_r CALOS_r CALPP_r CALPM_r CALPR_r CALQF_r CALSF_r
CALSA_r CALST_r CALSW_r CALSO_r CALSI_r CALTB_r CALTM_r FTRIC_r FTRLF_r FTRCT_r FTRDC_r FTRDO_r FTRIO_r FTRDP_r FTRRF_r FTREN_r
FTRAP_r FTRRE_r FTROP_r FTRDR_r FTRMO_r FTRTW_r FTRST_r FTRSR_r FTRFL_r MDGCR_r MDGFL_r MDGSE_r MDGSY_r LOGIV_r LOGIN_r LOGIA_r
LOGITS_r LOGISP_r LOGIAC_r LOGAV_r LOGAN_r LOGAA_r LOGATS_r;
array p(306) eas01_p eas02_p eas03_p eas04_p eas05_p eas06_p eas07_p eas08_p eas09_p eas10_p
            bst01_p bst02_p bst03_p bst04_p bst05_p bst06_p bst07_p bst08_p bst09_p bst10_p
    bst11_p bst12_p bst13_p bst14_p bst15_p vpw4_p vpw4b_p vpw5_p vpw6_p vpw4sv_p vpw6sv_p vpw6t_p 
            vptec_p vpte_p vptc_p vpsvst_p vpsv_p vps_p vpt_p gpsagr_p gpscon_p gpsext_p gpssta_p gpsope_p gpsprs_p
            gpssel_p gpscar_p gpsdep_p gpschl_p gpsopl_p peta1_p peta_p petb_p ist1_p ist2_p 
            mptc_p msjia_p amap_p mdti_p fst_p fstnew_p pst_p mmt_p salsjt_p srvsjt_p psrea_p psric_p psrie_p psrir_p
            prb_p w5asrt_p w5sp_p osa_p leab_p fsab_p spfld_p spfa_p spfb_p spfc_p spfe_p spff_p spfg_p spfh_p spfi_p spfl_p
    spfm_p spfn_p spfo_p spfq1_p spfq2_p spfq3_p spfq4_p sglex_p sglan_p sgltm_p sglin_p sglsc_p
SDNAT_p SDNAAS_p SDNAEC_p SDNASC_p SDNAFR_p HCFOV_p HCFAC_p HCFAD_p HCFCO_p HCFEQ_p HCFDP_p HCFCC_p HCFQF_p HCFCM_p
NFOV_p NFAC_p NFAD_p NFCO_p NFEQ_p NFDM_p NFDP_p NFCC_p NFQF_p NFCM_p LDOv_p LDAc_p LDAd_p LDCO_p LDCM_p LDDE_p LDIn_p
LDIIA_p LDMC_p LDMO_p LDNeg_p LDONI_p LDPM_p LDPO_p LDPI_p LDPF_p LDSA_p LDSAS_p LDWC_p SACOV_p SACCF_p SACMT_p SACOW_p 
            SACPA_p SACPO_p SACPP_p SACQF_p SACRR_p SACSF_p SACWM_p SACCM_p SLPOV_p SLPFC_p SLPRO_p SLPCS_p SLPDM_p SLPDR_p SLPIN_p 
            SLPII_p SLPLS_p SLPPO_p SLPBR_p SLPAD_p SLPSO_p SLPMR_p SLPCM_p SAMOV_p SAMAT_p SAMAD_p SAMLP_p SAMPA_p SAMPL_p SAMPT_p SAMPM_p 
            SAMRS_p SAMRR_p SAMSO_p SAMTW_p SAMWE_p SAMWT_p SAMMR_p SAMCD_p SAMCM_p SCFOV_p SCFSR_p SCFQR_p SCFIR_p SCFDR_p SCFAT_p 
            SCFAB_p SCFTR_p SCFIN_p SCFCM_p BMAR_p PROAC_p PROAD_p PROCO_p PROLP_p PROMF_p PRORD_p PROVD_p PROCM_p SVFOV_p 
            SVFQR_p SVFSR_p SVFPR_p SVFAR_p SVFTR_p SVFSP_p SVFSL_p SVFCM_p SFPOV_p SFPQR_p SFPST_p SFPPR_p SFPSR_p SFPAR_p SFPTR_p 
            SFPIN_p SFPSP_p SFPSO_p SFPCM_p TMCB_p CALOV_p CALCM_p CALAC_p CALAM_p CALAL_p CALAD_p CALAT_p CALBR_p CALBA_p CALCD_p CALCT_p 
CALCO_p CALCP_p CALCR_p CALCA_p CALCN_p CALCL_p CALCI_p CALDC_p CALDE_p CALDI_p CALDR_p CALET_p CALFB_p CALIP_p CALIS_p CALIA_p
CALIN_p CALIY_p CALDS_p CALLC_p CALLM_p CALLH_p CALCG_p CALMI_p CALNE_p CALOC_p CALOS_p CALPP_p CALPM_p CALPR_p CALQF_p CALSF_p
CALSA_p CALST_p CALSW_p CALSO_p CALSI_p CALTB_p CALTM_p FTRIC_p FTRLF_p FTRCT_p FTRDC_p FTRDO_p FTRIO_p FTRDP_p FTRRF_p FTREN_p
FTRAP_p FTRRE_p FTROP_p FTRDR_p FTRMO_p FTRTW_p FTRST_p FTRSR_p FTRFL_p MDGCR_p MDGFL_p MDGSE_p MDGSY_p LOGIV_p LOGIN_p LOGIA_p
LOGITS_p LOGISP_p LOGIAC_p LOGAV_p LOGAN_p LOGAA_p LOGATS_p;
do i=1 to 306;
   p{i}=r{i}/sqrt(crit_rel);
end;
 
proc means data=psi noprint;
  var imp1-imp41 lev1-lev41;
  class soc crit_typ;
  output out=m_onet(where=(_type_=3)) mean=on_imp1-on_imp41 on_lev1-on_lev41;
proc sort tagsort data=psi;
  by soc crit_typ;
run;
 
data fit(keep=soc crit_typ distance fitval);
  set m_onet(drop=_type_);
  if _n_=1 then set m_client(drop=_type_);
  if _n_=1 then set rot_norm(drop=_name_ _label_);
 
array psi(82) on_imp1-on_imp41 on_lev1-on_lev41;
array cli(82) imp1-imp41 lev1-lev41; * transformed ratings - used to be t_imp1-t_imp41 t_lev1-t_lev41;
array diff(82) d_imp1-d_imp41 d_lev1-d_lev41;
do i=1 to 82;
   diff{i}=(psi{i}-cli{i})**2;
end;
 
distance=round(sum(of d_imp1-d_imp41 d_lev1-d_lev41));
 
col100=711225; * highest possible score;
 
array lopct(99) col1-col99;
array hipct(99) col2-col100;
do i=1 to 99;
   if lopct{i} <= distance < hipct{i} then fitval=i;
end;
 
proc sort tagsort;
  by soc crit_typ;
run;
 
data final;
  merge psi(in=a) fit(in=b);
  by soc crit_typ;
  if a and b;
  *if . < fitval<= &cut;
 
%merge1(cut=30,folder=EAS, client=Dennis test 1, filename=dtest1_jas, var1=battlink, value1=MW, var2=, value2=, clifam1=, clifam2=)
 

 

4 REPLIES 4
Quentin
Super User

When you say you want the variable s "spit out" you mean you want them included in the output dataset named final?

 

If so, it looks like you could add them to the keep list here:

data fit(keep=soc crit_typ distance fitval);
The Boston Area SAS Users Group is hosting free webinars!

Register now at https://www.basug.org/events.
dlambert1227
Calcite | Level 5

Yes, that would work. I hope it's that simple! I will try that.

dlambert1227
Calcite | Level 5

I have added those variables to the keep list on this line: 

data fit(keep=soc crit_typ distance fitval);

Now wondering how I get data final to actually be produced as a SAS or Excel data file. 

Quentin
Super User

@Quentin wrote:

When you say you want the variable s "spit out" you mean you want them included in the output dataset named final?

 

If so, it looks like you could add them to the keep list here:

data fit(keep=soc crit_typ distance fitval);

You would need to re-compile the macro (submit the code between %macro and %mend) and then call the macro, with the macro call shown at the bottom of your code:

%merge1(cut=30,folder=EAS, client=Dennis test 1, filename=dtest1_jas, var1=battlink, value1=MW, var2=, value2=, clifam1=, clifam2=)

I just noticed there is no %MEND statement in the code you posted.  In your real code that should be the bottom of the macro definition.

The Boston Area SAS Users Group is hosting free webinars!

Register now at https://www.basug.org/events.

CFC_SAS_Communities_400x225.jpg

Call for content now open!

It's your turn to help shape SAS Innovate 2027. Share your expertise and inspire the SAS community.

Submit your proposal →

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

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
  • 4 replies
  • 493 views
  • 0 likes
  • 2 in conversation