<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Calculating peer-bank Herfindahl–Hirschman Index (HHI) using a macro in SAS 9.4 in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Calculating-peer-bank-Herfindahl-Hirschman-Index-HHI-using-a/m-p/882868#M348832</link>
    <description>&lt;P&gt;The formula you provided suggests the following identity:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Peer_HHI&amp;nbsp; &amp;nbsp; = (Total_of_squared_peer_loans)&amp;nbsp; x&amp;nbsp; 100**2&amp;nbsp; &amp;nbsp; / (Total_of_peer_loans)**2&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;which is equivalent to&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; [(Total_of_all_squared_loans) - Current_bank_loan_squared ] x 100**2&amp;nbsp; &amp;nbsp;/ (Total_of_all_loans - Current_bank_loan)**2&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So read each year twice, the first time to generate totals for all banks, the second time to adjust for the currrent bank.&amp;nbsp; Assuming your data is sorted by year, then this will work:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data loans;
  input year bank $ loan_amount;
  datalines;
2010	BankA	 100000 
2010	BankB	 150000 
2010	BankC	 200000 
2010	BankD	 120000 
2010	BankE	 1000000 
2011	BankA	 200000 
2011	BankB	 50000 
2011	BankC	 400000 
2011	BankD	 100000 
2011	BankE	 1500000 
run;

data want (drop=_:);
  set loans (in=firstpass)  loans (in=secondpass);
  by year;

  if firstpass then do;
    _all_loans_total + loan_amount;
    _all_loans_sum_of_squares + loan_amount**2;
  end;
  if secondpass;
  peer_hhi=(_all_loans_sum_of_squares-(loan_amount**2))*(100**2)/((_all_loans_total-loan_amount)**2);
  if last.year then call missing(of _:);
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If the data are not sorted, and sorting is too expensive, then you have a problem amenable to a two SAS step solution: (1) run a proc summary to create the yearly totals for all banks, (2) in a DATA step, read in the proc summary results into a hash lookup table, and then reread the original data, making adjustments for each bank.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I put a little thought into avoiding running a PROC SORT on sorted data prior to the code above.&amp;nbsp; Consider this data, which is sorted by year/bank/region.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data loans;
  input year bank $ loan_amount;
  do region=1 to 3; output; end;
  datalines;
2010	BankA	 100000 
2010	BankB	 150000 
2010	BankC	 200000 
2010	BankD	 120000 
2010	BankE	 1000000 
2011	BankA	 200000 
2011	BankB	 50000 
2011	BankC	 400000 
2011	BankD	 100000 
2011	BankE	 1500000 
run;

%let class_vars=year region;

proc summary data=loans noprint nway;
  var loan_amount;
  class &amp;amp;class_vars ;
  output out=need (drop=_type_ _freq_) sum=_all_loans_total  uss=_all_loans_sum_of_squares ;
run;

data want (drop=_:);
  set loans  need (obs=0);
  if _n_=1 then do;
    declare hash h (dataset:'need');
      do _w=1 to countw("&amp;amp;class_vars");
        h.definekey(scan("&amp;amp;class_vars",_w));
      end;
      h.definekey('year');
      h.definedata(all:'Y');
      h.definedone();
  end;
  h.find();
  peer_hhi=(_all_loans_sum_of_squares-(loan_amount**2))*(100**2)/((_all_loans_total-loan_amount)**2);
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 30 Jun 2023 00:04:20 GMT</pubDate>
    <dc:creator>mkeintz</dc:creator>
    <dc:date>2023-06-30T00:04:20Z</dc:date>
    <item>
      <title>Calculating peer-bank Herfindahl–Hirschman Index (HHI) using a macro in SAS 9.4</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Calculating-peer-bank-Herfindahl-Hirschman-Index-HHI-using-a/m-p/882690#M348735</link>
      <description>&lt;P&gt;Hi all,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am trying to calculate a peer-bank&amp;nbsp;&lt;SPAN&gt;Herfindahl–Hirschman Index (HHI) using bank loans each year. The HHI observation for each bank in my panel dataset will be the market concentration of all peer-banks, excluding the bank itself. Therefore, each bank-year observation will have a unique vale. I'm sure there is a macro that could do this, but I have not been able to create one that works. Here is a sample of my data showing the banks and loan amounts each year. Is there any macro that I could use to calculate this peer_hhi?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data loans;
  input year bank $ loan_amount;
  datalines;
2010	BankA	 100000 
2010	BankB	 150000 
2010	BankC	 200000 
2010	BankD	 120000 
2010	BankE	 1000000 
2011	BankA	 200000 
2011	BankB	 50000 
2011	BankC	 400000 
2011	BankD	 100000 
2011	BankE	 1500000 
;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;As an example, the variable I am looking for peer_hhi for BankA in 2010 would be calculated with the data for&amp;nbsp;BankB, C, D, E in 2010. See below&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;peer_hhi for BankA in 2010:&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Financ3rn_1-1687882525103.png" style="width: 593px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/85421iE4B1BCF153E8EE7A/image-dimensions/593x40?v=v2" width="593" height="40" role="button" title="Financ3rn_1-1687882525103.png" alt="Financ3rn_1-1687882525103.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;with the 1,470,000 calculated as the sum of all loans for BankB, C, D, E in 2010.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The final dataset I am trying to create would look like this:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;year&lt;/TD&gt;&lt;TD&gt;bank&lt;/TD&gt;&lt;TD&gt;loan_amount&lt;/TD&gt;&lt;TD&gt;peer_hhi&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2010&lt;/TD&gt;&lt;TD&gt;BankA&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100,000&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4,984&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2010&lt;/TD&gt;&lt;TD&gt;BankB&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 150,000&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5,279&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2010&lt;/TD&gt;&lt;TD&gt;BankC&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 200,000&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5,578&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2010&lt;/TD&gt;&lt;TD&gt;BankD&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 120,000&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5,101&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2010&lt;/TD&gt;&lt;TD&gt;BankE&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1,000,000&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2,675&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2011&lt;/TD&gt;&lt;TD&gt;BankA&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 200,000&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5,764&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2011&lt;/TD&gt;&lt;TD&gt;BankB&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 50,000&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5,083&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2011&lt;/TD&gt;&lt;TD&gt;BankC&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 400,000&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6,728&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2011&lt;/TD&gt;&lt;TD&gt;BankD&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100,000&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5,306&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2011&lt;/TD&gt;&lt;TD&gt;BankE&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1,500,000&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3,778&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you in advance for all your help. Please let me know if more information is needed.&lt;/P&gt;</description>
      <pubDate>Tue, 27 Jun 2023 20:03:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Calculating-peer-bank-Herfindahl-Hirschman-Index-HHI-using-a/m-p/882690#M348735</guid>
      <dc:creator>Financ3rn</dc:creator>
      <dc:date>2023-06-27T20:03:14Z</dc:date>
    </item>
    <item>
      <title>Re: Calculating peer-bank Herfindahl–Hirschman Index (HHI) using a macro in SAS 9.4</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Calculating-peer-bank-Herfindahl-Hirschman-Index-HHI-using-a/m-p/882868#M348832</link>
      <description>&lt;P&gt;The formula you provided suggests the following identity:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Peer_HHI&amp;nbsp; &amp;nbsp; = (Total_of_squared_peer_loans)&amp;nbsp; x&amp;nbsp; 100**2&amp;nbsp; &amp;nbsp; / (Total_of_peer_loans)**2&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;which is equivalent to&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; [(Total_of_all_squared_loans) - Current_bank_loan_squared ] x 100**2&amp;nbsp; &amp;nbsp;/ (Total_of_all_loans - Current_bank_loan)**2&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So read each year twice, the first time to generate totals for all banks, the second time to adjust for the currrent bank.&amp;nbsp; Assuming your data is sorted by year, then this will work:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data loans;
  input year bank $ loan_amount;
  datalines;
2010	BankA	 100000 
2010	BankB	 150000 
2010	BankC	 200000 
2010	BankD	 120000 
2010	BankE	 1000000 
2011	BankA	 200000 
2011	BankB	 50000 
2011	BankC	 400000 
2011	BankD	 100000 
2011	BankE	 1500000 
run;

data want (drop=_:);
  set loans (in=firstpass)  loans (in=secondpass);
  by year;

  if firstpass then do;
    _all_loans_total + loan_amount;
    _all_loans_sum_of_squares + loan_amount**2;
  end;
  if secondpass;
  peer_hhi=(_all_loans_sum_of_squares-(loan_amount**2))*(100**2)/((_all_loans_total-loan_amount)**2);
  if last.year then call missing(of _:);
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If the data are not sorted, and sorting is too expensive, then you have a problem amenable to a two SAS step solution: (1) run a proc summary to create the yearly totals for all banks, (2) in a DATA step, read in the proc summary results into a hash lookup table, and then reread the original data, making adjustments for each bank.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I put a little thought into avoiding running a PROC SORT on sorted data prior to the code above.&amp;nbsp; Consider this data, which is sorted by year/bank/region.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data loans;
  input year bank $ loan_amount;
  do region=1 to 3; output; end;
  datalines;
2010	BankA	 100000 
2010	BankB	 150000 
2010	BankC	 200000 
2010	BankD	 120000 
2010	BankE	 1000000 
2011	BankA	 200000 
2011	BankB	 50000 
2011	BankC	 400000 
2011	BankD	 100000 
2011	BankE	 1500000 
run;

%let class_vars=year region;

proc summary data=loans noprint nway;
  var loan_amount;
  class &amp;amp;class_vars ;
  output out=need (drop=_type_ _freq_) sum=_all_loans_total  uss=_all_loans_sum_of_squares ;
run;

data want (drop=_:);
  set loans  need (obs=0);
  if _n_=1 then do;
    declare hash h (dataset:'need');
      do _w=1 to countw("&amp;amp;class_vars");
        h.definekey(scan("&amp;amp;class_vars",_w));
      end;
      h.definekey('year');
      h.definedata(all:'Y');
      h.definedone();
  end;
  h.find();
  peer_hhi=(_all_loans_sum_of_squares-(loan_amount**2))*(100**2)/((_all_loans_total-loan_amount)**2);
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 30 Jun 2023 00:04:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Calculating-peer-bank-Herfindahl-Hirschman-Index-HHI-using-a/m-p/882868#M348832</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2023-06-30T00:04:20Z</dc:date>
    </item>
    <item>
      <title>Re: Calculating peer-bank Herfindahl–Hirschman Index (HHI) using a macro in SAS 9.4</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Calculating-peer-bank-Herfindahl-Hirschman-Index-HHI-using-a/m-p/883010#M348900</link>
      <description>This worked perfectly! Thank you for helping with this</description>
      <pubDate>Thu, 29 Jun 2023 20:08:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Calculating-peer-bank-Herfindahl-Hirschman-Index-HHI-using-a/m-p/883010#M348900</guid>
      <dc:creator>Financ3rn</dc:creator>
      <dc:date>2023-06-29T20:08:45Z</dc:date>
    </item>
  </channel>
</rss>

