Document ID: EPA-HQ-OW-2002-0033-0308
Agency: epa
Document Type: Supporting & Related Material
Title: 
Posted Date: 2003-04-14T04:00Z

1
Economic,
Environmental,
and
Benefits
Analysis
of
the
Final
Metal
Products
and
Machinery
Rule
Programs
and
Output
Tables
for
the
Final
Rule
for
the
State
of
Ohio
February
14
2003
Prepared
for:
U.
S.
Environmental
Protection
Agency
Office
of
Science
and
Technology
Engineering
and
Analysis
Division
401
M
Street,
S.
W.
Washington,
D.
C.
20460
Dr.
Lynne
Tudor
Task
Manager
2
Final
Option
Benefits
for
the
state
of
Ohio
MP&
M
Ohio
Case
Study
Benefits
Programs
and
Data
Sets
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
Estimating
Ohio
MP&
M
Discharge
Loadings
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
15
"
Master
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
16
"
Create
Datasets
(
Sub
1).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
21
"
Tally
the
loadings
for
all
options
(
Sub
Final).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
27
"
Toxic
loadings
for
all
options.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
37
Human
Health
Benefits
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
46
Cancer
from
Fish
Consumption
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
47
"
Create
Datasets
(
Sub1).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
48
"
Human
Health
AWQC
(
Sub
2).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
49
"
Cancer­
fish
(
Sub
4)
all
risk
values.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
64
Cancer
from
Drinking
Water
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
81
"
Create
Revised
Datasets
for
Brad
­
Final
(
No
GMs).
sas"
.
.
.
.
.
.
.
.
.
.
.
82
Water
Quality
Modeling
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
88
"
Modify
Brad
Datasets
for
Final
(
No
GMs)
run.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
89
"
Drinking
Water
Cancer
(
Sub
6).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
92
Systemic
Risk
from
Fish
Consumption
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
102
"
Create
Datasets
(
Sub1).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
103
"
Human
Health
AWQC
(
Sub
2).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
104
"
Systemic
Cancer
(
Sub
5).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
105
Systemic
Risk
from
Drinking
Water
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
116
"
Create
Revised
Datasets
for
Brad
­
Final
(
No
GMs).
sas"
.
.
.
.
.
.
.
.
.
.
117
Water
Quality
Modeling
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
118
"
Systemic
Cancer
Assoc
DW
(
Sub
14).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
119
Lead
Benefits
for
Adults
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
126
"
Cancer­
fish
(
Sub
4).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
127
"
Lead
Benefits
(
Sub
12).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
128
"
Subsistence
Lead
Benefits
(
Sub
17).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
146
Lead
Benefits
for
Children
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
166
"
Cancer­
fish
(
Sub
4).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
167
"
NeoNatal
Mortality
Benefits
(
Sub
15).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
168
Integrated
Exposure
Uptake
Biokinetic
Model
(
IEUBK)
.
.
.
.
.
.
.
.
.
.
.
175
"
Gen4.
txt"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
176
"
Create
Lookup
Table.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
177
"
Cnc_
fmt3.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
178
"
Child
Lead
Benefits
(
Sub
16).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
179
Recreational
Benefits
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
191
"
Human
Health
AWQC
(
Sub
2).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
192
"
Aquatic
Life
AWQC
(
Sub
3).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
193
"
TKN
from
event
loadings.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
208
"
Pull
out
TKN
only.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
211
3
"
Merge
TKN
for
Ohio
Reaches.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
214
"
Alt
Merge
AWQC
Exc
for
Ohio
Reaches.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
220
Recreational
Fishing
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
226
"
Fishing
Welfare.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
227
Recreational
Boating
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
236
"
Boating
Welfare.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
237
Near­
water
Recreation
(
Viewing)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
246
"
Viewing
Welfare.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
247
Recreational
Swimming
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
254
"
Swimming
Welfare.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
255
POTW
Benefits
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
264
POTW
Inhibitions
from
Ohio
MP&
M
Facilities
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
265
"
Create
POTW_
IN
Datasets.
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
266
"
POTW
Inhibitions
(
Sub
9).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
270
Sludge
Benefits
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
279
"
POTW
Inhibitions
(
Sub
9).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
280
"
Sldg
MP&
M
Based
(
Sub
10).
sas"
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
281
4
MP&
M
Ohio
Case
Study
Benefits
Programs
and
Data
Sets
Programs
Used
in
the
Ohio
Case
Study
Benefits
Run
Program
Name
Dataset
DCN
Description
"
Random
Assigns
to
POTWs
(
Run
2).
xls"
Data
utilized
None
37825
Randomly
assigns
representative
indirect
facilities
to
POTWs
in
Ohio.

Data
created
None
37825
"
Master
Benefits
Ohio.
sas"
Data
utilized
None
Main
program
calling
subroutines
to
estimate
benefits
in
Ohio.

Data
created
None
"
Create
Datasets
(
Sub
1).
sas"
Data
utilized
fac_
info.
sd2
37810
Ohio
MP&
M
facilities
and
PCS
direct
dischargers
and
receiving
reach
information.

Ohioclos.
sd2
37816
Facility
closures
under
the
final
option
(
no
closures).

Scrload.
sd2
37818
Baseline
and
final
option
loadings
for
the
Ohio
MP&
M
screener
facilities.

mpmload.
sd2
37817
Baseline
and
final
option
loadings
for
the
Ohio
National
survey
facilities.

pcsload.
sd2
37814
Baseline
loadings
from
PCS
direct
dischargers
in
Ohio.

twf_
remr.
sd2
37804
MP&
M
pollutant
toxic
weighting
factors
and
POTW
removal
percentages.

Data
created
event_
ld.
sd2
MP&
M
pollutant
discharge
events
to
Ohio
RF1
reaches,
lakes,
and
lake
Erie
from
direct
dischargers
and
POTWs
(
post
removal).
Programs
Used
in
the
Ohio
Case
Study
Benefits
Run
Program
Name
Dataset
DCN
Description
5
"
Create
POTW_
IN
Datasets.
sas"
Data
utilized
fac_
info.
sd2
37810
Ohio
MP&
M
facility
and
PCS
direct
dischargers
and
receiving
reach
information.

Ohioclos.
sd2
37816
Facility
closures
in
the
baseline
and
under
the
preferred
option
(
5).

Scrload.
sd2
37818
Baseline
and
preferred
option
loadings
for
the
Ohio
MP&
M
screener
facilities.

mpmload.
sd2
37817
Baseline
and
preferred
option
loadings
for
the
Ohio
National
survey
facilities.

Data
created
potw_
in.
sd2
Ohio
MP&
M
pollutant
discharges
to
POTWs
prior
to
POTW
removals.

"
Create
Revised
Datasets
for
Brad
­
Final
(
No
GMs).
sas"
Data
utilized
fac_
info.
sd2
37810
Ohio
MP&
M
facility
and
PCS
direct
dischargers
and
receiving
reach
information.

Ohioclos.
sd2
37816
Facility
closures
under
the
final
option
(
no
closures).

Scrload.
sd2
37818
Baseline
and
final
option
loadings
for
the
Ohio
MP&
M
screener
facilities.

mpmload.
sd2
37817
Baseline
and
final
option
loadings
for
the
Ohio
National
survey
facilities.

pcsload.
sd2
37814
Baseline
loadings
from
PCS
direct
dischargers
in
Ohio.

twf_
remr.
sd2
37804
MP&
M
pollutant
toxic
weighting
factors
and
POTW
removal
percentages.

chemdata.
sd2
37812
MP&
M
pollutant
data
(
e.
g.,
awqc
values,
reference
dose,
cancer
slope
factor).
Programs
Used
in
the
Ohio
Case
Study
Benefits
Run
Program
Name
Dataset
DCN
Description
6
Data
created
bf_
pref.
sd2
MP&
M
pollutant
discharge
events
to
Ohio
RF1
reaches
from
direct
dischargers
and
POTWs
(
post
removal).

"
Modify
Brad
Datasets
for
Final
(
No
GMs)
run.
sas"
Data
utilized
fnlmean.
sd2
37819
Water
quality
modeling
output
dataset
with
instream
concentrations
for
Ohio
RF1
reaches
using
mean
flow
for
reaches.

fnllow.
sd2
37820
Water
quality
modeling
output
dataset
with
instream
concentrations
for
Ohio
RF1
reaches
using
low
flow
for
reaches.

Data
created
brdevnt.
sd2
37821
MP&
M
pollutant
in­
stream
concentrations
in
Ohio
RF1
reaches
based
on
mean
flow.

brdevnt2.
sd2
37822
MP&
M
pollutant
in­
stream
concentrations
in
Ohio
RF1
reaches
based
on
low
flow.

"
Human
Health
AWQC
(
Sub
2).
sas"
Data
utilized
event_
ld.
sd2
MP&
M
pollutant
discharge
events
to
Ohio
lakes
and
lake
Erie
from
direct
dischargers
and
POTWs
(
post
removal).

brdevnt.
sd2
37821
MP&
M
pollutant
in­
stream
concentrations
in
Ohio
RF1
reaches.

chemdata.
sd2
37812
MP&
M
pollutant
data
(
e.
g.,
awqc
values,
reference
dose,
cancer
slope
factor).

Data
created
cnc_
hh.
sd2
MP&
M
pollutant
in­
stream
concentrations
for
each
RF1
reach.

rec_
hh.
sd2
Human
health
AWQC
exceedences
for
affected
RF1
reaches.
Programs
Used
in
the
Ohio
Case
Study
Benefits
Run
Program
Name
Dataset
DCN
Description
7
"
Aquatic
Life
AWQC
(
Sub
3).
sas"
Data
utilized
event_
ld.
sd2
MP&
M
pollutant
discharge
events
to
RF1
reaches,
lakes,
and
lake
Erie
from
direct
dischargers
and
POTWs
(
post
removal).

chemdata.
sd2
37812
MP&
M
pollutant
data
(
e.
g.,
awqc
values,
reference
dose,
cancer
slope
factor).

Data
created
rec_
al.
sd2
Aquatic
life
AWQC
exceedences
for
affected
RF1
reaches.

"
Cancer­
fish
(
Sub
4).
sas"
Data
utilized
fish_
lic.
sd2
37808
County
level
fishing
license
data
for
the
United
States.

fac_
info.
sd2
37810
MP&
M
facility
and
discharge
RF1
reach
information.

shoremi.
sd2
37806
Number
of
river
and
ocean
shore
miles
by
state.

us_
rchmi.
sd2
37802
Number
of
river
miles
by
county.

cnc_
hh.
sd2
MP&
M
pollutant
in­
stream
concentrations
for
each
RF1
reach.

chemdata.
sd2
37812
MP&
M
pollutant
data
(
e.
g.,
awqc
values,
reference
dose,
cancer
slope
factor).

Data
created
lead.
sd2
MP&
M
in­
stream
concentrations
for
Lead
on
affected
RF1
reaches.

"
Systemic
Cancer
(
Sub
5).
sas"
Data
utilized
fish_
lic.
sd2
37808
County
level
fishing
license
data
for
the
United
States.

fac_
info.
sd2
37810
MP&
M
facility
and
discharge
RF1
reach
information.

us_
rchmi.
sd2
37802
Number
of
river
miles
by
county.
Programs
Used
in
the
Ohio
Case
Study
Benefits
Run
Program
Name
Dataset
DCN
Description
8
cnc_
hh.
sd2
MP&
M
pollutant
in­
stream
concentrations
for
each
RF1
reach.

chemdata.
sd2
37812
MP&
M
pollutant
data
(
e.
g.,
awqc
values,
reference
dose,
cancer
slope
factor).

Data
created
hazrats.
sd2
Estimated
systemic
hazard
ratio
for
affected
Ohio
RF1
reaches.

"
Drinking
Water
Cancer
(
Sub
6).
sas"
Data
utilized
fnlmean.
sd2
37819
In­
stream
concentrations
for
six
carcinogens
on
affected
Ohio
RF1
reaches
with
drinking
water
intakes
and
populations
exposed.

chemdata.
sd2
37812
MP&
M
pollutant
data
(
e.
g.,
awqc
values,
reference
dose,
cancer
slope
factor).

Data
created
None
"
Systemic
Cancer
Assoc
DW
(
Sub
14).
sas"
Data
utilized
fnlmean.
sd2
37819
In­
stream
concentrations
for
six
carcinogens
on
affected
Ohio
RF1
reaches
with
drinking
water
intakes
and
populations
exposed.

chemdata.
sd2
37812
MP&
M
pollutant
data
(
e.
g.,
awqc
values,
reference
dose,
cancer
slope
factor).

Data
created
dwhazrat.
sd2
Systemic
hazard
ratios
associated
with
drinking
water
for
affected
RF1
reaches.

"
POTW
Inhibitions
(
Sub
9).
sas"
Data
utilized
potw_
in.
sd2
MP&
M
pollutant
discharges
to
POTWs
prior
to
POTW
removals.

facsize.
sd2
37811
MP&
M
facility
size
(
small,
medium,
or
large)
based
on
discharge
flow.
Programs
Used
in
the
Ohio
Case
Study
Benefits
Run
Program
Name
Dataset
DCN
Description
9
potwevnt.
sd2
MP&
M
pollutant
discharge
events
to
POTWs.

chemdata.
sd2
37812
MP&
M
pollutant
data
(
e.
g.,
awqc
values,
reference
dose,
cancer
slope
factor).

Data
created
potwevnt.
sd2
MP&
M
pollutant
discharge
events
to
POTWs.

"
Sldg
MP&
M
Based
(
Sub
10).
sas"
Data
utilized
potwevnt.
sd2
MP&
M
pollutant
discharge
events
to
POTWs.

sldg_
cri.
sd2
37805
Sewage
sludge
criteria
for
the
eight
MP&
M
sludge
pollutants.

twf_
remr.
sd2
37804
MP&
M
pollutant
toxic
weighting
factors
and
POTW
removal
percentages.

Data
created
None
"
Lead
Benefits
(
Sub
12).
sas"
Data
utilized
lead.
sd2
MP&
M
in­
stream
concentrations
for
Lead
on
affected
RF1
reaches.

Data
created
None
"
Subsistence
Lead
Benefits
(
Sub
17).
sas"
Data
utilized
lead.
sd2
MP&
M
in­
stream
concentrations
for
Lead
on
affected
RF1
reaches.

Data
created
Ohio
Adult
Lead.
xls
Excel
file
with
table
of
adult
lead
benefits.

"
NeoNatal
Mortality
Benefits
(
Sub
15).
sas"
Data
utilized
lead.
sd2
MP&
M
in­
stream
concentrations
for
Lead
on
affected
RF1
reaches.

Data
created
None
"
Create
Lookup
Table.
sas"
Data
utilized
Gen3.
txt
37651
Output
dataset
from
the
IEUBK
model
run.
Programs
Used
in
the
Ohio
Case
Study
Benefits
Run
Program
Name
Dataset
DCN
Description
10
Data
created
ublook4.
sd2
37669
Crosswalk
of
lead
concentrations
in
fish
tissue
and
resulting
child
blood
lead
levels.

Cnc_
fmt3.
sas
37651
SAS
program
file
which
will
generate
a
custom
format
for
SAS.
This
format
equates
a
lead
concentration
in
fish
tissue
with
the
correct
row
in
the
ublook3
table
of
resulting
blood
lead
levels.

"
Cnc_
fmt3.
sas"
Data
utilized
none
Data
created
custom
SAS
format
The
custom
format
`
cnc_
fmt'
is
created
and
placed
in
the
formats
library.

"
Child
Lead
Benefits
(
Sub
16).
sas"
Data
utilized
lead.
sd2
MP&
M
in­
stream
concentrations
for
Lead
on
affected
RF1
reaches.

ublook4.
sd2
37669
Crosswalk
of
lead
concentrations
in
fish
tissue
and
resulting
child
blood
lead
levels.

Data
created
Ohio
Child
Lead.
xls
Excel
file
of
child
lead
benefits.

"
Tally
the
Loadings
for
all
options
(
Sub
final).
sas"
Data
utilized
fac_
info.
sd2
37810
Ohio
MP&
M
facility
and
PCS
direct
dischargers
and
receiving
reach
information.

Ohioclos.
sd2
37816
Facility
closures
under
the
final
option.
(
No
closures)

Scrload.
sd2
37818
Baseline
and
final
option
loadings
for
the
Ohio
MP&
M
screener
facilities.

mpmload.
sd2
37817
Baseline
and
final
option
loadings
for
the
Ohio
National
survey
facilities.
Programs
Used
in
the
Ohio
Case
Study
Benefits
Run
Program
Name
Dataset
DCN
Description
11
pcsload.
sd2
37814
Baseline
loadings
from
PCS
direct
dischargers
in
Ohio.

chemdata.
sd2
37812
MP&
M
pollutant
data
(
e.
g.,
awqc
values,
reference
dose,
cancer
slope
factor).

Data
created
None
"
Toxic
Loadings
for
all
options.
sas"
Data
utilized
fac_
info.
sd2
37810
Ohio
MP&
M
facility
and
PCS
direct
dischargers
and
receiving
reach
information.

Ohioclos.
sd2
37816
Facility
closures
under
the
final
option.
(
No
closures)

Scrload.
sd2
37818
Baseline
and
final
option
loadings
for
the
Ohio
MP&
M
screener
facilities.

mpmload.
sd2
37817
Baseline
and
final
option
loadings
for
the
Ohio
National
survey
facilities.

pcsload.
sd2
37814
Baseline
loadings
from
PCS
direct
dischargers
in
Ohio.

chemdata.
sd2
37812
MP&
M
pollutant
data
(
e.
g.,
awqc
values,
reference
dose,
cancer
slope
factor).

twf_
remr.
sd2
37804
MP&
M
pollutant
toxic
weighting
factors
and
POTW
removal
percentages.

Data
created
None
"
Pull
out
TKN
only.
sas"
Data
utilized
fnllow.
sd2
37820
Water
quality
modeling
output
dataset
with
instream
concentrations
for
Ohio
RF1
reaches
using
low
flow.

Data
created
brdtkn.
sd2
Estimated
TKN
in­
stream
concentrations
on
Ohio
RF1
reaches.
Programs
Used
in
the
Ohio
Case
Study
Benefits
Run
Program
Name
Dataset
DCN
Description
12
"
TKN
From
event
loadings.
sas"
Data
utilized
event_
ld.
sd2
MP&
M
pollutant
discharge
events
to
Ohio
RF1
reaches,
lakes,
and
lake
Erie
from
direct
dischargers
and
POTWs
(
post
removal).

Data
created
mpmtkn.
sd2
Estimated
TKN
in­
stream
concentrations
in
Ohio
lakes
and
lake
Erie
sites.

"
Merge
TKN
for
Ohio
Reaches.
sas"
Data
utilized
brdtkn.
sd2
Estimated
TKN
in­
stream
concentrations
on
Ohio
RF1
reaches.

mpmtkn.
sd2
Estimated
TKN
in­
stream
concentrations
in
Ohio
lakes
and
lake
Erie
sites.

rch_
info.
sd2
37757
Dataset
of
Ohio
RF1
sites
and
site
atribute
information
used
in
the
Random
Utility
Model.

Data
created
None
"
Merge
AWQC
exceedences
for
Ohio
reaches.
sas"
Data
utilized
rec_
al.
sd2
Aquatic
life
AWQC
exceedences
for
affected
RF1
reaches.

rch_
info.
sd2
37757
Dataset
of
Ohio
RF1
sites
and
site
atribute
information
used
in
the
Random
Utility
Model.

Data
created
None
"
Boating
Welfare.
sas"
Data
utilized
rch_
info.
sd2
37757
Dataset
of
Ohio
RF1
sites
and
site
attribute
information
used
in
the
Random
Utility
Model.

fullset2.
sd2
37758
Dataset
of
Boating
participants
demographic
information.

matrix4.
sd2
37759
Dataset
of
distances
from
Ohio
zip
code
centroids
to
RF1
reaches.
Programs
Used
in
the
Ohio
Case
Study
Benefits
Run
Program
Name
Dataset
DCN
Description
13
Data
created
None
"
Fishing
Welfare.
sas"
Data
utilized
rch_
info.
sd2
37757
Dataset
of
Ohio
RF1
sites
and
site
attribute
information
used
in
the
Random
Utility
Model.

fullset2.
sd2
37758
Dataset
of
Fishing
participants
demographic
information.

matrix4.
sd2
37759
Dataset
of
distances
from
Ohio
zipcode
centroids
to
RF1
reaches.

Data
created
None
"
Viewing
Welfare.
sas"
Data
utilized
rch_
info.
sd2
37757
Dataset
of
Ohio
RF1
sites
and
site
attribute
information
used
in
the
Random
Utility
Model.

fullset2.
sd2
37758
Dataset
of
Viewing
participants
demographic
information.

matrix4.
sd2
37759
Dataset
of
distances
from
Ohio
zip
code
centroids
to
RF1
reaches.

Data
created
None
"
Swimming
Welfare.
sas"
Data
utilized
rch_
info.
sd2
37757
Dataset
of
Ohio
RF1
sites
and
site
attribute
information
used
in
the
Random
Utility
Model.

fullset2.
sd2
37758
Dataset
of
Swimming
participants
demographic
information.

matrix4.
sd2
37759
Dataset
of
distances
from
Ohio
zip
code
centroids
to
RF1
reaches.

Data
created
None
"
Rum_
ben
(
Final
Rule).
xls"
Data
utilized
None
Programs
Used
in
the
Ohio
Case
Study
Benefits
Run
Program
Name
Dataset
DCN
Description
14
Data
created
None
37824
15
15
Estimating
Ohio
MP&
M
Discharge
Loadings
16
16
"
Master
Benefits
Ohio.
sas"
Using
the
loadings
estimates
from
ERG,
PCS
loadings
data,
as
well
as
estimated
facility
closures,
a
set
of
loadings
from
MP&
M
facilities
is
generated.
17
17
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Master
Benefits
Ohio.
sas
*/
/*
Author:
Stuart
Smith
*/
/*
Date:
09/
26/
2000
*/
/*
Updated:
11/
25/
2002
*/
/*
*/
/*
This
is
the
master
benefits
program
for
MP&
M
benefits
calculations.
*/
/*
This
program
calls
on
all
of
the
sub­
programs
and
executes
their
code.
*/
/*
This
allows
for
the
running
of
one
program
to
accomplish
the
estimation
*/
/*
of
each
of
the
subroutines.
*/
/*****************************************************************************/
/*****************************************************************************/
/*
ADMINISTARTIVE
REQUIREMENTS
*/
/*****************************************************************************/
/*
*/
/*****************************************************************************/
/*
1.
ASSIGN
MACRO
VARIABLES
FOR
CURRENT
RUN
*/
/*****************************************************************************/

%
let
prg_
path
=
H:\
ENVR\
Smithse\
mpm_
ohio\
Programs;
/*
Programs
Folder*/

%
let
ohio
=
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
Static";
/*
Static
data*/
/*
DO
NOT
CHANGE*/

%
let
rundat
=
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
Final
(
No
GMs)";
/*
Run
specific
input
data*/
/*
MUST
BE
AN
EXISTING
DIRECTORY
!!*/

%
let
results
=
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Results\
Final
(
No
GMs)";
/*
Run
specific
results
folder*/
/*
MUST
BE
AN
EXISTING
DIRECTORY
!!*/

/*
Dataset
to
be
used
for
drinking
water
related
benefits
*/
/*
This
is
concentrations
from
mean
flow
values
*/
%
let
dwset
=
fnlmean;

/*
Set
the
overall
Title
for
output*/
%
let
thetitle
=
"
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
&
sysdate";

libname
ohio
v6
&
ohio;
/*
assign
library
for
static
data*/
libname
rundat
v6
&
rundat;
/*
assign
library
for
input
data*/
libname
results
v6
&
results;
/*
assign
library
for
results*/
libname
library
v6
&
ohio;
/*
assign
library
for
custom
formats*/

title
&
thetitle;
/*
set
the
title*/

/*****************************************************************************/
/*
2.
PULL
IN
AND
RUN
THE
SUBROUTINE
PROGRAMS
*/
/*****************************************************************************/
18
18
/*****************************************************************************/
/*
Sub
1:
Create
Event
Loadings
Dataset
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Create
Datasets
(
Sub
1).
sas
*/
%
include
"&
prg_
path\
Create
Datasets
(
Sub
1).
sas"
/
source2;

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
2:
Human
Health
AWQC
Exceedences
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Human
Health
AQWC
(
Sub
2).
sas
*/
%
include
"&
prg_
path\
Human
Health
AWQC
(
Sub
2).
sas"
/
source2;

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
3:
Aquatic
Life
AWQC
Exceedences
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Aquatic
Life
AQWC
(
Sub
3).
sas
*/
%
include
"&
prg_
path\
Aquatic
Life
AWQC
(
Sub
3).
sas"
/
source2;

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
4:
Cancer
Fish
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Cancer­
fish
(
Sub
4).
sas
*/
%
include
"&
prg_
path\
Cancer­
fish
(
Sub
4).
sas"
/
source2;

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
5:
Systemic
Cancer
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Systemic
Cancer
(
Sub
5).
sas
*/
%
include
"&
prg_
path\
Systemic
Cancer
(
Sub
5).
sas"
/
source2;

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
6:
Drinking
Water
Cancer
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Drinking
Water
Cancer
(
Sub
6)
04
canc_
B
less
than
0.65.
sas
*/
%
include
"&
prg_
path\
Drinking
Water
Cancer
(
Sub
6)
04
canc_
B
less
than
0.65.
sas"
/
source2;
19
19
/*****************************************************************************/
/*****************************************************************************/
/*
Sub
14:
Systemic
Cancer
Drinking
Water
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Systemic
Cancer
Assoc
DW
(
Sub
14).
sas
*/
%
include
"&
prg_
path\
Systemic
Cancer
Assoc
DW
(
Sub
14).
sas"
/
source2;

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
9a:
Create
POTW_
IN
Dataset
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Create
POTW_
IN
Datasets.
sas
%
include
"&
prg_
path\
Create
POTW_
IN
Datasets.
sas"
/
source2;*/

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
9:
POTW
Inihibitions
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
POTW
Inhibitions
(
Sub
9).
sas
%
include
"&
prg_
path\
POTW
Inhibitions
(
Sub
9).
sas"
/
source2;*/

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
10:
Sludge
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Sldg
MP&
M
Based
(
Sub
10)
02
5.96
sludge
generation
factor.
sas
%
include
"&
prg_
path\
Sldg
MP&
M
Based
(
Sub
10)
02
5.96
sludge
generation
factor.
sas"
/
source2;
*/

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
13:
Adult
Lead
­
Recreational
(
Sport)
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Lead
Benefits
(
Sub
12)
­
New
Output.
sas
*/
%
include
"&
prg_
path\
Lead
Benefits
(
Sub
12)
­
New
Output.
sas"
/
source2;

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
17:
Adult
Lead
­
Subsistance
(
Sub)
*/
/*****************************************************************************/
/*****************************************************************************/
20
20
/*
Full
name:
Subsistence
Lead
Benefits
(
Sub
17)
­
New
Output.
sas
*/
%
include
"&
prg_
path\
Subsistence
Lead
Benefits
(
Sub
17)
­
New
Output.
sas"
/
source;

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
15:
Neo­
natal
Mortality
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
NeoNatal
Mortality
Benefits
(
Sub
15).
sas
*/
%
include
"&
prg_
path\
NeoNatal
Mortality
Benefits
(
Sub
15).
sas"
/
source2;

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
16:
Child
Lead
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Child
Lead
Benefits
(
Sub
16)
04
seven
years.
sas
*/
%
include
"&
prg_
path\
Child
Lead
Benefits
(
Sub
16)
04
seven
years.
sas"
/
source2;

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
Final:
Tally
Loadings
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Tally
the
loadings
for
all
options
(
Sub
Final).
sas
*/
%
include
"&
prg_
path\
Tally
the
loadings
for
all
options
(
Sub
Final).
sas"
/
source2;

/*****************************************************************************/
/*****************************************************************************/
/*
Sub
18:
Toxic
Weighted
Loadings
*/
/*****************************************************************************/
/*****************************************************************************/

/*
Full
name:
Toxic
loadings
for
all
options.
sas
*/
%
include
"&
prg_
path\
Toxic
loadings
for
all
options.
sas"
/
source2;

/*****************************************************************************/

quit;

/*****************************************************************************/
/*
END
Master
Benefits
Ohio.
sas
*/
/*****************************************************************************/
/*****************************************************************************/
21
21
"
Create
Datasets
(
Sub
1).
sas"
Using
the
generated
set
of
Ohio
MP&
M
facility
loadings,
a
data
set
of
pollutant
loading
events
and
their
corresponding
weights
for
each
RF1
reach
receiving
MP&
M
discharges
is
created.
22
22
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Create
Datasets
(
Sub
1).
sas
*/
/*
Author:
Stuart
Smith
*/
/*
Date:
08/
16/
2000
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
This
program
merges
facility
data
and
loadings
among
various
input
sets
*/
/*
and
generates
two
files
for
use
in
calculating
instream
concentrations.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Merge
the
facility
data
with
it's
loadings
*/
/*****************************************************************************/

proc
sql;

/*
Ohio
Screeners
*/
create
table
scrn
as
select
fac_
info.
siteid,
potw_
npd
as
npdes,
discharg,
reachnmb,
fac_
info.
source,
segl,
mnflo,
svten,
acute,
chronic,
dcp,
wbtype,
surface,
drainage,
potwflow,
casnum
as
casno,
loads0,
case
when
opt2
=
1
then
0
else
loads2
end
as
loads2,
case
when
opt5
=
1
then
0
else
loads5
end
as
loads5
from
ohio.
fac_
info,
rundat.
scrload,
rundat.
ohioclos
where
fac_
info.
siteid
=
scrload.
siteid
and
fac_
info.
source
=
'
screener'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1;

/*
MP&
M
facilities
*/
create
table
mpm
as
select
fac_
info.
siteid,
potw_
npd
as
npdes,
reachnmb,
discharg,
fac_
info.
source,
segl,
mnflo,
svten,
acute,
chronic,
dcp,
wbtype,
surface,
drainage,
potwflow,
casnum
as
casno,
loads0,
case
when
opt2
=
1
then
0
else
loads2
end
as
loads2,
case
when
opt5
=
1
then
0
else
loads5
end
as
loads5
from
ohio.
fac_
info,
rundat.
mpmload,
rundat.
ohioclos
where
fac_
info.
siteid
=
mpmload.
siteid
and
fac_
info.
source
=
'
mpm'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1;
23
23
/*
PCS
direct
dischargers
*/
/*
No
closures
apply
to
this
group
*/
create
table
pcs
as
select
siteid,
potw_
npd
as
npdes,
reachnmb,
discharg,
source,
segl,
mnflo,
svten,
acute,
chronic,
dcp,
wbtype,
surface,
drainage,
potwflow,
cas_
no
as
casno,
lby0
as
loads0,
lby0
as
loads2,
lby0
as
loads5
from
ohio.
fac_
info,
ohio.
pcsload
where
fac_
info.
potw_
npd
=
pcsload.
npdes
and
source
=
'
pcsdirect';

/*
Random
assigns
linked
to
mpm
data
*/
create
table
rand_
pcs
as
select
fac_
info.
siteid,
siteref,
potw_
npd
as
npdes,
reachnmb,
discharg,
fac_
info.
source,
segl,
mnflo,
svten,
acute,
chronic,
dcp,
wbtype,
surface,
drainage,
potwflow,
casnum
as
casno,
loads0,
case
when
opt2
=
1
then
0
else
loads2
end
as
loads2,
case
when
opt5
=
1
then
0
else
loads5
end
as
loads5
from
ohio.
fac_
info,
rundat.
scrload,
rundat.
ohioclos
where
fac_
info.
siteref
=
scrload.
siteid
and
fac_
info.
source
=
'
random'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1;

/*
Sum
the
random
over
the
npdes
*/
create
table
rand2
as
select
npdes,
max(
reachnmb)
as
reachnmb,
max(
segl)
as
segl,
max(
mnflo)
as
mnflo,
max(
svten)
as
svten,
max(
acute)
as
acute,
max(
chronic)
as
chronic,
max(
dcp)
as
dcp,
max(
surface)
as
surface,
max(
drainage)
as
drainage,
casno,
sum(
loads0)
as
loads0,
sum(
loads2)
as
loads2,
sum(
loads5)
as
loads5,
max(
potwflow)
as
potwflow
from
rand_
pcs
where
npdes
^=
'
'
group
by
npdes,
casno
order
by
npdes,
casno;

quit;

/*****************************************************************************/
/*
Delete
rather
large
intermediate
data
set
to
free
space
*/
/*****************************************************************************/

proc
datasets
library=
work;
delete
rand_
pcs;
quit;

/*****************************************************************************/
/*
Label
all
random
assigns
as
indirect
*/
/*****************************************************************************/

data
rand2;
set
rand2;

discharg
=
'
indirect';
run;
24
24
/*****************************************************************************/
/*
Combine
the
directs
from
all
areas
*/
/*****************************************************************************/

data
directs;
set
scrn
mpm
pcs;

/*
Remove
facilities
who
are
not
direct
dischargers
*/
if
discharg
^=
'
direct'
then
delete;

/*
Fill
in
missing
direct
discharger
flow
with
the
average
used
in
the
*/
/*
National
Anlysis
*/

/*
This
value
is
171.404
million
gallons
per
year
*/
if
potwflow=
0
or
potwflow
=
.
then
potwflow
=
171.404;

/*
Convert
from
millions
of
gallons
per
year
to
liters
per
day
*/
/*
365
days
per
year,
1000000,
3.875
liters
per
gallon
*/
poflow
=
(
potwflow/
365)
*
10**
6
*
3.875;
run;

/*****************************************************************************/
/*
Combine
the
indirects
from
all
areas
*/
/*****************************************************************************/

data
indir;
set
scrn
mpm
rand2;

/*
Remove
facilities
who
are
not
indirect
dischargers
*/
if
discharg
^=
'
indirect'
then
delete;

/*
Remove
facilities
for
which
the
water
treatment
facility
NPDES
*/
/*
is
not
known
*/
if
npdes
=
'
'
then
delete;

/*
Fill
in
missing
indirect
discharger
flow
with
the
average
*/
/*
This
value
is
171.404
million
gallons
per
year
*/
if
potwflow=
0
or
potwflow=.
then
potwflow
=
171.404;

/*
Convert
from
millions
of
gallons
per
year
to
liters
per
day
*/
/*
365
days
per
year,
1000000,
3.875
liters
per
gallon
*/
poflow
=
(
potwflow/
365)
*
10**
6
*
3.875;
run;

/*****************************************************************************/
/*
PROCESS
INDIRECTS
*/
/*****************************************************************************/

proc
sql;
25
25
/*
Allow
for
potw
removals
*/
create
table
indies2
as
select
npdes,
reachnmb,
casno,
poflow,
loads0*(
1­(
potw_
rem/
100))
as
base,
loads2*(
1­(
potw_
rem/
100))
as
treat2,
loads5*(
1­(
potw_
rem/
100))
as
treat5
from
indir,
ohio.
twf_
remr
where
indir.
casno
=
twf_
remr.
cas
order
by
npdes,
casno;
quit;

/*****************************************************************************/
/*
Merge
in
the
pcs
loadings
*/
/*****************************************************************************/

data
indies3;
merge
indies2
ohio.
pcsload(
rename=(
cas_
no=
casno)
keep=
lby0
npdes
cas_
no);
by
npdes
casno;
if
reachnmb=.
then
delete;
run;

/*****************************************************************************/
/*
Generate
the
correct
loads
*/
/*****************************************************************************/
/*
An
attempt
is
being
made
to
account
for
the
full
baseline
loadings
on
a
*/
/*
reach
based
on
all
facilities
discharging
to
that
reach
and
not
solely
the*/
/*
loadings
from
MP&
M
facilities.
Thus,
PCS
data
is
used
to
augment
the
total*/
/*
baseline
loadings
if
the
PCS
loadings
are
greater
than
the
baseline
*/
/*
from
the
MP&
M
based
estimated
loadings.
If
the
MP&
M
estimated
loadings
are*/
/*
greater
than
the
PCS
loadings,
it
is
assumed
that
the
MP&
M
loadings
are
*/
/*
accounting
for
all
of
the
baseline
loadings.
*/
/*****************************************************************************/

data
indies4;
set
indies3;

if
base=.
then
delete;
if
lby0
=
.
or
lby0
<
base
then
do;
/*
MP&
M
baseline
larger,
ignore
PCS
data
*/
loads0
=
base;
loads2
=
treat2;
loads5
=
treat5;
end;
else
do;
/*
PCS
greater
than
MP&
M
baseline
*/
diff
=
lby0
­
base;
/*
Get
difference
between
baselines*/
loads0
=
lby0;
/*
Set
baseline
to
PCS
value*/
loads2
=
treat2
+
diff;
/*
Apply
difference
to
option
levels*/
loads5
=
treat5
+
diff;
/*
Apply
difference
to
option
levels*/
end;
run;
26
26
/*****************************************************************************/
/*
Combine
the
indirects
and
directs
*/
/*****************************************************************************/

data
both;
set
indies4
directs;

/*
Transform
loadings
from
pounds
per
year
to
micrograms
per
day
*/
/*
(
pounds
per
year/
365
days
per
year)
*
0.4536924
kg
per
pound
*
*/
/*
1000
kg
per
gram
*
1,000,000
ug
per
gram
*/
base
=
(
loads0/
365)
*
0.4535924
*
10**
9;
treat2
=
(
loads2/
365)
*
0.4535924
*
10**
9;
treat5
=
(
loads5/
365)
*
0.4535924
*
10**
9;
run;

proc
sql;
create
table
master
as
select
reachnmb,
casno,
sum(
base)
as
base,
sum(
treat2)
as
treat2,
sum(
treat5)
as
treat5,
max(
poflow)
as
poflow
from
both
where
reachnmb
^=
0
group
by
reachnmb,
casno
order
by
reachnmb,
casno;
quit;

/*****************************************************************************/
/*
Create
the
datasets
for
benefit
calculation
*/
/*****************************************************************************/

proc
sql;
create
table
rundat.
event_
ld
as
select
reachnmb,
casno,
base,
treat2
as
treat1,
treat5
as
treat2,
poflow
as
evnt_
flo,
1
as
event_
wt
from
master;
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
27
27
"
Tally
the
loadings
for
all
options
(
Sub
Final).
sas"
Summarize
the
loadings
from
Ohio
MP&
M
facilities.
28
28
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Tally
the
loadings
for
all
options
(
Sub
Final).
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
08/
16/
2000
*/
/*
Updated:
07/
26/
2002
*/
/*

*/
/*
Sum
laodings
by
discharge
type
and
then
by
chemical
groups
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Tally
Loadings
for
Options
(
Sub
Final)';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Merge
the
facility
data
with
it's
loadings
*/
/*****************************************************************************/

proc
sql;
/*
screeners
*/
create
table
scrn
as
select
fac_
info.
siteid,
discharg,
casnum
as
casno,
loads0
as
baseload,
case
when
opt2
=
1
then
0
else
loads2
end
as
treat1,
case
when
opt5
=
1
then
0
else
loads5
end
as
treat2,
potw_
rem
from
ohio.
fac_
info,
rundat.
scrload,
rundat.
ohioclos,
ohio.
twf_
remr
where
fac_
info.
siteid
=
scrload.
siteid
and
fac_
info.
source
=
'
screener'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1
and
scrload.
casnum
=
twf_
remr.
cas;

/*
mpm
facilities
*/
create
table
mpm
as
select
fac_
info.
siteid,
discharg,
casnum
as
casno,
loads0
as
baseload,
case
when
opt2
=
1
then
0
else
loads2
end
as
treat1,
case
when
opt5
=
1
then
0
else
loads5
end
as
treat2,
potw_
rem
from
ohio.
fac_
info,
rundat.
mpmload,
rundat.
ohioclos,
ohio.
twf_
remr
where
fac_
info.
siteid
=
mpmload.
siteid
and
fac_
info.
source
=
'
mpm'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1
29
29
and
mpmload.
casnum
=
twf_
remr.
cas;

/*
pcs
direct
dischargers
*/
create
table
pcs
as
select
siteid,
discharg,
cas_
no
as
casno,
lby0
as
baseload,
lby0
as
treat1,
lby0
as
treat2,
potw_
rem
from
ohio.
fac_
info,
ohio.
pcsload,
ohio.
twf_
remr
where
fac_
info.
potw_
npd
=
pcsload.
npdes
and
source
=
'
pcsdirect'
and
pcsload.
cas_
no
=
twf_
remr.
cas;

/*
random
assigns
linked
to
mpm
data
*/
create
table
rand_
pcs
as
select
fac_
info.
siteid,
siteref,
discharg,
casnum
as
casno,
loads0
as
baseload,
case
when
opt2
=
1
then
0
else
loads2
end
as
treat1,
case
when
opt5
=
1
then
0
else
loads5
end
as
treat2,
potw_
rem
from
ohio.
fac_
info,
rundat.
scrload,
rundat.
ohioclos,
ohio.
twf_
remr
where
fac_
info.
siteref
=
scrload.
siteid
and
fac_
info.
source
=
'
random'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1
and
scrload.
casnum
=
twf_
remr.
cas;
quit;

/*****************************************************************************/
/*
Combine
everyone
*/
/*****************************************************************************/

data
facload;
set
scrn
mpm
pcs
rand_
pcs;
drop
siteref;
run;

/*****************************************************************************/
/*
Dump
the
large
separate
datasets
to
save
memory
space
*/
/*****************************************************************************/

proc
datasets
library=
work;
delete
rand_
pcs;
delete
pcs;
delete
mpm;
delete
scrn;
quit;

/*****************************************************************************/
/*
POTW
Removals
for
Indirects
*/
/*****************************************************************************/

data
facloads;
set
facload;

if
discharg
=
'
indirect'
then
do;
baseload
=
baseload*(
1­(
potw_
rem/
100));
treat1
=
treat1*(
1­(
potw_
rem/
100));
30
30
treat2
=
treat2*(
1­(
potw_
rem/
100));
end;
run;

/*****************************************************************************/
/*
Calculate
total
loadings
from
mpm
facilities
*/
/*****************************************************************************/

proc
sql;

create
table
indload
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
casno)
as
pollts
from
facload
where
discharg
=
'
indirect'
and
casno
not
in
('
C010','
C003');
/*
remove
TDS
and
BOD*/

create
table
ntlload
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
casno)
as
pollts
from
facloads
where
discharg
=
'
indirect'
and
casno
not
in
('
C010','
C003');
/*
remove
TDS
and
BOD*/

create
table
ntlloadd
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
casno)
as
pollts
from
facloads
where
discharg
=
'
direct'
and
casno
not
in
('
C010','
C003');
/*
remove
TDS
and
BOD*/

create
table
inhval
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
inhibit
is
not
missing;

create
table
aqtox_
c
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
fcval__
i
is
not
missing;

create
table
aqtox_
a
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
31
31
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
faval__
i
is
not
missing;

create
table
biosol
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts
from
facloads
where
casno='
7440382'
or
casno='
7439976'
or
casno='
7782492'
or
casno='
7439921'
or
casno='
7440020'
or
casno='
7440439'
or
casno='
7440508'
or
casno='
7440666';

create
table
hh_
car
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
slope_
fa
is
not
missing;

create
table
hh_
sys
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
referenc
is
not
missing;

create
table
haps
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
hazardou
=
1;

create
table
pps
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
priority
=
1;

create
table
convp
as
select
facloads.
casno,
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
32
32
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
(
conventi
=
1
or
facloads.
casno='
C037'
or
facloads.
casno='
C036'
or
facloads.
casno='
C004')
group
by
facloads.
casno
order
by
casno;

create
table
otherp
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
other_
po
=
1;

create
table
leadp
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
facloads.
casno
=
'
7439921';

create
table
tknp
as
select
sum(
baseload)
as
baseld,
sum(
treat1)
as
newld1,
sum(
treat2)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
facloads.
casno
=
'
C021';

/*****************************************************************************/
/*
Generate
an
output
table
of
all
values
*/
/*****************************************************************************/

create
table
master
as
select
'
Sludge
Inhibition'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,
chems
as
poll
from
inhval;
insert
into
master
select
'
Biosolids'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,8
as
poll
from
biosol;
insert
into
master
select
'
HAPs'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,
chems
as
poll
from
haps;
insert
into
master
select
'
Acute
Toxics'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,
chems
as
poll
from
aqtox_
a;
insert
into
master
select
'
Chronic
Toxics'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
33
33
opt2,
chems
as
poll
from
aqtox_
c;
insert
into
master
select
'
Carcinogens'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,
chems
as
poll
from
hh_
car;
insert
into
master
select
'
Systemic'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,
chems
as
poll
from
hh_
sys;
quit;

proc
transpose
data=
master
out=
master2;
id
cat;
quit;

proc
print
data=
indload;
title3
'
Ohio
Loads
to
POTWs
(
Indirects)';
title4
'(
minus
TDS
and
BOD)
­
No
POTW
removals';
quit;
proc
print
data=
ntlload;
title3
'
Ohio
Loads
to
from
Indirects';
title4
'(
minus
TDS
and
BOD)
­
with
POTW
removals';
quit;
proc
print
data=
ntlloadd;
title3
'
Ohio
Loads
(
Direct
Dischargers)';
title4
'(
minus
TDS
and
BOD)';
quit;
proc
print
data=
master2;
title3
'
Master
List
for
Table
(
National)';
quit;
proc
print
data=
pps;
title3
'
Priority
Pollutants';
quit;
proc
print
data=
convp;
title3
'
Conventional
Pollutants';
quit;
proc
print
data=
otherp;
title3
'
Other
Pollutants';
quit;
proc
print
data=
leadp;
title3
'
Lead
Only';
quit;
proc
print
data=
tknp;
title3
'
TKN
Only';
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
34
34
Program
Output
35
35
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Tally
Loadings
for
Options
(
Sub
Final)
10:
29
Friday,
November
29,
2002
Ohio
Loads
to
POTWs
(
Indirects)
(
minus
TDS
and
BOD)
­
No
POTW
removals
Obs
baseld
newld1
newld2
pollts
1
127611377.41
127611377.41
0
125
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Tally
Loadings
for
Options
(
Sub
Final)
10:
29
Friday,
November
29,
2002
Ohio
Loads
to
from
Indirects
(
minus
TDS
and
BOD)
­
with
POTW
removals
Obs
baseld
newld1
newld2
pollts
1
25666113.67
25666113.67
0
125
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Tally
Loadings
for
Options
(
Sub
Final)
10:
29
Friday,
November
29,
2002
Ohio
Loads
(
Direct
Dischargers)
(
minus
TDS
and
BOD)

Obs
baseld
newld1
newld2
pollts
1
83640910.11
83157652.09
81699923.76
125
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Tally
Loadings
for
Options
(
Sub
Final)
10:
29
Friday,
November
29,
2002
Master
List
for
Table
(
National)

Sludge_
Acute_
Chronic_
Obs
_
NAME_
Inhibition
Biosolids
HAPs
Toxics
Toxics
Carcinogens
Systemic
1
base
1792428.21
256326.32
15267.26
12355512.58
13936545.87
8513.42
752668.46
2
opt1
1785587.56
254323.16
15097.40
12312840.43
13864349.85
8460.97
747174.82
3
opt2
1001620.45
71150.28
2968.50
10988056.73
11065063.70
2601.06
182093.13
4
poll
86.00
8.00
35.00
106.00
113.00
13.00
76.00
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Tally
Loadings
for
Options
(
Sub
Final)
10:
29
Friday,
November
29,
2002
Priority
Pollutants
Obs
baseld
newld1
newld2
pollts
chems
1
195746.29
194047.51
11499.13
42
42
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Tally
Loadings
for
Options
(
Sub
Final)
10:
29
Friday,
November
29,
2002
Conventional
Pollutants
Obs
casno
baseld
newld1
newld2
pollts
chems
1
C003
2459784.82
2394561.53
589390.78
1
1
2
C004
10205512.49
10019322.04
0.00
1
1
3
C009
69600083.41
69587552.44
67781043.06
1
1
4
C036
5511553.55
5401366.63
2553697.80
1
1
5
C037
2120721.58
2087174.99
0.00
1
1
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Tally
Loadings
for
Options
(
Sub
Final)
10:
29
Friday,
November
29,
2002
Other
Pollutants
Obs
baseld
newld1
newld2
pollts
chems
1
43797409.80
43438568.44
21151453.04
82
82
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Tally
Loadings
for
Options
(
Sub
Final)
10:
29
Friday,
November
29,
2002
Lead
Only
Obs
baseld
newld1
newld2
pollts
chems
1
35014.93
34797.87
1496.41
1
1
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Tally
Loadings
for
Options
(
Sub
Final)
10:
29
Friday,
November
29,
2002
TKN
Only
36
36
Obs
baseld
newld1
newld2
pollts
chems
1
92811.50
92798.69
12542.31
1
1
37
37
"
Toxic
loadings
for
all
options.
sas"
Summarize
toxic
weighted
loadings
from
Ohio
MP&
M
facilities.
38
38
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Toxic
loadings
for
all
options.
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
08/
16/
2000
*/
/*
Updated:
07/
26/
2002
*/
/*

*/
/*
Generate
summary
statistics
of
toxic
weighted
loadings
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Toxic
Loadings
for
all
options';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Merge
the
facility
data
with
it's
loadings
*/
/*****************************************************************************/

proc
sql;
/*
screeners
*/
create
table
scrn
as
select
fac_
info.
siteid,
discharg,
casnum
as
casno,
loads0
as
baseload,
case
when
opt2
=
1
then
0
else
loads2
end
as
treat1,
case
when
opt5
=
1
then
0
else
loads5
end
as
treat2,
twf,
potw_
rem
from
ohio.
fac_
info,
rundat.
scrload,
rundat.
ohioclos,
ohio.
twf_
remr
where
fac_
info.
siteid
=
scrload.
siteid
and
fac_
info.
source
=
'
screener'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1
and
scrload.
casnum
=
twf_
remr.
cas;

/*
mpm
facilities
*/
create
table
mpm
as
select
fac_
info.
siteid,
discharg,
casnum
as
casno,
loads0
as
baseload,
case
when
opt2
=
1
then
0
else
loads2
end
as
treat1,
case
when
opt5
=
1
then
0
else
loads5
end
as
treat2,
twf,
potw_
rem
39
39
from
ohio.
fac_
info,
rundat.
mpmload,
rundat.
ohioclos,
ohio.
twf_
remr
where
fac_
info.
siteid
=
mpmload.
siteid
and
fac_
info.
source
=
'
mpm'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1
and
mpmload.
casnum
=
twf_
remr.
cas;

/*
pcs
direct
dischargers
*/
create
table
pcs
as
select
siteid,
discharg,
cas_
no
as
casno,
lby0
as
baseload,
lby0
as
treat1,
lby0
as
treat2,
twf
from
ohio.
fac_
info,
ohio.
pcsload,
ohio.
twf_
remr
where
fac_
info.
potw_
npd
=
pcsload.
npdes
and
source
=
'
pcsdirect'
and
pcsload.
cas_
no
=
twf_
remr.
cas;

/*
random
assigns
linked
to
mpm
data
*/
create
table
rand_
pcs
as
select
fac_
info.
siteid,
siteref,
discharg,
casnum
as
casno,
loads0
as
baseload,
case
when
opt2
=
1
then
0
else
loads2
end
as
treat1,
case
when
opt5
=
1
then
0
else
loads5
end
as
treat2,
twf,
potw_
rem
from
ohio.
fac_
info,
rundat.
scrload,
rundat.
ohioclos,
ohio.
twf_
remr
where
fac_
info.
siteref
=
scrload.
siteid
and
fac_
info.
source
=
'
random'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1
and
scrload.
casnum
=
twf_
remr.
cas;
quit;

/*****************************************************************************/
/*
Combine
everyone
*/
/*****************************************************************************/

data
facload;
set
scrn
mpm
pcs
rand_
pcs;

base
=
baseload;
trt1
=
treat1;
trt2
=
treat2;

drop
siteref
baseload
treat1
treat2;
run;

/*****************************************************************************/
/*
Dump
the
large
separate
datasets
to
save
memory
space
*/
/*****************************************************************************/

proc
datasets
library=
work;
delete
rand_
pcs;
delete
pcs;
delete
mpm;
delete
scrn;
quit;

/*****************************************************************************/
40
40
/*
POTW
Removals
for
Indirects
*/
/*****************************************************************************/

data
facloads;
set
facload;

if
discharg
=
'
indirect'
then
do;
baseload
=
base*(
1­(
potw_
rem/
100));
treat1
=
trt1*(
1­(
potw_
rem/
100));
treat2
=
trt2*(
1­(
potw_
rem/
100));
end;
else
do;
baseload
=
base;
treat1
=
trt1;
treat2
=
trt2;
end;

drop
base
trt1
trt2;
run;

/*****************************************************************************/
/*
Calculate
total
toxic
weighted
loadings
from
mpm
facilities
*/
/*****************************************************************************/

proc
sql;

create
table
ntlload
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
casno)
as
pollts
from
facloads
where
discharg
=
'
indirect'
and
casno
not
in
('
C010','
C003');
/*
remove
TDS
and
BOD*/

create
table
ntlloadd
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
casno)
as
pollts
from
facloads
where
discharg
=
'
direct'
and
casno
not
in
('
C010','
C003');
/*
remove
TDS
and
BOD*/

create
table
inhval
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
inhibit
is
not
missing;

create
table
aqtox_
c
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
41
41
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
fcval__
i
is
not
missing;

create
table
aqtox_
a
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
faval__
i
is
not
missing;

create
table
biosol
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts
from
facloads
where
casno='
7440382'
or
casno='
7439976'
or
casno='
7782492'
or
casno='
7439921'
or
casno='
7440020'
or
casno='
7440439'
or
casno='
7440508'
or
casno='
7440666';

create
table
hh_
car
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
slope_
fa
is
not
missing;

create
table
hh_
sys
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
referenc
is
not
missing;

create
table
haps
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
hazardou
=
1;

create
table
pps
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
42
42
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
priority
=
1;

create
table
convp
as
select
facloads.
casno,
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
(
conventi
=
1
or
facloads.
casno='
C037'
or
facloads.
casno='
C036')
group
by
facloads.
casno
order
by
casno;

create
table
otherp
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
other_
po
=
1;

create
table
leadp
as
select
sum(
baseload*
twf)
as
baseld,
sum(
treat1*
twf)
as
newld1,
sum(
treat2*
twf)
as
newld2,
count(
distinct
facloads.
casno)
as
pollts,
count(
distinct
chemdata.
casno)
as
chems
from
facloads,
ohio.
chemdata
where
facloads.
casno=
chemdata.
casno
and
facloads.
casno
=
'
7439921';

/*****************************************************************************/
/*
Generate
an
output
table
of
all
values
*/
/*****************************************************************************/

create
table
master
as
select
'
Sludge
Inhibition'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,
chems
as
poll
from
inhval;
insert
into
master
select
'
Biosolids'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,
8
as
poll
from
biosol;
insert
into
master
select
'
HAPs'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,
chems
as
poll
from
haps;
insert
into
master
select
'
Acute
Toxics'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,
chems
as
poll
from
aqtox_
a;
insert
into
master
select
'
Chronic
Toxics'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
43
43
opt2,
chems
as
poll
from
aqtox_
c;
insert
into
master
select
'
Carcinogens'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,
chems
as
poll
from
hh_
car;
insert
into
master
select
'
Systemic'
as
cat,
baseld
as
base,
newld1
as
opt1,
newld2
as
opt2,
chems
as
poll
from
hh_
sys;
quit;

proc
transpose
data=
master
out=
master2;
id
cat;
quit;

proc
print
data=
ntlload;
title3
'
TX
Ohio
Loads
to
POTWs
(
Indirects)';
quit;
proc
print
data=
ntlloadd;
title3
'
TX
Ohio
Loads
(
Direct
Dischargers)';
quit;
proc
print
data=
master2;
title3
'
TX
Master
List
for
Table
(
National)';
quit;
proc
print
data=
pps;
title3
'
TX
Priority
Pollutants';
quit;
proc
print
data=
convp;
title3
'
TX
Conventional
Pollutants';
quit;
proc
print
data=
otherp;
title3
'
TX
Other
Pollutants';
quit;
proc
print
data=
leadp;
title3
'
TX
Lead
Only';
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
44
44
Program
Output
45
45
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Toxic
Loadings
for
all
options
10:
29
Friday,
November
29,
2002
TX
Ohio
Loads
to
POTWs
(
Indirects)

Obs
baseld
newld1
newld2
pollts
1
213036.78
213036.78
0
125
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Toxic
Loadings
for
all
options
10:
29
Friday,
November
29,
2002
TX
Ohio
Loads
(
Direct
Dischargers)

Obs
baseld
newld1
newld2
pollts
1
35782.52
33617.58
25070.05
125
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Toxic
Loadings
for
all
options
10:
29
Friday,
November
29,
2002
TX
Master
List
for
Table
(
National)

Sludge_
Acute_
Chronic_
Obs
_
NAME_
Inhibition
Biosolids
HAPs
Toxics
Toxics
Carcinogens
Systemic
1
base
241113.63
116656.54
1029.28
177635.21
248595.37
4729.83
121278.39
2
opt1
239240.12
115624.66
1016.97
176480.79
246431.75
4700.15
120337.58
3
opt2
22837.21
11368.84
71.05
17268.96
25010.50
1812.84
15005.87
4
poll
86.00
8.00
35.00
106.00
113.00
13.00
76.00
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Toxic
Loadings
for
all
options
10:
29
Friday,
November
29,
2002
TX
Priority
Pollutants
Obs
baseld
newld1
newld2
pollts
chems
1
150063.27
148994.16
9772.10
42
42
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Toxic
Loadings
for
all
options
10:
29
Friday,
November
29,
2002
TX
Conventional
Pollutants
Obs
casno
baseld
newld1
newld2
pollts
chems
1
C003
0
0
0
1
1
2
C009
0
0
0
1
1
3
C036
0
0
0
1
1
4
C037
0
0
0
1
1
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Toxic
Loadings
for
all
options
10:
29
Friday,
November
29,
2002
TX
Other
Pollutants
Obs
baseld
newld1
newld2
pollts
chems
1
98756.04
97660.21
15297.95
82
82
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Toxic
Loadings
for
all
options
10:
29
Friday,
November
29,
2002
TX
Lead
Only
Obs
baseld
newld1
newld2
pollts
chems
1
77032.85
76555.32
3292.10
1
1
46
46
Human
Health
Benefits
47
47
Cancer
from
Fish
Consumption
48
48
"
Create
Datasets
(
Sub1).
sas"
Generates
a
data
set
of
pollutant
loading
events
for
each
Ohio
RF1
reach
receiving
MP&
M
discharges.
See
Estimating
Ohio
MP&
M
Discharge
Loadings
for
program
code.
49
49
"
Human
Health
AWQC
(
Sub
2).
sas"
Calculates
in­
stream
pollutant
concentrations
and
generates
a
data
set
of
pollutant
concentrations
for
each
RF1
reach.
50
50
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Human
Health
AWQC
(
Sub
2).
sas
*/
/*
Author:
Stuart
Smith
*/
/*
Date:
4/
21/
2000
*/
/*
Updated:
7/
25/
2002
*/
/*

*/
/*
This
subroutine
calculates
AWQC
exceedences
for
Human
Health.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Human
Health
AWQC
Exceedences
Program
Output
(
Sub
2)';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*
DISCHARGE
EVENTS,
ASSOCIATED
LOADINGS
AND
WEIGHTS
HAVE
BEEN
CALCULATED
BY*/
/*
ANOTHER
PROGRAM.
ALL
UNIT
CONVERSIONS
HAVE
OCCURRED.
SEE
"
Create
Datasets*/
/*
(
Sub
1).
sas"
FOR
SPECIFIC
PROGRAM
INFORMATION.
*/

/*****************************************************************************/
/*
PULL
TOGETHER
THE
EVENTS
AND
CHEMICAL
SPECIFIC
PARAMETERS
*/
/*****************************************************************************/

data
rchs;
set
ohio.
fac_
info;
keep
reachnmb
segl
mnflo
svten
acute
chronic
dcp
wbtype
surface
drainage
volume;
run;

/*
Sort
by
unique
reach
number
and
keep
only
one
instance*/
proc
sort
nodupkey
data=
rchs;
by
reachnmb;
quit;

/*
Sort
pollutant
data
by
chemical
cas
number*/
Proc
sort
data
=
ohio.
chemdata;
by
casno;
quit;

Proc
sql;
create
table
stream
as
select
event_
ld.
reachnmb,
event_
ld.
casno,
evnt_
flo,
base,
treat1,
treat2,
event_
wt,
segl,
mnflo
as
mean_
flo,
svten
as
flo7q10,
acute
as
adf,
chronic
as
cdf,
51
51
dcp,
wbtype,
biodegre
as
decay,
surface,
drainage,
volume
from
rundat.
event_
ld,
ohio.
chemdata,
rchs
where
event_
ld.
casno
=
chemdata.
casno
and
event_
ld.
reachnmb
=
rchs.
reachnmb
order
by
reachnmb,
casno;
quit;

/*****************************************************************************/
/*
FRESHWATER
REACHES
­
CONCENTRATIONS
AND
AWQC
EXCEEDENCES
*/
/*****************************************************************************/

/*****************************************************************************/
/*
CALCULATE
POLLUTANT
CONCENTRATIONS
IN
LAKES
FOR
WHICH
DILUTION
FACTORS
*/
/*
ARE
AVAILABLE.
*/
/*****************************************************************************/

data
lakes_
dl;
set
stream;
if
wbtype
=
'
glake';

/*
TEMPORARY
FIX
­
Hard
code
CDF
to
10
for
lake
erie
reaches.
Those
that
have
a
cdf
(
all
equal
4.85)
are
changed
to
10.
All
others
remain
missing
for
now.

Stuart
Smith
07.16.02
(
evnt_
flo*
cdf)
changed
to
(
evnt_
flo*
10)
See
below.

*/

if
cdf
^=
.
then
do;
/*
We
have
CDF,
so
use
this*/
cnc_
base
=
base/(
evnt_
flo*
10);
cnc_
trt1
=
treat1/(
evnt_
flo*
10);
cnc_
trt2
=
treat2/(
evnt_
flo*
10);
end;
else
if
dcp
^=.
then
do;
/*
BENCHMARK
LOAD,
907.2
IS
CONVERSION
FROM
KG
TO
TONS
*/
benchld
=
10000*
907.2;
cnc_
base
=
((
base/
10**
9)*
365*
dcp)/
benchld;
cnc_
trt1
=
((
treat1/
10**
9)*
365*
dcp)/
benchld;
cnc_
trt2
=
((
treat2/
10**
9)*
365*
dcp)/
benchld;
end;
else
do;
cnc_
base
=
.;
cnc_
trt1
=
.;
cnc_
trt2
=
.;
end;

if
cnc_
base=.
then
delete;
keep
reachnmb
casno
cnc_
base
cnc_
trt1
cnc_
trt2
event_
wt;
run;

/*****************************************************************************/
52
52
/*
CALCULATE
POLLUTANT
CONCENTRATIONS
IN
LAKES
FOR
WHICH
DILUTION
FACTORS
*/
/*
ARE
NOT
AVAILABLE
BASED
ON
RESIDENCE
TIME
AND
CHEMICAL
DECAY
RATE.
*/
/*****************************************************************************/

data
lakes;
set
stream;
if
wbtype
=
'
lake';
if
decay;

/*
We
have
drainage
area
and
surface
area
information*/
if
surface
^=
.
and
drainage
^=
.
then
do;
num
=
drainage;
/*
Drainage
area
in
sq.
miles
*/
denom
=
surface*
0.0015625;
/*
Convert
surface
area
from
acres
to
sq.
miles
*/
logdays
=
4.077
­
(
1.177*
log10(
num/
denom));
restime
=
10**
logdays;
time1
=
restime*
24;
/*
CONVERT
HYDRAULIC
TIME
FROM
DAYS
INTO
HOURS
*/
cnc_
base
=
(
base/
evnt_
flo)/(
1+
time1*
decay);
cnc_
trt1
=
(
treat1/
evnt_
flo)/(
1+
time1*
decay);
cnc_
trt2
=
(
treat2/
evnt_
flo)/(
1+
time1*
decay);
good
=
1;
end;

/*
Missing
area
measure(
s),
do
end­
of­
pipe
value
*/
else
do;
cnc_
base
=
base/
evnt_
flo;
cnc_
trt1
=
treat1/
evnt_
flo;
cnc_
trt2
=
treat2/
evnt_
flo;
end;

keep
reachnmb
casno
cnc_
base
cnc_
trt1
cnc_
trt2
event_
wt;
run;

/*****************************************************************************/
/*
COMBINE
THE
LAKE
REACHES
*/
/*****************************************************************************/

data
freshwat;
set
lakes_
dl
lakes;
run;

proc
sort
data=
freshwat;
by
reachnmb
casno;

/*****************************************************************************/
/*
Pull
in
estimated
in­
stream
concentrations
using
mean
flow
*/
/*
These
values
are
calculated
by
the
decay
model
outside
of
this
analysis
*/
/*****************************************************************************/

data
brad;
set
rundat.
brdevnt;

cnc_
aqcb
=
base;
cnc_
aqc1
=
treat1;
53
53
cnc_
aqc2
=
treat2;

cnc_
aqab
=
cnc_
aqcb;
cnc_
aqa1
=
cnc_
aqc1;
cnc_
aqa2
=
cnc_
aqc2;

if
cnc_
aqcb=.
then
delete;
event_
wt
=
weight;

keep
reachnmb
casno
cnc_
aqcb
cnc_
aqc1
cnc_
aqc2
cnc_
aqab
cnc_
aqa1
cnc_
aqa2
event_
wt;
run;

data
freshwat2;
merge
brad
freshwat;
by
reachnmb
casno;
run;

/*****************************************************************************/
/*
OBTAIN
HUMAN
HEALTH
CRITERIA
FOR
FRESHWATER
REACHES
*/
/*****************************************************************************/

proc
sql;

create
table
frshwtr2
as
select
reachnmb,
freshwat2.
casno,
cnc_
base,
cnc_
trt1,
cnc_
trt2,
hhval__
i
as
hhval,
hhorg_
in
as
hhorg,
chemical,
event_
wt
from
freshwat2,
ohio.
chemdata
where
freshwat2.
casno
=
chemdata.
casno
order
by
reachnmb,
casno;
quit;

data
frshwtr3;
set
frshwtr2;

if
cnc_
base
>
hhval
and
hhval
>
0
then
orgh2o_
b=
1;
if
cnc_
trt1
>
hhval
and
hhval
>
0
then
orgh2ot1=
1;
if
cnc_
trt2
>
hhval
and
hhval
>
0
then
orgh2ot2=
1;
if
cnc_
base
>
hhorg
and
hhorg
>
0
then
org_
b=
1;
if
cnc_
trt1
>
hhorg
and
hhorg
>
0
then
org_
t1=
1;
if
cnc_
trt2
>
hhorg
and
hhorg
>
0
then
org_
t2=
1;

if
orgh2o_
b
>
0
or
org_
b
>
0
then
humanb=
1;
if
orgh2ot1
>
0
or
org_
t1
>
0
then
humant1=
1;
if
orgh2ot2
>
0
or
org_
t2
>
0
then
humant2=
1;

keep
reachnmb
casno
chemical
orgh2o_
b
orgh2ot1
orgh2ot2
org_
b
org_
t1
org_
t2
humanb
humant1
humant2
event_
wt;
run;

/***********************************************************************/
/*
END
FRESHWATER
REACHES
*/
54
54
/***********************************************************************/

data
rundat.
cnc_
hh;
set
freshwat2;
run;

data
allreach;
set
frshwtr3;
awt=
1;
/*
adjustment
weight,
not
used
but
may
be
required
in
future*/
/*
set
to
1
for
now
*/

keep
reachnmb
casno
chemical
orgh2o_
b
orgh2ot1
orgh2ot2
org_
b
org_
t1
org_
t2
humanb
humant1
humant2
event_
wt
awt;
run;

/*****************************************************************************/
/*
IDENTIFY
REACHES
IN
WHICH
POLLUTANT
CONCENTRATIONS
EXCEED
THE
HUMAN
HEALTH*/
/*
BASED
AWQC
LIMITS
AND
CALCULATE
THE
NUMBER
OF
EXCEEDENCE
EVENTS.
*/
/*****************************************************************************/
proc
sql;

create
table
h_
awqc
as
select
reachnmb,
chemical,
orgh2o_
b,
orgh2ot1,
orgh2ot2,
org_
b,
org_
t1,
org_
t2,
event_
wt
from
allreach
where
humanb
>
0
order
by
reachnmb,
chemical;

/*
adjustment
weight
variable
awt
replaced
with
a
1
*/
/*
not
relevant
to
this
analysis.
*/
create
table
hh_
awqc
as
select
reachnmb,
sum(
orgh2o_
b)
as
testb1,
sum(
orgh2ot1)
as
testt1_
1,
sum(
orgh2ot2)
as
testt2_
1,
sum(
org_
b)
as
testb2,
sum(
org_
t1)
as
testt1_
2,
sum(
org_
t2)
as
testt2_
2,
sum(
orgh2o_
b*
event_
wt*
1)
as
natexb1,
sum(
orgh2ot1*
event_
wt*
1)
as
natex1_
1,
sum(
orgh2ot2*
event_
wt*
1)
as
natex2_
1,
sum(
org_
b*
event_
wt*
1)
as
natexb2,
sum(
org_
t1*
event_
wt*
1)
as
natex1_
2,
sum(
org_
t2*
event_
wt*
1)
as
natex2_
2,
sum(
event_
wt)
as
reachwt,
case
when
sum(
orgh2o_
b)
>=
1
then
1
else
0
end
as
rchb,
case
when
sum(
orgh2ot1)
>=
1
then
1
else
0
end
as
rch1,
case
when
sum(
orgh2ot2)
>=
1
then
1
else
0
end
as
rch2,
case
when
sum(
org_
b)
>=
1
then
1
else
0
end
as
orgb,
case
when
sum(
org_
t1)
>=
1
then
1
else
0
end
as
org1,
case
when
sum(
org_
t2)
>=
1
then
1
else
0
end
as
org2
from
h_
awqc
group
by
reachnmb
order
by
reachnmb;

/*
CALCULATE
THE
TOTAL
NUMBER
OF
AFFECTED
REACHES
ON
A
NATIONAL
BASIS
*/
55
55
/*
Adjustment
weight
awt
replaced
with
a
1,
not
relevant
to
this
analysis
*/

create
table
rch1
as
select
sum(
distinct
event_
wt)
as
wght1,
reachnmb,
chemical
from
h_
awqc
where
orgh2o_
b
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
base1
as
select
max(
wght1)
as
t_
ntlb1,
reachnmb
from
rch1
group
by
reachnmb
order
by
reachnmb;

create
table
rch2
as
select
sum(
distinct
event_
wt)
as
wght2,
reachnmb,
chemical
from
h_
awqc
where
org_
b
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
base2
as
select
max(
wght2)
as
t_
ntlb2,
reachnmb
from
rch2
group
by
reachnmb
order
by
reachnmb;

create
table
rch3
as
select
sum(
distinct
event_
wt)
as
wght3,
reachnmb,
chemical
from
h_
awqc
where
orgh2ot1
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
testt1_
1
as
select
max(
wght3)
as
t1_
ntlt1,
reachnmb
from
rch3
group
by
reachnmb
order
by
reachnmb;

create
table
rch4
as
select
sum(
distinct
event_
wt)
as
wght4,
reachnmb,
chemical
from
h_
awqc
where
org_
t1
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;
56
56
create
table
testt1_
2
as
select
max(
wght4)
as
t1_
ntlt2,
reachnmb
from
rch4
group
by
reachnmb
order
by
reachnmb;

create
table
rch5
as
select
sum(
distinct
event_
wt)
as
wght5,
reachnmb,
chemical
from
h_
awqc
where
orgh2ot2
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
testt2_
1
as
select
max(
wght5)
as
t2_
ntlt1,
reachnmb
from
rch5
group
by
reachnmb
order
by
reachnmb;

create
table
rch6
as
select
sum(
distinct
event_
wt)
as
wght6,
reachnmb,
chemical
from
h_
awqc
where
org_
t2
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
testt2_
2
as
select
max(
wght6)
as
t2_
ntlt2,
reachnmb
from
rch6
group
by
reachnmb
order
by
reachnmb;

create
table
rch7
as
select
sum(
distinct
event_
wt)
as
wght7,
reachnmb,
chemical
from
h_
awqc
where
orgh2o_
b
>
0
or
org_
b
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
multi_
b
as
select
max(
wght7)
as
multi_
b,
reachnmb
from
rch7
group
by
reachnmb
order
by
reachnmb;

create
table
rch8
as
select
sum(
distinct
event_
wt)
as
wght8,
reachnmb,
chemical
from
h_
awqc
57
57
where
orgh2ot1
>
0
or
org_
t1
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
multi_
1
as
select
max(
wght8)
as
multi_
1,
reachnmb
from
rch8
group
by
reachnmb
order
by
reachnmb;

create
table
rch9
as
select
sum(
distinct
event_
wt)
as
wght9,
reachnmb,
chemical
from
h_
awqc
where
orgh2ot2
>
0
or
org_
t2
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
multi_
2
as
select
max(
wght9)
as
multi_
2,
reachnmb
from
rch9
group
by
reachnmb
order
by
reachnmb;
quit;

data
rchwts;
merge
base1
base2
testt1_
1
testt1_
2
testt2_
1
testt2_
2
multi_
b
multi_
1
multi_
2;
by
reachnmb;

if
t_
ntlb1=.
then
t_
ntlb1=
0;
if
t_
ntlb2=.
then
t_
ntlb2=
0;
if
t1_
ntlt1=.
then
t1_
ntlt1=
0;
if
t1_
ntlt2=.
then
t1_
ntlt2=
0;
if
t2_
ntlt1=.
then
t2_
ntlt1=
0;
if
t2_
ntlt2=.
then
t2_
ntlt2=
0;
if
multi_
b=.
then
multi_
b=
0;
if
multi_
1=.
then
multi_
1=
0;
if
multi_
2=.
then
multi_
2=
0;
run;

/*****************************************************************************/
/*
CALCULATE
THE
TOTAL
NUMBER
OF
AWQC
EXCEEDENCES
BY
CHEMICAL
*/
/*****************************************************************************/

proc
sql;

create
table
chm_
awqc
as
select
chemical,
sum(
orgh2o_
b)
as
worgb,
sum(
orgh2ot1)
as
worgt1,
sum(
orgh2ot2)
as
worgt2,
sum(
org_
b)
as
orgb,
sum(
org_
t1)
as
orgt1,
sum(
org_
t2)
as
orgt2,
sum(
orgh2o_
b*
event_
wt*
awt)
as
ntlbw,
sum(
orgh2ot1*
event_
wt*
awt)
as
ntltw1,
58
58
sum(
orgh2ot2*
event_
wt*
awt)
as
ntltw2,
sum(
org_
b*
event_
wt*
awt)
as
ntlbo,
sum(
org_
t1*
event_
wt*
awt)
as
ntlto1,
sum(
org_
t2*
event_
wt*
awt)
as
ntlto2,
case
when
sum(
orgh2o_
b)
>=
1
then
1
else
0
end
as
chemb,
case
when
sum(
orgh2ot1)
>=
1
then
1
else
0
end
as
chem1,
case
when
sum(
orgh2ot2)
>=
1
then
1
else
0
end
as
chem2,
case
when
sum(
org_
b)
>=
1
then
1
else
0
end
as
chmorgb,
case
when
sum(
org_
t1)
>=
1
then
1
else
0
end
as
chmorg1,
case
when
sum(
org_
t2)
>=
1
then
1
else
0
end
as
chmorg2
from
allreach
where
humanb
>
0
group
by
chemical
order
by
chemical;
quit;

/*
Spit
out
the
affected
reaches
for
the
recreational
benefits
program
*/

data
rundat.
rec_
hh;
set
allreach;
if
orgh2o_
b
>
0
or
org_
b
>
0;
run;

/*****************************************************************************/
/*
PRINT
OUT
RESULTS
*/
/*****************************************************************************/

proc
means
sum
data=
hh_
awqc;
var
natexb1
natex1_
1
natex2_
1
natexb2
natex1_
2
natex2_
2
rchb
rch1
rch2
orgb
org1
org2;
label
reachnmb=
'
Reach
Id'
natexb1
=
'
Exceed,
H20
and
Organisms
(
BL)'
natex1_
1
=
'
Exceed,
H2O
and
organisms
(
Opt
1)'
natex2_
1
=
'
Exceed,
H2O
and
organisms
(
Opt
2)'
natexb2
=
'
Exceed,
organisms
only
(
BL)'
natex1_
2
='
Exceed,
organisms
only
(
Opt
1)'
natex2_
2
='
Exceed,
organisms
only
(
Opt
2)'
rchb
='
Number
of
h20
reaches
(
BL)'
rch1
='
Number
of
h20
reaches
(
Opt
1)'
rch2
='
Number
of
h20
reaches
(
Opt
2)'
orgb
='
Number
of
org
reaches
(
BL)'
org1
='
Number
of
org
reaches
(
Opt1)'
org2
='
Number
of
org
reaches
(
Opt2)';
title3
'
Exceedence
of
Human
Health
AWQC
Limits
by
Option';

proc
means
sum
data=
chm_
awqc;
var
ntlbw
ntltw1
ntltw2
ntlbo
ntlto1
ntlto2
chemb
chem1
chem2
chmorgb
chmorg1
chmorg2;
label
ntlbw
=
'
Exceed,
H20
and
Organisms
(
BL)'
ntltw1
=
'
Exceed,
H2O
and
organisms
(
Opt
1)'
ntltw2
=
'
Exceed,
H2O
and
organisms
(
Opt
2)'
59
59
ntlbo
=
'
Exceed,
organisms
only
(
BL)'
ntlto1
=
'
Exceed,
organisms
only
(
Opt
1)'
ntlto2
=
'
Exceed,
organisms
only
(
Opt
2)'
chemb
=
'
Number
of
h20/
org
poll
(
BL)'
chem1
=
'
Number
of
h20/
org
poll
(
Opt1)'
chem2
=
'
Number
of
h20/
org
poll
(
Opt2)'
chmorgb
=
'
Number
of
org
poll
(
BL)'
chmorg1
=
'
Number
of
org
poll
(
Opt1)'
chmorg2
=
'
Number
of
org
poll
(
Opt2)';
title3
'
Exceedence
of
Human
Health
AWQC
Limits
by
Pollutant';

proc
means
sum
data=
rchwts;
var
t_
ntlb1
t_
ntlb2
t1_
ntlt1
t1_
ntlt2
t2_
ntlt1
t2_
ntlt2
multi_
b
multi_
1
multi_
2;
label
t_
ntlb1
=
'
H20
and
Organisms
(
BL)'
t1_
ntlt1
=
'
H20
and
Organisms
(
Opt
1)'
t2_
ntlt1
=
'
H20
and
Organisms
(
Opt
2)'
t_
ntlb2
=
'
Organisms
Only
(
BL)'
t1_
ntlt2
=
'
Organisms
Only
(
Opt
1)'
t2_
ntlt2
=
'
Organisms
Only
(
Opt
2)'
multi_
b
=
'
Either
(
BL)'
multi_
1
=
'
Either
(
Opt
1)'
multi_
2
=
'
Either
(
Opt
2)';

title3
'
Total
Number
of
Reaches
Exceeding
AWQC
Limits
for
Consumption
of
Water';
title4
'
and
Organisms/
Organisms
only
';
quit;

proc
sql;
create
table
preme
as
select
reachnmb,
event_
wt,
sum(
orgh2o_
b)
as
testb1,
sum(
orgh2ot1)
as
test1_
1,
sum(
orgh2ot2)
as
test2_
1,
sum(
org_
b)
as
testb2,
sum(
org_
t1)
as
test1_
2,
sum(
org_
t2)
as
test2_
2
from
h_
awqc
group
by
reachnmb,
event_
wt
order
by
reachnmb,
event_
wt;
quit;

data
reduc;
set
preme;
if
testb1=.
then
testb1=
0;
if
test1_
1=.
then
test1_
1=
0;
if
test2_
1=.
then
test2_
1=
0;
if
testb2=.
then
testb2=
0;
if
test1_
2=.
then
test1_
2=
0;
if
test2_
2=.
then
test2_
2=
0;

if
testb1
>=
1
and
test1_
1
=
0
then
elim1_
1
=
1;
else
elim1_
1=
0;
if
testb1
>=
1
and
test2_
1
=
0
then
elim2_
1
=
1;
else
elim2_
1=
0;
if
testb2
>=
1
and
test1_
2
=
0
then
elim1_
2
=
1;
else
elim1_
2=
0;
60
60
if
testb2
>=
1
and
test2_
2
=
0
then
elim2_
2
=
1;
else
elim2_
2=
0;

if
testb1
>=
1
and
test1_
1
<
testb1
and
elim1_
1
=
0
then
red1_
1
=
1;
else
red1_
1=
0;
if
testb1
>=
1
and
test2_
1
<
testb1
and
elim2_
1
=
0
then
red2_
1
=
1;
else
red2_
1=
0;
if
testb2
>=
1
and
test1_
2
<
testb2
and
elim1_
2
=
0
then
red1_
2
=
1;
else
red1_
2=
0;
if
testb2
>=
1
and
test2_
2
<
testb2
and
elim2_
2
=
0
then
red2_
2
=
1;
else
red2_
2=
0;

if
elim1_
1=
1
or
elim1_
2=
1
then
elim1
=
1;
else
elim1
=
0;
if
elim2_
1=
1
or
elim2_
2=
1
then
elim2
=
1;
else
elim2
=
0;
if
red1_
1
=
1
or
red1_
2
=
1
then
reduc1
=
1;
else
reduc1
=
0;
if
red2_
1
=
1
or
red2_
2
=
1
then
reduc2
=
1;
else
reduc2
=
0;
run;

proc
means
sum
data=
reduc;
weight
event_
wt;
var
elim1_
1
elim2_
1
elim1_
2
elim2_
2
red1_
1
red2_
1
red1_
2
red2_
2
reduc1
reduc2;
label
elim1_
1
=
'
Elim.
H20
and
Organisms
(
Opt1)'
elim2_
1
=
'
Elim.
H20
and
Organisms
(
Opt2)'
elim1_
2
=
'
Elim.
Organisms
(
Opt1)'
elim2_
2
=
'
Elim.
Organisms
(
Opt2)'
red1_
1
=
'
Redu.
H20
and
Organisms
(
Opt1)'
red2_
1
=
'
Redu.
H20
and
Organisms
(
Opt2)'
red1_
2
=
'
Redu.
Organisms
(
Opt1)'
red2_
2
=
'
Redu.
Organisms
(
Opt2)'
reduc1
=
'
Total
Reaches
Reducing
(
Opt1)'
reduc2
=
'
Total
Reaches
Reducing
(
Opt2)';
title3
'
AWQC
Eliminations
and
Reductions
(
National)';
title4
'
Number
of
Ohio
Reaches';
quit;

proc
print
data=
hh_
awqc;
quit;
title3
'
Exceedences
by
Reach';
proc
print
data=
chm_
awqc;
title3
'
Exceedences
by
Chemical';
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
61
61
Program
Output
62
62
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Human
Health
AWQC
Exceedences
Program
Output
(
Sub
2)
10:
29
Friday,
November
29,
2002
Exceedence
of
Human
Health
AWQC
Limits
by
Option
The
MEANS
Procedure
Variable
Label
Sum
                                                             
natexb1
Exceed,
H20
and
Organisms
(
BL)
16.0000000
natex1_
1
Exceed,
H2O
and
organisms
(
Opt
1)
11.0000000
natex2_
1
Exceed,
H2O
and
organisms
(
Opt
2)
.
natexb2
Exceed,
organisms
only
(
BL)
5.0000000
natex1_
2
Exceed,
organisms
only
(
Opt
1)
3.0000000
natex2_
2
Exceed,
organisms
only
(
Opt
2)
.
rchb
Number
of
h20
reaches
(
BL)
3.0000000
rch1
Number
of
h20
reaches
(
Opt
1)
3.0000000
rch2
Number
of
h20
reaches
(
Opt
2)
0
orgb
Number
of
org
reaches
(
BL)
2.0000000
org1
Number
of
org
reaches
(
Opt1)
2.0000000
org2
Number
of
org
reaches
(
Opt2)
0
                                                             
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Human
Health
AWQC
Exceedences
Program
Output
(
Sub
2)
10:
29
Friday,
November
29,
2002
Exceedence
of
Human
Health
AWQC
Limits
by
Pollutant
The
MEANS
Procedure
Variable
Label
Sum
                                                             
ntlbw
Exceed,
H20
and
Organisms
(
BL)
16.0000000
ntltw1
Exceed,
H2O
and
organisms
(
Opt
1)
11.0000000
ntltw2
Exceed,
H2O
and
organisms
(
Opt
2)
.
ntlbo
Exceed,
organisms
only
(
BL)
5.0000000
ntlto1
Exceed,
organisms
only
(
Opt
1)
3.0000000
ntlto2
Exceed,
organisms
only
(
Opt
2)
.
chemb
Number
of
h20/
org
poll
(
BL)
11.0000000
chem1
Number
of
h20/
org
poll
(
Opt1)
7.0000000
chem2
Number
of
h20/
org
poll
(
Opt2)
0
chmorgb
Number
of
org
poll
(
BL)
4.0000000
chmorg1
Number
of
org
poll
(
Opt1)
2.0000000
chmorg2
Number
of
org
poll
(
Opt2)
0
                                                             
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Human
Health
AWQC
Exceedences
Program
Output
(
Sub
2)
10:
29
Friday,
November
29,
2002
Total
Number
of
Reaches
Exceeding
AWQC
Limits
for
Consumption
of
Water
and
Organisms/
Organisms
only
The
MEANS
Procedure
Variable
Label
Sum
                                                     
t_
ntlb1
H20
and
Organisms
(
BL)
3.0000000
t_
ntlb2
Organisms
Only
(
BL)
2.0000000
t1_
ntlt1
H20
and
Organisms
(
Opt
1)
3.0000000
t1_
ntlt2
Organisms
Only
(
Opt
1)
2.0000000
t2_
ntlt1
H20
and
Organisms
(
Opt
2)
0
t2_
ntlt2
Organisms
Only
(
Opt
2)
0
multi_
b
Either
(
BL)
3.0000000
multi_
1
Either
(
Opt
1)
3.0000000
multi_
2
Either
(
Opt
2)
0
                                                     
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Human
Health
AWQC
Exceedences
Program
Output
(
Sub
2)
10:
29
Friday,
November
29,
2002
AWQC
Eliminations
and
Reductions
(
National)
Number
of
Ohio
Reaches
The
MEANS
Procedure
Variable
Label
Sum
63
63
                                                          
elim1_
1
Elim.
H20
and
Organisms
(
Opt1)
0
elim2_
1
Elim.
H20
and
Organisms
(
Opt2)
3.0000000
elim1_
2
Elim.
Organisms
(
Opt1)
0
elim2_
2
Elim.
Organisms
(
Opt2)
2.0000000
red1_
1
Redu.
H20
and
Organisms
(
Opt1)
1.0000000
red2_
1
Redu.
H20
and
Organisms
(
Opt2)
0
red1_
2
Redu.
Organisms
(
Opt1)
1.0000000
red2_
2
Redu.
Organisms
(
Opt2)
0
reduc1
Total
Reaches
Reducing
(
Opt1)
1.0000000
reduc2
Total
Reaches
Reducing
(
Opt2)
0
                                                          
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Human
Health
AWQC
Exceedences
Program
Output
(
Sub
2)
10:
29
Friday,
November
29,
2002
Exceedences
by
Chemical
C
H
c
c
c
E
w
w
n
n
n
n
h
h
h
M
w
o
o
o
o
n
t
t
n
t
t
c
c
c
m
m
m
I
o
r
r
o
r
r
t
l
l
t
l
l
h
h
h
o
o
o
O
C
r
g
g
r
g
g
l
t
t
l
t
t
e
e
e
r
r
r
b
A
g
t
t
g
t
t
b
w
w
b
o
o
m
m
m
g
g
g
s
L
b
1
2
b
1
2
w
1
2
o
1
2
b
1
2
b
1
2
1
Aniline
1
.
.
.
.
.
1
.
.
.
.
.
1
0
0
0
0
0
2
Arsenic
2
2
.
2
2
.
2
2
.
2
2
.
1
1
0
1
1
0
3
Bis(
2­
ethylhexyl)
phthalate
2
1
.
.
.
.
2
1
.
.
.
.
1
1
0
0
0
0
4
Cadmium
1
.
.
.
.
.
1
.
.
.
.
.
1
0
0
0
0
0
5
Dichloroethene,
1,1­
2
2
.
.
.
.
2
2
.
.
.
.
1
1
0
0
0
0
6
Dioxane,
1,4­
1
.
.
.
.
.
1
.
.
.
.
.
1
0
0
0
0
0
7
Iron
1
1
.
.
.
.
1
1
.
.
.
.
1
1
0
0
0
0
8
Manganese
1
.
.
1
.
.
1
.
.
1
.
.
1
0
0
1
0
0
9
Mercury
1
1
.
1
1
.
1
1
.
1
1
.
1
1
0
1
1
0
10
Nitrosodimethylamine,
N­
3
3
.
.
.
.
3
3
.
.
.
.
1
1
0
0
0
0
11
Thallium
1
1
.
1
.
.
1
1
.
1
.
.
1
1
0
1
0
0
64
64
"
Cancer­
fish
(
Sub
4)
all
risk
values.
sas"
Uses
the
data
set
of
pollutant
concentrations
for
each
RF1
reach
with
pollutant
specific
cancer
slope
factors
to
determine
risk
of
cancer
on
a
chemical
basis.
The
computed
cancer
risk
is
then
applied
to
the
exposed
fishing
population
and
the
reduced
risk
of
cancer
is
translated
into
a
monetary
value.
65
65
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Cancer­
fish
(
Sub
4).
sas
*/
/*
Author:
Stuart
Smith
*/
/*
Date:
4/
21/
2000
*/
/*
Updated:
11/
01/
2002
*/
/*
*/
/*
This
program
calculates
cancer
incidents
due
to
fish
consumption
by
*/
/*
sport
and
subsistence
anglers
and
their
families.
Incidents
are
generated*/
/*
for
all
reaches
for
which
data
is
available.
*/

/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Cancer
from
Fish
Consumption
(
Sub
4)';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
COUNTY
LEVEL
FISHING
LICENSE
DATA
*/
/*****************************************************************************/
/*****************************************************************************/
/*
Load
fishing
license
data
here.
*/
/*
Sum
over
the
types
by
county.
*/
/*
Sum
over
the
counties
containing
a
given
reach.
*/
/*

*/
/*
Final
data
set
contains
reaches
with
the
total
possible
number
of
*/
/*
affected
anglers.
This
number
will
be
multiplied
by
the
ratio
*/
/*
of
reach
length
to
total
reach
miles
in
affected
counties
to
obtain
*/
/*
an
estimate
of
the
number
of
affected
anglers.
*/
/*****************************************************************************/

data
licens;
set
ohio.
fish_
lic;

fw_
lic
=
sum(
fw_
res,
fw_
reso,
fw_
sres,
fw_
smres,
fw_
dres,
trout,
fw_
life,
fw_
hunt1,
fw_
2hunt,
fw_
hunts,
fw_
hunt2,
fw_
salt1,
66
66
fw_
trout);
sw_
lic
=
sum(
fw_
salt1,
sw_
res,
sw_
dres);

if
fw_
lic=.
then
fw_
lic=
0;
if
sw_
lic=.
then
sw_
lic=
0;
cntyfip
=
fips;

keep
cntyfip
fw_
lic
sw_
lic;
run;

proc
sort
data=
licens;
by
cntyfip;
quit;

/*****************************************************************************/
/*
DETERMINE
COUNTIES
AFFECTED
BY
REACH
*/
/*****************************************************************************/

data
facs;
set
ohio.
fac_
info;
run;

proc
sort
data=
facs;
by
siteid;
quit;

data
cnty;
set
facs;

cntyfip1=
stco1;
cntyfip2=
stco2;
cntyfip3=
stco3;
cntyfip4=
stco4;
cntyfip5=
stco5;
cntyfip6=
stco6;
cntyfip7=
stco7;
cntyfip8=
stco8;

keep
reachnmb
cntyfip1­
cntyfip8;
run;

proc
sort
nodupkey
data=
cnty;
by
reachnmb;
quit;

proc
transpose
data=
cnty
out=
cnty2;
by
reachnmb;
var
cntyfip1­
cntyfip8;
quit;

data
cnty3;
set
cnty2;
cntyfip
=
col1/
1;
if
cntyfip=.
then
delete;
keep
reachnmb
cntyfip;
run;

proc
sort
data=
cnty3;
by
cntyfip;
quit;

/*****************************************************************************/
/*
OBTAIN
REACH
MILES
BY
COUNTY
*/
/*****************************************************************************/

data
rchmile;
67
67
set
ohio.
us_
rchmi;
cntyfip=
fips;
keep
countymi
cntyfip;
run;

proc
sort
data=
rchmile;
by
cntyfip;

/*****************************************************************************/
/*
PULL
TOGETHER
OUR
REACHES
WITH
ASSOCIATED
COUNTIES
*/
/*****************************************************************************/

data
tot_
mile;
merge
cnty3
rchmile;
by
cntyfip;

if
reachnmb=.
then
delete;
run;

proc
sort
data=
tot_
mile;
by
reachnmb
cntyfip;
quit;

/*****************************************************************************/
/*
SUM
REACH
MILES
OVER
COUNTIES
CONTAINING
THE
SAME
REACH
*/
/*
FINISHED
DATA
SET
CONTAINS
TOTAL
NUMBER
OF
REACH
MILES
IN
*/
/*
COUNTIES
CONTAINING
A
GIVEN
REACH.
BRING
IN
THE
FISHING
*/
/*
LICNESE
DATA
BY
COUNTY.
*/
/*****************************************************************************/

proc
sql;

create
table
miles
as
select
tot_
mile.
reachnmb,
sum(
countymi)
as
denom,
min(
segl)
as
leng,
sum(
fw_
lic)
as
fwlictot,
sum(
sw_
lic)
as
swlictot
from
tot_
mile,
facs,
licens
where
tot_
mile.
reachnmb
=
facs.
reachnmb
and
tot_
mile.
cntyfip
=
licens.
cntyfip
group
by
tot_
mile.
reachnmb
order
by
tot_
mile.
reachnmb;
quit;

proc
sort
data=
miles;
by
reachnmb;
quit;

/*****************************************************************************/
/*
Merge
in
Fishing
Advisory
Data
with
County
mile
data
*/
/*****************************************************************************/

proc
sort
data=
ohio.
fishadv1;
by
reachnmb;
quit;

data
miles2;
merge
miles
ohio.
fishadv1;
by
reachnmb;

/*
Hard­
Wire
Statewide
Advisories
*/
68
68
if
st
=
'
MI'
or
st
=
'
NJ'
or
st
=
'
RI'
or
st
=
'
MS'
then
advisory
=
'
yes';

/*
Multiplier
for
20%
reduction
in
fishermen
due
to
advisory
*/
if
advisory
=
'
yes'
or
advisory
=
'
A­
yes'
then
advmult
=
0.80;
else
advmult
=
1.00;
run;

/*****************************************************************************/
/*
ESTIMATE
SPORT
AND
SUBSISTANCE
FISHING
POPULATIONS
*/
/*****************************************************************************/

data
pops;
set
miles2;
by
reachnmb;
if
first.
reachnmb;

/*
If
missing
the
percentage
of
water
miles
for
the
given
reach,
use
*/
/*
mean
vale
of
6%
(
0.06)
*/
/*
Average
family
size
is
assumed
to
be
2.62
persons
*/
/*
Subsistance
population
assumed
to
be
5%
(
0.05)
of
the
sport
pop.
*/

if
leng=.
then
fwspt
=
fwlictot*
0.06*
2.62*
advmult;
else
fwspt
=
fwlictot*(
leng/
denom)*
2.62*
advmult;
fwsub
=
0.05*
fwspt;

if
leng=.
then
swspt
=
swlictot*
0.06*
2.62*
advmult;
else
swspt
=
swlictot*(
leng/
denom)*
2.62*
advmult;
swsub
=
0.05*
swspt;

fwsptpop
=
round(
fwspt);
fwsubpop
=
round(
fwsub);
swsptpop
=
round(
swspt);
swsubpop
=
round(
swsub);

keep
reachnmb
fwsptpop
fwsubpop
swsptpop
swsubpop;
run;

proc
sort
data=
pops;
by
reachnmb;
quit;
proc
sort
data=
rundat.
cnc_
hh;
by
reachnmb;
quit;

/*****************************************************************************/
/*
MERGE
CONCENTRATION
DATA
BY
REACH
WITH
THE
NUMBER
OF
SPORT
AND
*/
/*
SUBSISTENCE
ANGLERS
*/
/*****************************************************************************/

data
canc;
merge
rundat.
cnc_
hh
pops;
by
reachnmb;

if
cnc_
base
=
.
then
delete;
if
fwsptpop=.
then
delete;
run;
69
69
proc
sort
data=
canc;
by
reachnmb
casno
event_
wt;
quit;

/*****************************************************************************/
/*
Output
lead
concentrations
on
reaches
where
the
concentration
is
*/
/*
greater
than
1
ug/
l.
This
data
used
in
the
lead
benefits
programs
*/
/*****************************************************************************/

data
rundat.
lead;
set
canc;

if
casno
=
'
7439921';

if
cnc_
base=.
then
delete;
if
cnc_
base
<
1
then
delete;
run;

/*****************************************************************************/
/*
BRING
IN
SLOPE
FACTOR,
REFERENCE
DOSE,
AND
BIOCONCENTRATION
FROM
CHEMDATA*/
/*****************************************************************************/

proc
sql;

create
table
canca
as
select
reachnmb,
canc.
casno,
cnc_
base
as
base,
cnc_
trt1
as
treat1,
cnc_
trt2
as
treat2,
fwsptpop,
fwsubpop,
swsptpop,
swsubpop,
slope_
fa
as
sf,
referenc
as
rfd,
bioconce
as
bcfval,
event_
wt
as
weight
from
canc,
ohio.
chemdata
where
canc.
casno
=
chemdata.
casno
order
by
reachnmb,
canc.
casno,
weight;
quit;

/*****************************************************************************/
/*
ESTIMATE
CANCER
EQUATIONS
AND
CALCULATE
CANCER
RISK
DUE
TO
FISH
*/
/*
CONSUMPTION
*/
/*****************************************************************************/

data
canc2;
set
canca;
if
sf;

/*
DEFINE
CONSTANTS
*/

cf1
=
0.001;
/*
conversion
milligrams
per
microgram
*/
cf2
=
365;
/*
conversion
365
days
per
year
*/
cr1
=
0.008;
/*
consumption
rate
1
child
:
8.0
(
rec.)
grams/
day
*/
cr2
=
0.017;
/*
consumption
rate
2
adult:
17.5
(
rec.)
grams/
day
*/
cr3
=
0.065;
/*
consumption
rate
3
child:
65.55
(
sub.)
grams/
day*/
cr4
=
0.142;
/*
consumption
rate
4
adult:
142.4
(
sub.)
grams/
day*/
ef
=
365;
/*
exposure
frequency:
365
days
per
year
*/
ed1
=
18;
/*
exposure
duration
1
child:
18
years
(
rec.)
*/
ed2
=
52;
/*
exposure
duration
2
adult:
52
years
(
rec.)
*/
70
70
ed3
=
18;
/*
exposure
duration
3
child:
18
years
(
sub.)
*/
ed4
=
52;
/*
exposure
duration
4
adult:
52
years
(
sub.)
*/
bw1
=
30;
/*
body
weight
1
child:
30
kg
*/
bw2
=
70;
/*
body
weight
2
adult:
70
kg
*/
lt
=
70;
/*
lifetime:
70
years
*/

/*
CALCULATE
CANCER
RISK
*/

/*
base
values
*/
bsptrisk
=
(((
base
*
cf1
*
cr1
*
bcfval
*
ef
*
ed1)
/
(
bw1
*
lt
*
cf2))
+
((
base
*
cf1
*
cr2
*
bcfval
*
ef
*
ed2)
/
(
bw2
*
lt
*
cf2)))
*
sf;

bsubrisk
=
(((
base
*
cf1
*
cr3
*
bcfval
*
ef
*
ed3)
/
(
bw1
*
lt
*
cf2))
+
((
base
*
cf1
*
cr4
*
bcfval
*
ef
*
ed4)
/
(
bw2
*
lt
*
cf2)))
*
sf;

/*
treatment
values
*/
sptrisk1
=
(((
treat1
*
cf1
*
cr1
*
bcfval
*
ef
*
ed1)
/
(
bw1
*
lt
*
cf2))
+
((
treat1
*
cf1
*
cr2
*
bcfval
*
ef
*
ed2)
/
(
bw2
*
lt
*
cf2)))*
sf;

subrisk1
=
(((
treat1
*
cf1
*
cr3
*
bcfval
*
ef
*
ed3)
/
(
bw1
*
lt
*
cf2))
+
((
treat1
*
cf1
*
cr4
*
bcfval
*
ef
*
ed4)
/
(
bw2
*
lt
*
cf2)))*
sf;

sptrisk2
=
(((
treat2
*
cf1
*
cr1
*
bcfval
*
ef
*
ed1)
/
(
bw1
*
lt
*
cf2))
+
((
treat2
*
cf1
*
cr2
*
bcfval
*
ef
*
ed2)
/
(
bw2
*
lt
*
cf2)))*
sf;

subrisk2
=
(((
treat2
*
cf1
*
cr3
*
bcfval
*
ef
*
ed3)
/
(
bw1
*
lt
*
cf2))
+
((
treat2
*
cf1
*
cr4
*
bcfval
*
ef
*
ed4)
/
(
bw2
*
lt
*
cf2)))*
sf;
run;

/*****************************************************************************/
/*
Sum
up
the
risks
over
the
pollutants
by
reach.
Keep
the
reach
statictics
*/
/*****************************************************************************/

proc
sql;

create
table
sumrsk
as
select
reachnmb,
sum(
bsptrisk)
as
rsk_
bspt,
sum(
bsubrisk)
as
rsk_
bsub,
sum(
sptrisk1)
as
rsk_
1spt,
sum(
subrisk1)
as
rsk_
1sub,
sum(
sptrisk2)
as
rsk_
2spt,
sum(
subrisk2)
as
rsk_
2sub
from
canc2
group
by
reachnmb
order
by
reachnmb;
quit;

/*
Print
out
average
lifetime
risk
*/
proc
means
data=
valspt;
title3
'
Average
Lifetime
Cancer
Risk­
Recreational';
quit;

proc
means
data=
valsub;
title3
'
Average
Lifetime
Cancer
Risk­
Subsistance';
quit;
71
71
data
canc2a;
merge
canc2
sumrsk;
by
reachnmb;

lt
=
70;
/*
lifetime*/

/*
calc
annual
cancer
cases
*/
fwsptc_
b
=
(
bsptrisk
*
fwsptpop)/
lt;
fwsubc_
b
=
(
bsubrisk
*
fwsubpop)/
lt;
swsptc_
b
=
(
bsptrisk
*
swsptpop)/
lt;
swsubc_
b
=
(
bsubrisk
*
swsubpop)/
lt;
fwsptc_
1
=
(
sptrisk1
*
fwsptpop)/
lt;
fwsubc_
1
=
(
subrisk1
*
fwsubpop)/
lt;
swsptc_
1
=
(
sptrisk1
*
swsptpop)/
lt;
swsubc_
1
=
(
subrisk1
*
swsubpop)/
lt;
fwsptc_
2
=
(
sptrisk2
*
fwsptpop)/
lt;
fwsubc_
2
=
(
subrisk2
*
fwsubpop)/
lt;
swsptc_
2
=
(
sptrisk2
*
swsptpop)/
lt;
swsubc_
2
=
(
subrisk2
*
swsubpop)/
lt;

if
dropspt
=
1
then
do;
fwsptc_
b
=
0;
swsptc_
b
=
0;
fwsptc_
1
=
0;
swsptc_
1
=
0;
fwsptc_
2
=
0;
swsptc_
2
=
0;
end;

if
dropsub
=
1
then
do;
fwsubc_
b
=
0;
swsubc_
b
=
0;
fwsubc_
1
=
0;
swsubc_
1
=
0;
fwsubc_
2
=
0;
swsubc_
2
=
0;
end;

fwtotc_
b
=
fwsptc_
b
+
fwsubc_
b;
swtotc_
b
=
swsptc_
b
+
swsubc_
b;
fwtotc_
1
=
fwsptc_
1
+
fwsubc_
1;
swtotc_
1
=
swsptc_
1
+
swsubc_
1;
fwtotc_
2
=
fwsptc_
2
+
fwsubc_
2;
swtotc_
2
=
swsptc_
2
+
swsubc_
2;

fwtotpop
=
fwsptpop
+
fwsubpop;
swtotpop
=
swsptpop
+
swsubpop;
sptpop
=
fwsptpop
+
swsptpop;
subpop
=
fwsubpop
+
swsubpop;

totc_
b
=
fwtotc_
b
+
swtotc_
b;
totc_
1
=
fwtotc_
1
+
swtotc_
1;
72
72
totc_
2
=
fwtotc_
2
+
swtotc_
2;

totspt_
b
=
fwsptc_
b
+
swsptc_
b;
totsub_
b
=
fwsubc_
b
+
swsubc_
b;
totspt_
1
=
fwsptc_
1
+
swsptc_
1;
totsub_
1
=
fwsubc_
1
+
swsubc_
1;
totspt_
2
=
fwsptc_
2
+
swsptc_
2;
totsub_
2
=
fwsubc_
2
+
swsubc_
2;

format
bsptrisk
bsubrisk
sptrisk1
subrisk1
sptrisk2
subrisk2
e12.;

label
fwsptc_
b
=
'
Cancer
cases,
freshwater
sport
(
BL)'
fwsubc_
b
=
'
Cancer
cases,
freshwater
subsistence
(
BL)'
swsptc_
b
=
'
Cancer
cases,
saltwater
sport
(
BL)'
swsubc_
b
=
'
Cancer
cases,
saltwater
subsistence
(
BL)'
fwtotc_
b
=
'
Total
freshwater
cancer
cases
(
BL)'
swtotc_
b
=
'
Total
saltwater
cancer
cases
(
BL)'
fwsptc_
1
=
'
Cancer
cases,
freshwater
sport
(
Opt
1)'
fwsubc_
1
=
'
Cancer
cases,
freshwater
subsistence
(
Opt
1)'
swsptc_
1
=
'
Cancer
cases,
saltwater
sport
(
Opt
1)'
swsubc_
1
=
'
Cancer
cases,
saltwater
subsistence
(
Opt
1)'
fwtotc_
1
=
'
Total
freshwater
cancer
cases
(
Opt
1)'
swtotc_
1
=
'
Total
saltwater
cancer
cases
(
Opt
1)'
fwsptc_
2
=
'
Cancer
cases,
freshwater
sport
(
Opt
2)'
fwsubc_
2
=
'
Cancer
cases,
freshwater
subsistence
(
Opt
2)'
swsptc_
2
=
'
Cancer
cases,
saltwater
sport
(
Opt
2)'
swsubc_
2
=
'
Cancer
cases,
saltwater
subsistence
(
Opt
2)'
fwtotc_
2
=
'
Total
freshwater
cancer
cases
(
Opt
2)'
swtotc_
2
=
'
Total
saltwater
cancer
cases
(
Opt
2)'
fwsptpop
=
'
Freshwater
sport
population'
fwsubpop
=
'
Freshwater
subsistence
population'
swsptpop
=
'
Saltwater
sport
population'
swsubpop
=
'
Saltwater
subsistence
population'
totspt_
b
=
'
Total
Sport
Cases
(
BL)'
totsub_
b
=
'
Total
Subsistence
Cases
(
BL)'
totspt_
1
=
'
Total
Sport
Cases
(
Opt
1)'
totsub_
1
=
'
Total
Subsistence
Cases
(
Opt1
)'
totspt_
2
=
'
Total
Sport
Cases
(
Opt
2)'
totsub_
2
=
'
Total
Subsistence
Cases
(
Opt
2)'
totc_
b
=
'
Total
Cancer
Cases
(
BL)'
totc_
1
=
'
Total
Cancer
Cases
(
Opt
1)'
totc_
2
=
'
Total
Cancer
Cases
(
Opt
2)'
fwtotpop
=
'
Total
exposed
freshwater
population'
swtotpop
=
'
Total
exposed
saltwater
population'
sptpop
=
'
Exposed
Sport
Population'
subpop
=
'
Exposed
Subsistence
Population';
run;

proc
means
sum;
var
totspt_
b
totsub_
b
totspt_
1
totsub_
1
totspt_
2
totsub_
2
totc_
b
totc_
1
totc_
2
sptpop
subpop;
73
73
title3
'
SAMPLE
Cancer
estimates';
quit;

proc
means
sum;
weight
weight;
var
totspt_
b
totsub_
b
totspt_
1
totsub_
1
totspt_
2
totsub_
2
totc_
b
totc_
1
totc_
2
sptpop
subpop;
title3
'
NATIONAL
Cancer
estimates';
quit;

proc
sql;
create
table
byrch
as
select
reachnmb,
sum(
base)
as
base,
sum(
treat1)
as
treat1,
sum(
treat2)
as
treat2,
sum(
sptpop)
as
sptpop,
sum(
subpop)
as
subpop,
sum(
totc_
b)
as
totc_
b,
sum(
totc_
1)
as
totc_
1,
sum(
totc_
2)
as
totc_
2
from
canc2a
group
by
reachnmb
order
by
reachnmb;
quit;

proc
print
data=
byrch;
title3
'
NATIONAL
Cancer
by
reach';
quit;

/*****************************************************************************/
/*
Calculate
decrease
in
cancer
cases
under
the
options
and
the
monetized
*/
/*
benefit
based
on
the
value
of
a
statistical
life
(
in
$
1999)
*/
/*
lower
$
2.6
mln
*/
/*
upper
$
13.6
mln
*/
/*
mid
$
7.9
*/
/*
KUNAL
SHARMA
(
03.20.02)
­
Mid
Value
Has
Changed.
See
Below.
*/
/*****************************************************************************/

data
cancdiff;
set
canc2a;

fwsptd1
=
fwsptc_
b
­
fwsptc_
1;
fwsubd1
=
fwsubc_
b
­
fwsubc_
1;
swsptd1
=
swsptc_
b
­
swsptc_
1;
swsubd1
=
swsubc_
b
­
swsubc_
1;

fwsptd2
=
fwsptc_
b
­
fwsptc_
2;
fwsubd2
=
fwsubc_
b
­
fwsubc_
2;
swsptd2
=
swsptc_
b
­
swsptc_
2;
swsubd2
=
swsubc_
b
­
swsubc_
2;

fwtotd1
=
fwsptd1
+
fwsubd1;
swtotd1
=
swsptd1
+
swsubd1;
totd1
=
fwtotd1
+
swtotd1;

fwtotd2
=
fwsptd2
+
fwsubd2;
swtotd2
=
swsptd2
+
swsubd2;
74
74
totd2
=
fwtotd2
+
swtotd2;

fwb1_
lw
=
fwtotd1*
2500000;
fwb1_
hg
=
fwtotd1*
13600000;
swb1_
lw
=
swtotd1*
2500000;
swb1_
hg
=
swtotd1*
13600000;
fwmid1
=
fwtotd1*
6500000;
swmid1
=
swtotd1*
6500000;

fwb2_
lw
=
fwtotd2*
2500000;
fwb2_
hg
=
fwtotd2*
13600000;
swb2_
lw
=
swtotd2*
2500000;
swb2_
hg
=
swtotd2*
13600000;
fwmid2
=
fwtotd2*
6500000;
swmid2
=
swtotd2*
6500000;

totb1_
lw
=
fwb1_
lw
+
swb1_
lw;
totb1_
hg
=
fwb1_
hg
+
swb1_
hg;
totb2_
lw
=
fwb2_
lw
+
swb2_
lw;
totb2_
hg
=
fwb2_
hg
+
swb2_
hg;

mid1
=
fwmid1
+
swmid1;
mid2
=
fwmid2
+
swmid2;

run;

proc
means
sum;
weight
weight;
var
mid1
mid2;
label
mid1
=
'
Mid
Benefits
(
Opt1)'
mid2
=
'
Mid
Benefits
(
Opt2)';
title3
'
Monetized
Benefits
($
2001)';
quit;

proc
sort;
by
casno;
quit;

proc
means
sum;
weight
weight;
by
casno;
var
mid1
mid2;
label
mid1
=
'
Mid
Benefits
(
Opt1)'
mid2
=
'
Mid
Benefits
(
Opt2)';
title3
'
Monetized
Benefits
($
2001)
by
Pollutant';
quit;

proc
sql;
create
table
bychemn
as
select
casno,
sum(
totd1*
weight)
as
diff1,
sum(
totd2*
weight)
as
diff2,
sum(
totb1_
lw*
weight)
as
ben1low,
sum(
totb1_
hg*
weight)
as
ben1hg,
sum(
totb2_
lw*
weight)
as
ben2low,
sum(
totb2_
hg*
weight)
as
ben2hg,
sum(
mid1*
weight)
as
midpt1,
sum(
mid2*
weight)
as
midpt2
from
cancdiff
group
by
casno
75
75
order
by
casno;
quit;

proc
print
data=
bychemn;
label
diff1
=
'
Saved
Cases
(
opt1)'
diff2
=
'
Saved
Cases
(
opt2)'
midpt1
=
'
Midpoint
Benefits
(
opt1)'
midpt2
=
'
Midpoint
Benefits
(
opt2)';
title3
'
Benefits
by
Chemical
Casno
($
2001)';
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
76
76
Program
Output
77
77
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Cancer
from
Fish
Consumption
(
Sub
4)
13:
00
Friday,
November
29,
2002
Average
Lifetime
Cancer
Risk­
Recreational
The
MEANS
Procedure
Variable
N
Mean
Std
Dev
Minimum
Maximum
                                                                              
REACHNMB
23
4313065832
402936554
4100001001
5120101013
rsk_
bspt
23
3.1950353E­
6
0.000012748
4.964859E­
17
0.000060311
rsk_
1spt
23
1.3017865E­
6
4.3428006E­
6
4.964859E­
17
0.000016766
rsk_
2spt
23
7.875826E­
11
2.616005E­
10
0
9.672594E­
10
                                                                              
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Cancer
from
Fish
Consumption
(
Sub
4)
13:
00
Friday,
November
29,
2002
Average
Lifetime
Cancer
Risk­
Subsistance
The
MEANS
Procedure
Variable
N
Mean
Std
Dev
Minimum
Maximum
                                                                              
REACHNMB
23
4313065832
402936554
4100001001
5120101013
rsk_
bsub
23
0.000026487
0.000105686
4.11595E­
16
0.000499990
rsk_
1sub
23
0.000010792
0.000036003
4.11595E­
16
0.000138997
rsk_
2sub
23
6.529188E­
10
2.1687107E­
9
0
8.0187388E­
9
                                                                              
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Cancer
from
Fish
Consumption
(
Sub
4)
13:
00
Friday,
November
29,
2002
SAMPLE
Cancer
estimates
The
MEANS
Procedure
Variable
Label
Sum
                                                           
totspt_
b
Total
Sport
Cases
(
BL)
0.0023462
totsub_
b
Total
Subsistence
Cases
(
BL)
0.000974333
totspt_
1
Total
Sport
Cases
(
Opt
1)
0.000769840
totsub_
1
Total
Subsistence
Cases
(
Opt1
)
0.000319388
totspt_
2
Total
Sport
Cases
(
Opt
2)
4.039003E­
8
totsub_
2
Total
Subsistence
Cases
(
Opt
2)
1.6751893E­
8
totc_
b
Total
Cancer
Cases
(
BL)
0.0033205
totc_
1
Total
Cancer
Cases
(
Opt
1)
0.0010892
totc_
2
Total
Cancer
Cases
(
Opt
2)
5.7141923E­
8
sptpop
Exposed
Sport
Population
1490238.00
subpop
Exposed
Subsistence
Population
74527.00
                                                           
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Cancer
from
Fish
Consumption
(
Sub
4)
13:
00
Friday,
November
29,
2002
NATIONAL
Cancer
estimates
The
MEANS
Procedure
Variable
Label
Sum
                                                           
totspt_
b
Total
Sport
Cases
(
BL)
0.0023462
totsub_
b
Total
Subsistence
Cases
(
BL)
0.000974333
totspt_
1
Total
Sport
Cases
(
Opt
1)
0.000769840
totsub_
1
Total
Subsistence
Cases
(
Opt1
)
0.000319388
totspt_
2
Total
Sport
Cases
(
Opt
2)
4.039003E­
8
totsub_
2
Total
Subsistence
Cases
(
Opt
2)
1.6751893E­
8
totc_
b
Total
Cancer
Cases
(
BL)
0.0033205
totc_
1
Total
Cancer
Cases
(
Opt
1)
0.0010892
totc_
2
Total
Cancer
Cases
(
Opt
2)
5.7141923E­
8
sptpop
Exposed
Sport
Population
1490238.00
subpop
Exposed
Subsistence
Population
74527.00
                                                           
78
78
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Cancer
from
Fish
Consumption
(
Sub
4)
13:
00
Friday,
November
29,
2002
Monetized
Benefits
($
2001)

The
MEANS
Procedure
Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
14503.21
mid2
Mid
Benefits
(
Opt2)
21582.82
                                               
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Cancer
from
Fish
Consumption
(
Sub
4)
13:
00
Friday,
November
29,
2002
Monetized
Benefits
($
2001)
by
Pollutant
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
117817
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

The
MEANS
Procedure
Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
281.6509050
mid2
Mid
Benefits
(
Opt2)
577.5226061
                                               
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
123911
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
8.9817015
mid2
Mid
Benefits
(
Opt2)
9.7155103
                                               
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
127184
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
256.3534047
mid2
Mid
Benefits
(
Opt2)
354.0688947
                                               
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
62533
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
232.4117576
mid2
Mid
Benefits
(
Opt2)
239.2664074
                                               
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
62759
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
0
mid2
Mid
Benefits
(
Opt2)
658.6375163
                                               
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
67663
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
3.6853219
79
79
mid2
Mid
Benefits
(
Opt2)
5.1300883
                                               
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Cancer
from
Fish
Consumption
(
Sub
4)
13:
00
Friday,
November
29,
2002
Monetized
Benefits
($
2001)
by
Pollutant
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
7440382
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

The
MEANS
Procedure
Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
12988.53
mid2
Mid
Benefits
(
Opt2)
18707.37
                                               
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
75003
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
5.0830374
mid2
Mid
Benefits
(
Opt2)
10.3305030
                                               
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
75092
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
1.1563429
mid2
Mid
Benefits
(
Opt2)
1.6092987
                                               
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
75354
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
541.3194067
mid2
Mid
Benefits
(
Opt2)
751.3926860
                                               
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
78591
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
1.0129558
mid2
Mid
Benefits
(
Opt2)
1.2747406
                                               
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
79016
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
20.7957897
mid2
Mid
Benefits
(
Opt2)
28.1388833
                                               
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Cancer
from
Fish
Consumption
(
Sub
4)
13:
00
Friday,
November
29,
2002
Monetized
Benefits
($
2001)
by
Pollutant
80
80
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
86306
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

The
MEANS
Procedure
Variable
Label
Sum
                                               
mid1
Mid
Benefits
(
Opt1)
162.2287400
mid2
Mid
Benefits
(
Opt2)
238.3631497
                                               
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Cancer
from
Fish
Consumption
(
Sub
4)
13:
00
Friday,
November
29,
2002
Benefits
by
Chemical
Casno
($
2001)

Obs
CASNO
diff1
diff2
ben1low
ben1hg
ben2low
ben2hg
midpt1
midpt2
1
117817
.000043331
.000088850
108.33
589.30
222.12
1208.35
281.65
577.52
2
123911
.000001382
.000001495
3.45
18.79
3.74
20.33
8.98
9.72
3
127184
.000039439
.000054472
98.60
536.37
136.18
740.82
256.35
354.07
4
62533
.000035756
.000036810
89.39
486.28
92.03
500.62
232.41
239.27
5
62759
0
.000101329
0.00
0.00
253.32
1378.07
0.00
658.64
6
67663
.000000567
.000000789
1.42
7.71
1.97
10.73
3.69
5.13
7
7440382
.001998236
.002878057
4995.59
27176.00
7195.14
39141.57
12988.53
18707.37
8
75003
.000000782
.000001589
1.96
10.64
3.97
21.61
5.08
10.33
9
75092
.000000178
.000000248
0.44
2.42
0.62
3.37
1.16
1.61
10
75354
.000083280
.000115599
208.20
1132.61
289.00
1572.14
541.32
751.39
11
78591
.000000156
.000000196
0.39
2.12
0.49
2.67
1.01
1.27
12
79016
.000003199
.000004329
8.00
43.51
10.82
58.88
20.80
28.14
13
86306
.000024958
.000036671
62.40
339.43
91.68
498.73
162.23
238.36
81
81
Cancer
from
Drinking
Water
82
82
"
Create
Revised
Datasets
for
Brad
­
Final
(
No
GMs).
sas"
Generates
a
data
set
of
pollutant
loadings
discharged
to
Ohio
RF1
reaches
from
direct
dischargers
and
POTWs
(
with
removals)
for
the
water
quality
modeling
program.
83
83
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Create
Revised
Datasets
for
Brad
­
Final
(
No
GMs).
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
08/
13/
2000
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
Merges
facility
data
and
loadings
among
many
sets
and
generates
two
*/
/*
files
for
use
in
calculating
instream
concentrations.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Static
Library
­
DO
NOT
CHANGE
*/
/*****************************************************************************/

%
let
ohio
=
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
Static";

/*****************************************************************************/
/*
Run
Specific
Data
Library.
MUST
BE
AN
EXISTING
DIRECTORY
!!
*/
/*****************************************************************************/

%
let
rundat
=
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
Final
(
No
GMs)";

libname
ohio
v6
&
ohio;
libname
rundat
v6
&
rundat;

/*****************************************************************************/
/*
Merge
the
facility
data
with
it's
loadings
*/
/*****************************************************************************/

proc
sql;
/*
screeners
*/
create
table
scrn
as
select
fac_
info.
siteid,
potw_
npd
as
potw,
discharg,
reachnmb,
fac_
info.
source,
casnum
as
casno,
loads0,
case
when
opt2
=
1
then
0
else
loads2
end
as
loads2,
case
when
opt5
=
1
then
0
else
loads5
end
as
loads5
from
ohio.
fac_
info,
rundat.
scrload,
rundat.
ohioclos
where
fac_
info.
siteid
=
scrload.
siteid
and
fac_
info.
source
=
'
screener'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1;
84
84
/*
mpm
facilities
*/
create
table
mpm
as
select
fac_
info.
siteid,
potw_
npd
as
potw,
reachnmb,
discharg,
fac_
info.
source,
casnum
as
casno,
loads0,
case
when
opt2
=
1
then
0
else
loads2
end
as
loads2,
case
when
opt5
=
1
then
0
else
loads5
end
as
loads5
from
ohio.
fac_
info,
rundat.
mpmload,
rundat.
ohioclos
where
fac_
info.
siteid
=
mpmload.
siteid
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1
and
fac_
info.
source
=
'
mpm';

/*
pcs
direct
dischargers
*/
/*
They
have
no
closures
*/
create
table
pcs
as
select
siteid,
potw_
npd
as
potw,
reachnmb,
discharg,
source,
cas_
no
as
casno,
lby0
as
loads0,
lby0
as
loads2,
lby0
as
loads5
from
ohio.
fac_
info,
ohio.
pcsload
where
fac_
info.
potw_
npd
=
pcsload.
npdes
and
source
=
'
pcsdirect';

/*
random
assigns
linked
to
mpm
data
*/
create
table
rand_
pcs
as
select
fac_
info.
siteid,
siteref,
potw_
npd
as
potw,
reachnmb,
discharg,
fac_
info.
source,
casnum
as
casno,
loads0,
case
when
opt2
=
1
then
0
else
loads2
end
as
loads2,
case
when
opt5
=
1
then
0
else
loads5
end
as
loads5
from
ohio.
fac_
info,
rundat.
scrload,
rundat.
ohioclos
where
fac_
info.
siteref
=
scrload.
siteid
and
fac_
info.
source
=
'
random'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1;
quit;

/*****************************************************************************/
/*
Combine
the
directs
from
all
areas
*/
/*****************************************************************************/

data
directs;
set
scrn
mpm
pcs;

if
discharg
^=
'
direct'
then
delete;
run;

/*****************************************************************************/
/*
Combine
the
indirects
from
all
areas
*/
/*****************************************************************************/

data
indir;
set
scrn
mpm
rand_
pcs;

if
discharg
^=
'
indirect'
then
delete;
if
potw
=
'
'
then
delete;
run;

/*****************************************************************************/
85
85
/*
Process
indirects
*/
/*****************************************************************************/

proc
sql;

/*
sum
pollutants
by
potw
*/
create
table
indies
as
select
potw,
min(
reachnmb)
as
reach,
casno,
sum(
loads0)
as
base,
sum(
loads2)
as
treat1,
sum(
loads5)
as
treat2
from
indir
group
by
potw,
casno
order
by
potw,
casno;

/*
allow
for
potw
removals
*/
create
table
indies2
as
select
potw
as
npdes,
reach
as
reachnmb,
indies.
casno
as
cas_
no,
base*(
1­(
potw_
rem/
100))
as
base,
treat1*(
1­(
potw_
rem/
100))
as
treat1,
treat2*(
1­(
potw_
rem/
100))
as
treat2
from
indies,
ohio.
twf_
remr
where
indies.
casno
=
twf_
remr.
cas;
quit;

/*****************************************************************************/
/*
Merge
in
the
pcs
loadings
*/
/*****************************************************************************/

data
indies3;
merge
indies2
ohio.
pcsload(
keep
=
lby0
npdes
cas_
no);
by
npdes
cas_
no;
if
reachnmb=.
then
delete;
potw=
npdes;
casno=
cas_
no;
run;

/*****************************************************************************/
/*
Generate
the
correct
loads
*/
/*****************************************************************************/
/*
An
attempt
is
being
made
to
account
for
the
full
baseline
loadings
on
a
*/
/*
reach
based
on
all
facilities
discharging
to
that
reach
and
not
solely
the*/
/*
loadings
from
MP&
M
facilities.
Thus,
PCS
data
is
used
to
augment
the
total*/
/*
baseline
loadings
if
the
PCS
loadings
are
greater
than
the
baseline
*/
/*
from
the
MP&
M
based
estimated
loadings.
If
the
MP&
M
estimated
loadings
are*/
/*
greater
than
the
PCS
loadings,
it
is
assumed
that
the
MP&
M
loadings
are
*/
/*
accounting
for
all
of
the
baseline
loadings.
*/
/*****************************************************************************/

data
indies4;
set
indies3;
86
86
if
base=.
then
delete;
if
lby0
=
.
or
lby0
<
base
then
do;
/*
MP&
M
baseline
larger,
ignore
PCS
data
*/
loads0
=
base;
loads2
=
treat1;
loads5
=
treat2;
end;
else
do;
/*
PCS
greater
than
MP&
M
baseline
*/
diff
=
lby0
­
base;
/*
Get
difference
between
baselines*/
loads0
=
lby0;
/*
Set
baseline
to
PCS
value*/
loads2
=
treat1
+
diff;
/*
Apply
difference
to
option
levels*/
loads5
=
treat2
+
diff;
/*
Apply
difference
to
option
levels*/
end;

keep
potw
casno
reachnmb
loads0
loads2
loads5
weight;
run;

/*****************************************************************************/
/*
Get
directs
with
the
same
variables
as
indirects
*/
/*****************************************************************************/

data
directs2;
set
directs;

keep
potw
casno
reachnmb
loads0
loads2
loads5;
run;

/*****************************************************************************/
/*
Combine
the
indirects
and
directs
*/
/*****************************************************************************/

data
both;
set
indies4
directs2;
run;

/*****************************************************************************/
/*
Sum
up
over
potws
and
directs
by
reach
*/
/*****************************************************************************/

proc
sql;

create
table
both2
as
select
reachnmb,
casno,
sum(
loads0)
as
base,
sum(
loads2)
as
treat1,
sum(
loads5)
as
treat2
from
both
group
by
reachnmb,
casno
order
by
reachnmb,
casno;

/*
transform
loadings
to
kg/
day
and
add
in
the
decay
rate
*/
/*
allow
for
closures
of
MP&
M
Ohio
facilities
*/

create
table
both3
as
87
87
select
both2.
reachnmb,
both2.
casno,
((
base/
365)
*
0.4535924)
as
base,
((
treat1/
365)
*
0.4535924)
as
treat1,
((
treat2/
365)
*
0.4535924)
as
treat2,
(
biodegre/
24)
as
decay
from
both2,
ohio.
chemdata
where
both2.
casno
=
chemdata.
casno;
quit;

data
master;
set
both3;

if
reachnmb
=
0
then
delete;
run;

/*****************************************************************************/
/*
Create
the
datasets
for
Brad
*/
/*****************************************************************************/

proc
sql;

create
table
rundat.
to_
brad
as
select
reachnmb,
casno,
base,
treat1,
treat2,
decay
from
master;
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
88
88
Water
Quality
Modeling
Pollutant
in­
stream
concentrations
on
RF1
reaches
containing
drinking
water
intakes
downstream
from
MP&
M
facilities
and
POTWs
are
estimated
for
six
carcinogens
not
covered
by
EPA
drinking
water
criteria.
The
water
quality
model
used
is
the
Risk­
Screening
Environmental
Indicators
developed
for
the
EPA
OPPT
(
http://
www.
epa.
gov/
opptintr/
env_
ind/
index.
html).
See
DCN
37554.
89
89
"
Modify
Brad
Datasets
for
Final
(
No
GMs)
run.
sas"
This
program
modifies
the
output
from
the
Water
Quality
Modeling
for
use
in
the
benefits
programs.
90
90
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Modify
Brad
Datasets
for
Final
(
No
GMs)
run.
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
08/
23/
2000
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
This
program
takes
the
output
from
the
decay
model
and
generates
files
*/
/*
with
concetrations
by
reach
for
all
chemicals.
*/
/*
*/
/*
Two
output
files
per
policy
grouping
exist
as
two
sets
of
reach
flows
are*/
/*
used,
normal
(
mean
flow)
and
low
(
7q10
flow).
Mean
flow
concentrations
*/
/*
are
used
for
Human
Health
effects
and
low
flow
are
used
for
Aquatic
life
*/
/*
effects.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

libname
brad
v6
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
Final
(
No
GMs)";
libname
rundat
v6
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
Final
(
No
GMs)";

/*****************************************************************************/
/*
Pull
in
the
data
sets
and
sum
over
the
observations
for
each
reach
*/
/*****************************************************************************/

proc
sql;

create
table
prefsa
as
select
onreach
as
reachnmb,
casno,
sum(
baseconc)
as
base,
sum(
t1conc)
as
treat1,
sum(
t2conc)
as
treat2,
avg(
1)
as
weight
from
brad.
fnlmean
group
by
onreach,
casno
order
by
reachnmb,
casno;

create
table
prefsl
as
select
onreach
as
reachnmb,
casno,
sum(
baseconc)
as
base,
sum(
t1conc)
as
treat1,
sum(
t2conc)
as
treat2,
avg(
1)
as
weight
from
brad.
fnllow
group
by
onreach,
casno
order
by
reachnmb,
casno;
quit;
91
91
/*****************************************************************************/
/*
Save
the
concentrations
data
sets
for
the
analysis
*/
/*****************************************************************************/

data
rundat.
brdevnt;
set
prefsa;
run;
data
rundat.
brdevnt2;
set
prefsl;
run;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
92
92
"
Drinking
Water
Cancer
(
Sub
6).
sas"
Data
from
the
water
quality
modeling
is
used
to
estimate
cancer
risk
from
drinking
water
employing
reference
doses
for
the
six
carcinogens.
Reduced
cancer
risk
is
then
applied
to
the
exposed
populations
and
the
reduction
in
cancer
cases
is
determined
along
with
a
monetary
value.
93
93
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Drinking
Water
Cancer
(
Sub
6)
all
risk
values.
sas
*/
/*
Author:
Stuart
Smith
*/
/*
Date:
04/
21/
2000
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
This
program
calculates
cancer
incidents
due
to
drinking
water
*/
/*
consumption
by
exposed
populations.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Drinking
Water
Cancer
(
Sub
6)';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Load
concentrations
estimated
using
mean
flow
from
decay
model.
*/
/*****************************************************************************/

data
canc;
set
rundat.&
dwset;
if
baseconc
>
0;
if
intakect
>
0;

weight
=
1;

keep
onreach
casno
dwpop
baseconc
t1conc
t2conc
weight;
run;

proc
sort
data=
canc;
by
onreach
casno
weight;
quit;

/*****************************************************************************/
/*
BRING
IN
SLOPE
FACTOR,
REFERENCE
DOSE,
AND
BIOCONCENTRATION
FROM
CHEMDATA*/
/*****************************************************************************/

proc
sql;

create
table
canc1
as
select
onreach
as
reachnmb,
canc.
casno,
sum(
baseconc)
as
base,
sum(
t1conc)
as
94
94
treat1,
sum(
t2conc)
as
treat2,
avg(
dwpop)
as
pop,
avg(
slope_
fa)
as
sf,
avg(
referenc)
as
rfd,
weight
as
smplwt
from
canc,
ohio.
chemdata
where
canc.
casno
=
chemdata.
casno
and
slope_
fa
is
not
missing
group
by
onreach,
canc.
casno,
weight
order
by
reachnmb,
canc.
casno,
smplwt;
quit;

/*****************************************************************************/
/*
ESTIMATE
CANCER
EQUATIONS
AND
CALCULATE
CANCER
CASES
DUE
TO
DRINKING
*/
/*
WATER
CONSUMPTION
*/
/*****************************************************************************/

data
canc2;
set
canc1;
if
sf;
if
smplwt
>
1000
then
delete;
/*
Drop
obs
with
extreme
sample
weights
*/

/*
Keep
only
carcinogens
which
have
no
DW
criterion*/
if
casno
^=
'
62533'
and
casno
^=
'
62759'
and
casno
^=
'
75003'
and
casno
^=
'
78591'
and
casno
^=
'
86306'
and
casno
^=
'
123911'
then
delete;

/*
DEFINE
CONSTANTS
*/

cf1
=
0.001;
/*
conversion
milligrams
per
microgram
*/
cf2
=
365;
/*
conversion:
day
per
year
*/
cr
=
1.24;
/*
consumption
rate:
liters
of
water
per
day
*/
ef
=
350;
/*
exposure
frequency:
350
days
per
year
*/
ed
=
70;
/*
exposure
duration:
70
years
*/
bw
=
70;
/*
body
weight:
70
kg
*/
lt
=
70;
/*
lifetime:
70
years
*/

/*
CALCULATE
CANCER
RISK
*/

/*
Baseline
values
*/
brisk
=
((
base
*
cf1
*
cr
*
ef
*
ed)
/
(
bw
*
lt
*
cf2))
*
sf;

/*
Treatment
values
*/
risk1
=
((
treat1
*
cf1
*
cr
*
ef
*
ed)
/
(
bw
*
lt
*
cf2))
*
sf;

risk2
=
((
treat2
*
cf1
*
cr
*
ef
*
ed)
/
(
bw
*
lt
*
cf2))
*
sf;
run;

/*****************************************************************************/
/*
Sum
up
the
risks
over
the
pollutants
by
reach.
*/
/*
Keep
the
reach
statictics
*/
/*****************************************************************************/

proc
sql;

create
table
sumrsk
as
select
reachnmb,
sum(
brisk)
as
rsk_
b
,
sum(
risk1)
as
rsk_
1,
95
95
sum(
risk2)
as
rsk_
2
from
canc2
group
by
reachnmb
order
by
reachnmb;
quit;

/*****************************************************************************/
/*
Print
out
average
lifetime
risk
*/
/*****************************************************************************/

proc
means
data=
sumrsk;
title3
'
Average
Lifetime
Cancer
Risk';
quit;

data
canc2a;
merge
canc2
sumrsk;
by
reachnmb;

lt
=
70;
/*
lifetime*/

/*
calc
cancer
cases
*/
canc_
b
=
(
brisk
*
pop)
/
lt;
canc_
1
=
(
risk1
*
pop)
/
lt;
canc_
2
=
(
risk2
*
pop)
/
lt;

if
dropobs
=
1
then
do;
canc_
b
=
0;
canc_
1
=
0;
canc_
2
=
0;
end;

totpop
=
pop;

format
brisk
risk1
risk2
e12.;

label
canc_
b
=
'
Cancer
cases
(
BL)'
canc_
1
=
'
Cancer
cases
(
Opt
1)'
canc_
2
=
'
Cancer
cases
(
Opt
2)'
totpop
=
'
Total
Exposed
Population';

if
canc_
b
>
0.65
then
delete;
/*
Drop
large
cancer
cases
*/

/*****************************************************************************/
/*
NOTE:
The
code
above
used
to
read
'
if
canc_
b
>
1
then
delete'
Changed
on
*/
/*
April
10,
2002
by
Kunal
Sharma.
This
was
done
to
ensure
that
two
*/
/*
records
that
were
previosuly
being
dropped
are
still
excluded
after
*/
/*
populations
have
been
reduced
based
on
the
number
of
intake
structures
*/
/*
used
by
each
public
water
supply
system.
*/
/*****************************************************************************/
/*****************************************************************************/
/*
NOTE:
The
sample
weight
and
canc_
b
fixes
affect
only
the
estimates
for
*/
96
96
/*
CAS
=
62759,
which
is
Nitrosodimethylamine,
N­,
a
highly
cancerous
*/
/*
material
when
taken
orally
with
water.
However,
the
results
when
using
*/
/*
the
extreme
sample
weights
and
large
cancer
case
obs
are
not
*/
/*
realistic.
*/
/*****************************************************************************/

run;

/*****************************************************************************/
/*
Determine
the
exposed
population
and
sample
weight
*/
/*****************************************************************************/

proc
sql;

create
table
smplpop
as
select
reachnmb,
avg(
totpop)
as
pop,
avg(
smplwt)
as
samplwt
from
canc2a
group
by
reachnmb
order
by
reachnmb;
quit;

proc
means
data=
canc2a
sum;
weight
smplwt;
var
canc_
b
canc_
1
canc_
2;
title3
'
Cancer
Case
estimates';
quit;

proc
means
data=
smplpop
sum;
weight
samplwt;
var
pop;
title3
'
Cancer
Exposed
Ohio
Population';
quit;

/*****************************************************************************/
/*
Calculate
decrease
in
cancer
cases
under
the
options
and
the
monetized
*/
/*
benefit
based
on
the
value
of
a
statistical
life
(
in
$
2001)
*/
/*
*/
/*
mid
value
of
statistical
life
in
$
2001
is
$
6.5
million
*/
/*
*/
/*
KUNAL
SHARMA
(
03.20.02)
­
Mid
Value
Has
Changed.
See
Below.
*/
/*
STUART
SMITH
(
07.11.02)
­
Mid
Value
Changed
to
$
2001
*/
/*****************************************************************************/

data
cancdiff;
set
canc2a;

diff1
=
canc_
b
­
canc_
1;
diff2
=
canc_
b
­
canc_
2;

b1_
lw
=
diff1*
2500000;
b1_
hg
=
diff1*
13600000;
mid1
=
diff1*
6500000;
97
97
b2_
lw
=
diff2*
2500000;
b2_
hg
=
diff2*
13600000;
mid2
=
diff2*
6500000;

run;

proc
means
sum;
weight
smplwt;
var
diff1
diff2
mid1
mid2;
title3
'
Monetized
Benefits
($
2001)';
label
diff1
=
'
Avoided
Cases
(
Opt1)'
diff2
=
'
Avoided
Cases
(
Opt2)'
mid1
=
'
Mid
Benefits
(
Opt1)'
mid2
=
'
Mid
Benefits
(
Opt2)';
quit;

proc
sort;
by
casno;
quit;

proc
means
sum;
weight
smplwt;
by
casno;
var
diff1
diff2
mid1
mid2;
title3
'
Monetized
Benefits
($
2001)
by
Pollutant';
label
diff1
=
'
Avoided
Cases
(
Opt1)'
diff2
=
'
Avoided
Cases
(
Opt2)'
mid1
=
'
Mid
Benefits
(
Opt1)'
mid2
=
'
Mid
Benefits
(
Opt2)';
quit;

proc
sql;
create
table
bychems
as
select
casno,
sum(
diff1)
as
diff1a,
sum(
diff2)
as
diff2a,
sum(
b1_
lw)
as
ben1low,
sum(
b1_
hg)
as
ben1hg,
sum(
b2_
lw)
as
ben2low,
sum(
b2_
hg)
as
ben2hg,
sum(
mid1)
as
midpt1,
sum(
mid2)
as
midpt2
from
cancdiff
group
by
casno
order
by
casno;

create
table
bychemn
as
select
casno,
sum(
diff1*
smplwt)
as
diff1a,
sum(
diff2*
smplwt)
as
diff2a,
sum(
b1_
lw*
smplwt)
as
ben1low,
sum(
b1_
hg*
smplwt)
as
ben1hg,
sum(
b2_
lw*
smplwt)
as
ben2low,
sum(
b2_
hg*
smplwt)
as
ben2hg,
sum(
mid1*
smplwt)
as
midpt1,
sum(
mid2*
smplwt)
as
midpt2
from
cancdiff
group
by
casno
order
by
casno;
quit;

proc
print
data=
bychemn;
var
casno
diff1a
diff2a
midpt1
midpt2;
label
casno
=
'
Chemical
CAS
Number'
98
98
diff1a
=
'
Avoided
Cases
(
opt1)'
diff2a
=
'
Avoided
Cases
(
opt2)'
midpt1
=
'
Midpoint
Benefits
(
opt1)'
midpt2
=
'
Midpoint
Benefits
(
opt2)';
title3
'
Benefits
by
Chemical
Casno
($
2001)';
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
99
99
Program
Output
100
100
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Drinking
Water
Cancer
(
Sub
6)
13:
03
Friday,
November
29,
2002
Average
Lifetime
Cancer
Risk
The
MEANS
Procedure
Variable
N
Mean
Std
Dev
Minimum
Maximum
                                                                               
reachnmb
269
4742847484
447144365
4100001001
5140101002
rsk_
b
269
6.1656191E­
7
5.0390421E­
6
2.752697E­
17
0.000073563
rsk_
1
269
6.1656173E­
7
5.0390418E­
6
2.752697E­
17
0.000073563
rsk_
2
269
0
0
0
0
                                                                               
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Drinking
Water
Cancer
(
Sub
6)
13:
03
Friday,
November
29,
2002
Cancer
Case
estimates
The
MEANS
Procedure
Variable
Label
Sum
                                                
canc_
b
Cancer
cases
(
BL)
0.1026421
canc_
1
Cancer
cases
(
Opt
1)
0.1026420
canc_
2
Cancer
cases
(
Opt
2)
0
                                                
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Drinking
Water
Cancer
(
Sub
6)
13:
03
Friday,
November
29,
2002
Cancer
Exposed
Ohio
Population
The
MEANS
Procedure
Analysis
Variable
:
pop
Sum
            
7655812.34
            
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Drinking
Water
Cancer
(
Sub
6)
13:
03
Friday,
November
29,
2002
Monetized
Benefits
($
2001)

The
MEANS
Procedure
Variable
Label
Sum
                                                
diff1
Avoided
Cases
(
Opt1)
1.0413375E­
7
diff2
Avoided
Cases
(
Opt2)
0.1026421
mid1
Mid
Benefits
(
Opt1)
0.6768694
mid2
Mid
Benefits
(
Opt2)
667173.76
                                                
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Drinking
Water
Cancer
(
Sub
6)
13:
03
Friday,
November
29,
2002
Monetized
Benefits
($
2001)
by
Pollutant
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
123911
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

The
MEANS
Procedure
Variable
Label
Sum
                                                
diff1
Avoided
Cases
(
Opt1)
6.9683791E­
8
diff2
Avoided
Cases
(
Opt2)
0.000012583
mid1
Mid
Benefits
(
Opt1)
0.4529446
mid2
Mid
Benefits
(
Opt2)
81.7865005
                                                
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
62533
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
101
101
                                                
diff1
Avoided
Cases
(
Opt1)
1.8162008E­
8
diff2
Avoided
Cases
(
Opt2)
1.2854277E­
7
mid1
Mid
Benefits
(
Opt1)
0.1180531
mid2
Mid
Benefits
(
Opt2)
0.8355280
                                                
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
62759
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                                
diff1
Avoided
Cases
(
Opt1)
0
diff2
Avoided
Cases
(
Opt2)
0.1026288
mid1
Mid
Benefits
(
Opt1)
0
mid2
Mid
Benefits
(
Opt2)
667087.46
                                                
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
75003
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                                
diff1
Avoided
Cases
(
Opt1)
1.8720088E­
9
diff2
Avoided
Cases
(
Opt2)
2.517909E­
7
mid1
Mid
Benefits
(
Opt1)
0.0121681
mid2
Mid
Benefits
(
Opt2)
1.6366409
                                                
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
78591
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
Label
Sum
                                                
diff1
Avoided
Cases
(
Opt1)
1.3666778E­
9
diff2
Avoided
Cases
(
Opt2)
4.5410785E­
8
mid1
Mid
Benefits
(
Opt1)
0.0088834
mid2
Mid
Benefits
(
Opt2)
0.2951701
                                                
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Drinking
Water
Cancer
(
Sub
6)
13:
03
Friday,
November
29,
2002
Monetized
Benefits
($
2001)
by
Pollutant
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
CASNO=
86306
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

The
MEANS
Procedure
Variable
Label
Sum
                                                
diff1
Avoided
Cases
(
Opt1)
1.3049262E­
8
diff2
Avoided
Cases
(
Opt2)
2.6770383E­
7
mid1
Mid
Benefits
(
Opt1)
0.0848202
mid2
Mid
Benefits
(
Opt2)
1.7400749
                                                
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Drinking
Water
Cancer
(
Sub
6)
13:
03
Friday,
November
29,
2002
Benefits
by
Chemical
Casno
($
2001)

Obs
CASNO
diff1a
diff2a
midpt1
midpt2
1
123911
6.9684E­
8
0.00001
0.45294
81.79
2
62533
1.8162E­
8
0.00000
0.11805
0.84
3
62759
0
0.10263
0.00000
667087.46
4
75003
1.872E­
9
0.00000
0.01217
1.64
5
78591
1.3667E­
9
0.00000
0.00888
0.30
6
86306
1.3049E­
8
0.00000
0.08482
1.74
102
102
Systemic
Risk
from
Fish
Consumption
103
103
"
Create
Datasets
(
Sub1).
sas"
Generates
a
data
set
of
pollutant
loading
events
for
each
Ohio
RF1
reach
receiving
MP&
M
discharges.
See
Estimating
Ohio
MP&
M
Discharge
Loadings
for
program
code.
104
104
"
Human
Health
AWQC
(
Sub
2).
sas"
Calculates
in­
stream
pollutant
concentrations
and
generates
a
data
set
of
pollutant
concentrations
for
each
RF1
reach.
See
Cancer
from
Fish
Consumption
for
program
code
and
output
data
sets.
105
105
"
Systemic
Cancer
(
Sub
5).
sas"
Uses
the
data
set
of
pollutant
concentrations
for
each
RF1
reach
with
pollutant
specific
reference
doses
to
determine
systemic
risk.
106
106
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Systemic
Cancer
(
Sub
5).
sas
*/
/*
Author:
Stuart
Smith
*/
/*
Date:
04/
21/
2000
*/
/*
Updated:
11/
12/
2002
*/
/*

*/
/*
This
program
calculates
systemic
hazard
scores
for
fish
consumption.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Systemic
Cancer
(
Sub
5)';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
COUNTY
LEVEL
FISHING
LICENSE
DATA
*/
/*****************************************************************************/
/*
Load
fishing
license
data
here.
*/
/*
Sum
over
the
types
by
county.
*/
/*
Sum
over
the
counties
containing
a
ohio
reach.
*/

/*
Final
data
set
contains
reaches
with
the
total
possible
number
of
*/
/*
affected
anglers.
This
number
will
be
multiplied
by
the
ratio
*/
/*
of
reach
length
to
total
reach
miles
in
affected
counties
to
obtain
*/
/*
an
estimate
of
the
number
of
affected
anglers.
*/
/*****************************************************************************/

data
licens;
set
ohio.
fish_
lic;

fw_
lic
=
sum(
fw_
res,
fw_
reso,
fw_
sres,
fw_
smres,
fw_
dres,
trout,
fw_
life,
fw_
hunt1,
fw_
2hunt,
fw_
hunts,
fw_
hunt2,
fw_
salt1,
fw_
trout);
sw_
lic
=
sum(
fw_
salt1,
sw_
res,
sw_
dres);

if
fw_
lic=.
then
fw_
lic=
0;
if
sw_
lic=.
then
sw_
lic=
0;
cntyfip
=
fips;
107
107
keep
cntyfip
fw_
lic
sw_
lic;
run;

proc
sort
nodupkey
data=
licens;
by
cntyfip;
quit;

/*****************************************************************************/
/*
DETERMINE
COUNTIES
AFFECTED
BY
REACH
*/
/*****************************************************************************/

data
facs;
set
ohio.
fac_
info;
run;

proc
sort
data=
facs;
by
siteid;
quit;

data
cnty;
set
facs;

cntyfip1=
stco1;
cntyfip2=
stco2;
cntyfip3=
stco3;
cntyfip4=
stco4;
cntyfip5=
stco5;
cntyfip6=
stco6;
cntyfip7=
stco7;
cntyfip8=
stco8;

keep
reachnmb
cntyfip1­
cntyfip8;
run;

proc
sort
nodupkey
data=
cnty;
by
reachnmb;
quit;

proc
transpose
data=
cnty
out=
cnty2;
by
reachnmb;
var
cntyfip1­
cntyfip8;
quit;

data
cnty3;
set
cnty2;
cntyfip
=
col1/
1;
if
cntyfip=.
then
delete;
keep
reachnmb
cntyfip;
run;

proc
sort
data=
cnty3;
by
cntyfip;
quit;

/*****************************************************************************/
/*
OBTAIN
REACH
MILES
BY
COUNTY
*/
/*****************************************************************************/

data
rchmile;
set
ohio.
us_
rchmi;
cntyfip=
fips;
keep
countymi
cntyfip;
run;

proc
sort
data=
rchmile;
by
cntyfip;
108
108
/*****************************************************************************/
/*
PULL
TOGETHER
OUR
REACHES
WITH
ASSOCIATED
COUNTIES
*/
/*****************************************************************************/

data
tot_
mile;
merge
cnty3
rchmile;
by
cntyfip;

if
reachnmb=.
then
delete;
run;

proc
sort
data=
tot_
mile;
by
reachnmb
cntyfip;
quit;

/*****************************************************************************/
/*
SUM
REACH
MILES
OVER
COUNTIES
CONTAINING
THE
SAME
REACH
*/
/*
FINISHED
DATA
SET
CONTAINS
TOTAL
NUMBER
OF
REACH
MILES
IN
*/
/*
COUNTIES
CONTAINING
A
GIVEN
REACH.
BRING
IN
THE
FISHING
*/
/*
LICNESE
DATA
BY
COUNTY.
*/
/*****************************************************************************/

proc
sql;

create
table
miles
as
select
tot_
mile.
reachnmb,
sum(
countymi)
as
denom,
min(
segl)
as
leng,
sum(
fw_
lic)
as
fwlictot,
sum(
sw_
lic)
as
swlictot
from
tot_
mile,
facs,
licens
where
tot_
mile.
reachnmb
=
facs.
reachnmb
and
tot_
mile.
cntyfip
=
licens.
cntyfip
group
by
tot_
mile.
reachnmb
order
by
tot_
mile.
reachnmb;
quit;

proc
sort
data=
miles;
by
reachnmb;
quit;

/*****************************************************************************/
/*
Merge
in
Fishing
Advisory
Data
with
County
mile
data
*/
/*****************************************************************************/

proc
sort
data=
ohio.
fishadv1;
by
reachnmb;
quit;

data
miles2;
merge
miles
ohio.
fishadv1;
by
reachnmb;

/*
Hard­
Wire
Statewide
Advisories
*/
if
st
=
'
MI'
or
st
=
'
NJ'
or
st
=
'
RI'
or
st
=
'
MS'
then
advisory
=
'
yes';

/*
Multiplier
for
20%
reduction
in
fishermen
due
to
advisory
*/
if
advisory
=
'
yes'
or
advisory
=
'
A­
yes'
then
advmult
=
0.80;
else
advmult
=
1.00;
run;
109
109
/*****************************************************************************/
/*
ESTIMATE
SPORT
AND
SUBSISTANCE
FISHING
POPULATIONS
*/
/*****************************************************************************/

data
pops;
set
miles2;
by
reachnmb;
if
first.
reachnmb;

/*
If
missing
the
percentage
of
water
miles
for
the
given
reach,
use
*/
/*
mean
vale
of
6%
(
0.06)
*/
/*
Average
family
size
is
assumed
to
be
2.62
persons
*/
/*
Subsistance
population
assumed
to
be
5%
(
0.05)
of
the
sport
pop.
*/

if
leng=.
then
fwspt
=
fwlictot*
0.06*
2.62*
advmult;
else
fwspt
=
fwlictot*(
leng/
denom)*
2.62*
advmult;
fwsub
=
0.05*
fwspt;

if
leng=.
then
swspt
=
swlictot*
0.06*
2.62*
advmult;
else
swspt
=
swlictot*(
leng/
denom)*
2.62*
advmult;
swsub
=
0.05*
swspt;

fwsptpop
=
round(
fwspt);
fwsubpop
=
round(
fwsub);
swsptpop
=
round(
swspt);
swsubpop
=
round(
swsub);

keep
reachnmb
fwsptpop
fwsubpop
swsptpop
swsubpop;
run;

proc
sort
data=
pops;
by
reachnmb;
quit;
proc
sort
data=
rundat.
cnc_
hh;
by
reachnmb;
quit;

/*****************************************************************************/
/*
MERGE
CONCENTRATION
DATA
BY
REACH
WITH
THE
NUMBER
OF
SPORT
AND
*/
/*
SUBSISTENCE
ANGLERS
*/
/*****************************************************************************/

data
canc;
merge
rundat.
cnc_
hh
pops;
by
reachnmb;

if
cnc_
base
=
.
or
cnc_
base
=
0
then
delete;
if
fwsptpop=.
then
delete;
run;

proc
sort
data=
canc;
by
reachnmb
casno
event_
wt;
quit;

/*****************************************************************************/
/*
BRING
IN
SLOPE
FACTOR,
REFERENCE
DOSE,
AND
BIOCONCENTRATION
FROM
CHEMDATA
*/
/*****************************************************************************/
110
110
proc
sql;

create
table
canc1
as
select
reachnmb,
canc.
casno,
cnc_
base
as
base,
cnc_
trt1
as
treat1,
cnc_
trt2
as
treat2,
fwsptpop,
fwsubpop,
swsptpop,
swsubpop,
slope_
fa
as
sf,
referenc
as
rfd,
bioconce
as
bcfval,
event_
wt
as
weight,
liver,
kidney,
eyes,
gastro,
bodywght,
central,
mort,
other
from
canc,
ohio.
chemdata
where
canc.
casno
=
chemdata.
casno
order
by
reachnmb,
canc.
casno,
weight;
quit;

/*****************************************************************************/
/*
ESTIMATE
SYSTEMIC
EQUATIONS
AND
CALCULATE
CANCER
RISK
DUE
TO
FISH
*/
/*
CONSUMPTION
*/
/*****************************************************************************/

data
canc2;
set
canc1;
if
bcfval
and
rfd;

/*
DEFINE
CONSTANTS
*/

cf1
=
0.001;
/*
conversion
milligrams
per
microgram
*/
cf2
=
365;
/*
conversion
365
days
per
year
*/
cr1
=
0.007;
/*
consumption
rate
1
child
:
7.27
(
rec.)
grams/
day
*/
cr2
=
0.017;
/*
consumption
rate
2
adult:
17.5
(
rec.)
grams/
day
*/
cr3
=
0.059;
/*
consumption
rate
3
child:
59.16
(
sub.)
grams/
day*/
cr4
=
0.142;
/*
consumption
rate
4
adult:
142.4
(
sub.)
grams/
day*/
ef
=
365;
/*
exposure
frequency:
365
days
per
year
*/
ed1
=
18;
/*
exposure
duration
1
child:
18
years
(
rec.)
*/
ed2
=
52;
/*
exposure
duration
2
adult:
52
years
(
rec.)
*/
ed3
=
18;
/*
exposure
duration
3
child:
18
years
(
sub.)
*/
ed4
=
52;
/*
exposure
duration
4
adult:
52
years
(
sub.)
*/
bw1
=
30;
/*
body
weight
1
child:
30
kg
*/
bw2
=
70;
/*
body
weight
2
adult:
70
kg
*/
lt
=
70;
/*
lifetime:
70
years
*/

/*
CALCULATE
SYSTEMIC
EFFECTS
*/

/*
base
values
*/
bsptrisk
=
(((
base
*
cf1
*
cr1
*
bcfval
*
ef
*
ed1)
/
(
bw1
*
lt
*
cf2))
+
((
base
*
cf1
*
cr2
*
bcfval
*
ef
*
ed2)
/
(
bw2
*
lt
*
cf2)))
/
rfd;

bsubrisk
=
(((
base
*
cf1
*
cr3
*
bcfval
*
ef
*
ed3)
/
(
bw1
*
lt
*
cf2))
+
((
base
*
cf1
*
cr4
*
bcfval
*
ef
*
ed4)
/
(
bw2
*
lt
*
cf2)))
/
rfd;

/*
treatment
values
*/
sptrisk1
=
(((
treat1
*
cf1
*
cr1
*
bcfval
*
ef
*
ed1)
/
(
bw1
*
lt
*
cf2))
+
((
treat1
*
cf1
*
cr2
*
bcfval
*
ef
*
ed2)
/
(
bw2
*
lt
*
cf2)))
/
rfd;
111
111
subrisk1
=
(((
treat1
*
cf1
*
cr3
*
bcfval
*
ef
*
ed3)
/
(
bw1
*
lt
*
cf2))
+
((
treat1
*
cf1
*
cr4
*
bcfval
*
ef
*
ed4)
/
(
bw2
*
lt
*
cf2)))
/
rfd;

sptrisk2
=
(((
treat2
*
cf1
*
cr1
*
bcfval
*
ef
*
ed1)
/
(
bw1
*
lt
*
cf2))
+
((
treat2
*
cf1
*
cr2
*
bcfval
*
ef
*
ed2)
/
(
bw2
*
lt
*
cf2)))
/
rfd;

subrisk2
=
(((
treat2
*
cf1
*
cr3
*
bcfval
*
ef
*
ed3)
/
(
bw1
*
lt
*
cf2))
+
((
treat2
*
cf1
*
cr4
*
bcfval
*
ef
*
ed4)
/
(
bw2
*
lt
*
cf2)))
/
rfd;

sptpop
=
fwsptpop
+
swsptpop;
subpop
=
fwsubpop
+
swsubpop;

format
bsptrisk
bsubrisk
sptrisk1
subrisk1
sptrisk2
subrisk2
e12.;
run;

data
canc3;
set
canc2;

type1
=
"
Liver";
type2="
Kidney";
type3="
Eyes";
type4="
Gastrointenstinal";
type5="
Body
weight";
type6="
Central
Nervous
System";
type7="
Mortality";
type8="
Other
Systemic
health";

array
cats[
8]
liver
kidney
eyes
gastro
bodywght
central
mort
other;
array
cat_
text[
8]
type1
type2
type3
type4
type5
type6
type7
type8;

do
i
=
1
to
8;
spthaz_
b
=
bsptrisk*
cats[
i];
subhaz_
b
=
bsubrisk*
cats[
i];
spthaz_
1
=
sptrisk1*
cats[
i];
subhaz_
1
=
subrisk1*
cats[
i];
spthaz_
2
=
sptrisk2*
cats[
i];
subhaz_
2
=
subrisk2*
cats[
i];
hlth_
cat
=
cat_
text[
i];
output;
end;
run;

/*****************************************************************************/
/*
Sum
hazard
scores
by
reach
and
event_
wt
(
summing
over
all
pollutants)
*/
/*****************************************************************************/

proc
sql;

create
table
hazard_
a
as
select
reachnmb,
min(
sptpop)
as
sptpopl,
min(
subpop)
as
subpopl,
weight
as
wght,
hlth_
cat,
sum(
spthaz_
b)
as
spthaz_
b,
sum(
subhaz_
b)
as
subhaz_
b,
sum(
spthaz_
1)
as
spthaz_
1,
sum(
subhaz_
1)
as
subhaz_
1,
sum(
spthaz_
2)
as
spthaz_
2,
sum(
subhaz_
2)
as
subhaz_
2
from
canc3
group
by
reachnmb,
weight,
hlth_
cat
order
by
reachnmb,
wght,
hlth_
cat;
112
112
create
table
hazard
as
select
reachnmb,
min(
sptpopl)
as
sptpopl,
min(
subpopl)
as
subpopl,
wght,
max(
spthaz_
b)
as
spthaz_
b,
max(
subhaz_
b)
as
subhaz_
b,
max(
spthaz_
1)
as
spthaz_
1,
max(
subhaz_
1)
as
subhaz_
1,
max(
spthaz_
2)
as
spthaz_
2,
max(
subhaz_
2)
as
subhaz_
2
from
hazard_
a
group
by
reachnmb,
wght
order
by
reachnmb,
wght;
quit;

data
haz1;
set
hazard;
format
spthaz_
b
subhaz_
b
spthaz_
1
subhaz_
1
spthaz_
2
subhaz_
2
e12.;
run;

/*****************************************************************************/
/*
Keep
hazard
ratios
for
use
in
creating
report
tables
*/
/*****************************************************************************/

data
rundat.
hazrats;
set
haz1;
run;

data
overb;
set
haz1;

if
spthaz_
b>
1
then
sptb
=
1;
else
sptb=
0;
if
subhaz_
b>
1
then
subb
=
1;
else
subb=
0;
if
spthaz_
1>
1
then
spt1
=
1;
else
spt1=
0;
if
subhaz_
1>
1
then
sub1
=
1;
else
sub1=
0;
if
spthaz_
2>
1
then
spt2
=
1;
else
spt2=
0;
if
subhaz_
2>
1
then
sub2
=
1;
else
sub2=
0;
run;

proc
means
sum
data=
overb;
weight
wght;
var
sptb
subb
spt1
sub1
spt2
sub2
sptpopl
subpopl;
title3
'
Number
of
Ohio
Reaches
with
Ratios
>
1';
label
sptb
=
'
Sport
(
BL)'
subb
=
'
Subsistence
(
BL)'
spt1
=
'
Sport
(
Opt
1)'
sub1
=
'
Subsistence
(
Opt
1)'
spt2
=
'
Sport
(
Opt
2)'
sub2
=
'
Subsistence
(
Opt
2)'
sptpopl
=
'
Exposed
Sport
Population'
subpopl
=
'
Exposed
Subsistence
Population';
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
113
113
/*****************************************************************************/
114
114
Program
Output
115
115
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Systemic
Cancer
(
Sub
5)
10:
29
Friday,
November
29,
2002
Number
of
Ohio
Reaches
with
Ratios
>
1
The
MEANS
Procedure
Variable
Label
Sum
                                                          
sptb
Sport
(
BL)
1.0000000
subb
Subsistence
(
BL)
2.0000000
spt1
Sport
(
Opt
1)
1.0000000
sub1
Subsistence
(
Opt
1)
2.0000000
spt2
Sport
(
Opt
2)
0
sub2
Subsistence
(
Opt
2)
0
sptpopl
Exposed
Sport
Population
119376.00
subpopl
Exposed
Subsistence
Population
5970.00
                                                          
116
116
Systemic
Risk
from
Drinking
Water
117
117
"
Create
Revised
Datasets
for
Brad
­
Final
(
No
GMs).
sas"
Generates
a
data
set
of
pollutant
loadings
discharged
to
Ohio
RF1
reaches
from
direct
dischargers
and
POTWs
(
with
removals)
for
the
water
quality
modeling
program.
See
Cancer
from
Drinking
Water
for
program
code.
118
118
Water
Quality
Modeling
Pollutant
in­
stream
concentrations
on
RF1
reaches
containing
drinking
water
intakes
downstream
from
MP&
M
facilities
and
POTWs
are
estimated
for
six
carcinogens
not
covered
by
EPA
drinking
water
criteria.
The
water
quality
model
used
is
the
Risk­
Screening
Environmental
Indicators
developed
for
the
EPA
OPPT
(
http://
www.
epa.
gov/
opptintr/
env_
ind/
index.
html).
See
DCN
37554.
119
119
"
Systemic
Cancer
Assoc
DW
(
Sub
14).
sas"
Data
from
the
water
quality
modeling
is
used
to
estimate
systemic
risk
using
pollutant
specific
reference
doses.
The
overall
hazard
ratio
for
each
RF1
reach
is
then
estimated.
120
120
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Systemic
Cancer
Assoc
DW
(
Sub
14).
sas
*/
/*
Author:
Stuart
Smith
*/
/*
Date:
05/
04/
2000
*/
/*
Updated:
11/
12/
2002
*/
/*

*/
/*
This
program
calculates
systemic
hazard
scores
for
drinking
water
*/
/*
consumption.
Only
reaches
with
intakes
on
them
are
evaluated.
Downstream
*/
/*
reaches
are
not
included
in
the
analysis.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Systemic
Cancer
Associated
with
DW
(
Sub
14)';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Load
concentrations
estimated
using
mean
flow
from
decay
model.
*/
/*****************************************************************************/

data
brad;
set
rundat.&
dwset;
if
intakect
>
0;

weight
=
1;

keep
reachnmb
intakect
casno
baseconc
t1conc
t2conc
weight
dwpop
siteid;
run;

proc
sort
data=
brad;
by
reachnmb
casno;
quit;

/*****************************************************************************/
/*
BRING
IN
SLOPE
FACTOR,
REFERENCE
DOSE,
AND
BIOCONCENTRATION
FROM
CHEMDATA*/
/*****************************************************************************/

proc
sql;

create
table
canc1
as
121
121
select
reachnmb,
brad.
casno,
baseconc
as
base,
t1conc
as
treat1,
t2conc
as
treat2,
dwpop,
slope_
fa
as
sf,
referenc
as
rfd,
bioconce
as
bcfval,
weight,
liver,
kidney,
eyes,
gastro,
bodywght,
central,
mort,
other
from
brad,
ohio.
chemdata
where
brad.
casno
=
chemdata.
casno
order
by
reachnmb,
brad.
casno,
weight;
quit;

/*****************************************************************************/
/*
ESTIMATE
SYSTEMIC
EQUATIONS
AND
CALCULATE
CANCER
RISK
DUE
TO
FISH
*/
/*
CONSUMPTION
*/
/*****************************************************************************/

data
canc2;
set
canc1;
if
rfd;

/*
DEFINE
CONSTANTS
*/

cf1
=
0.001;
/*
conversion
milligrams
per
microgram
*/
cf2
=
365;
/*
conversion:
day
per
year
*/
cr
=
1.24;
/*
consumption
rate:
liters
of
water
per
day
*/
ef
=
350;
/*
exposure
frequency:
350
days
per
year
*/
ed
=
70;
/*
exposure
duration:
70
years
*/
bw
=
70;
/*
body
weight:
70
kg
*/
lt
=
70;
/*
lifetime:
70
years
*/

/*
CALCULATE
SYSTEMIC
EFFECTS
*/

/*
Baseline
values
*/
brisk
=
((
base
*
cf1
*
cr
*
ef
*
ed)
/
(
bw
*
lt
*
cf2))
/
rfd;

/*
Treatment
values
*/
risk1
=
((
treat1
*
cf1
*
cr
*
ef
*
ed)
/
(
bw
*
lt
*
cf2))
/
rfd;

risk2
=
((
treat2
*
cf1
*
cr
*
ef
*
ed)
/
(
bw
*
lt
*
cf2))
/
rfd;

totpop
=
dwpop;

format
brisk
risk1
risk2
e12.;
run;

data
canc3;
set
canc2;

type1
=
"
Liver";
type2="
Kidney";
type3="
Eyes";
type4="
Gastrointenstinal";
type5="
Body
weight";
type6="
Central
Nervous
System";
type7="
Mortality";
type8="
Other
Systemic
health";

array
cats[
8]
liver
kidney
eyes
gastro
bodywght
central
mort
other;
array
cat_
text[
8]
type1
type2
type3
type4
type5
type6
type7
type8;
122
122
do
i
=
1
to
8;
hazdb
=
brisk*
cats[
i];
hazd1
=
risk1*
cats[
i];
hazd2
=
risk2*
cats[
i];
hlth_
cat
=
cat_
text[
i];
output;
end;
run;

/*****************************************************************************/
/*
Sum
hazard
scores
by
reach
and
event_
wt
(
summing
over
all
pollutants)
*/
/*****************************************************************************/

proc
sql;

create
table
hazard_
a
as
select
reachnmb,
avg(
totpop)
as
pop,
weight
as
wght,
hlth_
cat,
sum(
hazdb)
as
haz_
b,
sum(
hazd1)
as
haz_
1,
sum(
hazd2)
as
haz_
2
from
canc3
group
by
reachnmb,
weight,
hlth_
cat
order
by
reachnmb,
wght;

create
table
hazard
as
select
reachnmb,
min(
pop)
as
pop,
min(
wght)
as
wght,
max(
haz_
b)
as
haz_
b,
max(
haz_
1)
as
haz_
1,
max(
haz_
2)
as
haz_
2
from
hazard_
a
group
by
reachnmb,
wght
order
by
reachnmb,
wght;
quit;

data
haz1;
set
hazard;
format
haz_
b
haz_
1
haz_
2
e12.;
run;

/*****************************************************************************/
/*
Keep
hazard
ratios
*/
/*****************************************************************************/

data
rundat.
dwhazrat;
set
haz1;
run;

data
overb;
set
haz1;

if
haz_
b>
1
then
ovrb
=
1;
else
ovrb=
0;
if
haz_
1>
1
then
ovr1
=
1;
else
ovr1=
0;
123
123
if
haz_
2>
1
then
ovr2
=
1;
else
ovr2=
0;
run;

proc
means
sum
data=
overb;
weight
wght;
var
ovrb
ovr1
ovr2;
title3
'
Number
of
Ohio
Reaches
with
Ratios
>
1';
label
ovrb
=
'
Baseline
(
BL)'
ovr1
=
'
Option
1
(
Opt1)'
ovr2
=
'
Option
2
(
Opt2)';
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
124
124
Program
Output
125
125
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Systemic
Cancer
Associated
with
DW
(
Sub
14)
10:
29
Friday,
November
29,
2002
Number
of
Ohio
Reaches
with
Ratios
>
1
The
MEANS
Procedure
Variable
Label
Sum
                                           
ovrb
Baseline
(
BL)
1.0000000
ovr1
Option
1
(
Opt1)
1.0000000
ovr2
Option
2
(
Opt2)
1.0000000
                                           
126
126
Lead
Benefits
for
Adults
127
127
"
Cancer­
fish
(
Sub
4).
sas"
From
the
data
set
of
pollutant
concentrations
for
each
RF1
reach,
observations
for
in­
stream
lead
concentrations
are
outputed
into
a
separate
data
set.
See
Cancer
from
Fish
Consumption
for
program
code.
128
128
"
Lead
Benefits
(
Sub
12).
sas"
Using
data
from
the
lead
specific
data
set,
changes
in
blood
lead
levels
are
estimated
and
benefits
calculated
for
reductions
in
cases
of
hypertension,
CHD,
brain
infarctions,
and
mortality
for
recreational
fishermen
and
their
families.
129
129
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Lead
Benefits
(
Sub
12)
­
New
Output.
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
07/
05/
2000
*/
/*
Updated:
11/
12/
2002
*/
/*

*/
/*
This
program
estimates
benefits
from
reduced
consumption
of
fish
tissue
*/
/*
containing
lead.
Reductions
in
MP&
M
facility
lead
loadings
result
in
*/
/*
lower
probabilties
of
lead
related
illnesses.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Lead
Related
Benefits
Recreational
(
Sub
12)';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

data
lead;
set
rundat.
lead;

/*****************************************************************************/
/*
Combine
the
exposed
populations
recreational
populations,
fresh
and
*/
/*
saltwater
*/
/*****************************************************************************/

exppop
=
fwsptpop
+
swsptpop;

/*****************************************************************************/
/*
Calculate
the
blood
lead
levels
under
the
baseline
and
post
compliance
*/
/*
scenarios
*/
/*****************************************************************************/

PbB0m
=
4.55;
/*
Typical
PbB
conc.
in
absence
of
fish
cons.
for
men
*/
PbB0f
=
3.45;
/*
Typical
PbB
conc.
in
absence
of
fish
cons.
for
women
*/
bcf
=
49;
/*
Bioconcentration
factor
for
lead
L/
KG
*/
bksf
=
0.4;
/*
Biokinetic
slope
factor
for
lead
*/
ingm
=
17.5;
/*
Average
daily
fish
consumption
(
g/
day)
males
age
15­
44
*/
ingf
=
17.5;
/*
Average
daily
fish
consumption
(
g/
day)
females
age
15­
44
*/
ingm2
=
17.5;
/*
Average
daily
fish
consumption
(
g/
day)
males
over
age
45
*/
130
130
ingf2
=
17.5;
/*
Average
daily
fish
consumption
(
g/
day)
females
over
age
45*/
af
=
0.03;
/*
Absorbtion
factor
*/
ef
=
365;
/*
Exposure
Frequency
*/
at
=
365;
/*
Average
timing,
or
duration
of
exposure
in
days
*/
cf
=
0.001;
/*
Conversion
factor
kg/
g
*/

/*
Uses
ingestion
for
males
ages
15­
44
*/
PbB_
bm
=
PbB0m
+
((
cnc_
base*
bcf*
ingm*
af*
bksf*
ef*
cf)/
at);
PbB_
1m
=
PbB0m
+
((
cnc_
trt1*
bcf*
ingm*
af*
bksf*
ef*
cf)/
at);
PbB_
2m
=
PbB0m
+
((
cnc_
trt2*
bcf*
ingm*
af*
bksf*
ef*
cf)/
at);

/*
Uses
ingestion
for
males
ages
45
and
older
*/
PbB_
bme
=
PbB0m
+
((
cnc_
base*
bcf*
ingm2*
af*
bksf*
ef*
cf)/
at);
PbB_
1me
=
PbB0m
+
((
cnc_
trt1*
bcf*
ingm2*
af*
bksf*
ef*
cf)/
at);
PbB_
2me
=
PbB0m
+
((
cnc_
trt2*
bcf*
ingm2*
af*
bksf*
ef*
cf)/
at);

/*
Uses
ingestion
for
females
ages
15­
44
*/
PbB_
bf
=
PbB0f
+
((
cnc_
base*
bcf*
ingf*
af*
bksf*
ef*
cf)/
at);
PbB_
1f
=
PbB0f
+
((
cnc_
trt1*
bcf*
ingf*
af*
bksf*
ef*
cf)/
at);
PbB_
2f
=
PbB0f
+
((
cnc_
trt2*
bcf*
ingf*
af*
bksf*
ef*
cf)/
at);

/*
Uses
ingestion
for
females
ages
45
and
older
*/
PbB_
bfe
=
PbB0f
+
((
cnc_
base*
bcf*
ingf2*
af*
bksf*
ef*
cf)/
at);
PbB_
1fe
=
PbB0f
+
((
cnc_
trt1*
bcf*
ingf2*
af*
bksf*
ef*
cf)/
at);
PbB_
2fe
=
PbB0f
+
((
cnc_
trt2*
bcf*
ingf2*
af*
bksf*
ef*
cf)/
at);

drop
fwsptpop
fwsubpop
swsptpop
swsubpop;
run;

data
men;
set
lead;

/*
Set
up
some
constants
*/
/*
All
percentages
based
on
the
2000
Census
numbers
*/

pctmale
=
0.319518;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
20­
74
*/
pctm4054
=
0.098405;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
40­
54
*/
pctm4059
=
0.118945;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
40­
59
*/
pctm4574
=
0.12933;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
45­
74
*/
pctm5564
=
0.03829;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
55­
64
*/
pctm6064
=
0.01775;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
60­
64
*/
pctm6574
=
0.031427;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
65­
74
*/

bbpm4054
=
79.9;
/*
Mean
diastolic
bp
from
NHANES
III,
males,
age
40­
54
*/
bbpm4059
=
80.0;
/*
Mean
diastolic
bp
from
NHANES
III,
males,
age
40­
59
*/
bbpm4574
=
78.8;
/*
Mean
diastolic
bp
from
NHANES
III,
males,
age
45­
74
*/
bbpm5564
=
79.0;
/*
Mean
diastolic
bp
from
NHANES
III,
males,
age
55­
64
*/
bbpm6064
=
77.8;
/*
Mean
diastolic
bp
from
NHANES
III,
males
age
60­
64
*/
bbpm6574
=
76.4;
/*
Mean
diastolic
bp
from
NHANES
III,
males
age
65­
74
*/

/*****************************************************************************/
/*
Begin
Benefits
for
Males
*/
131
131
/*****************************************************************************/

/*****************************************************************************/
/*
Calculate
the
change
in
the
probability
of
hypertension
*/
/*****************************************************************************/

pr_
hyp1
=
(
1/(
1
+
exp(
2.744
­
0.793*
log(
PbB_
bm))))
­
(
1/(
1
+
exp(
2.744
­
0.793*
log(
PbB_
1m))));

pr_
hyp2
=
(
1/(
1
+
exp(
2.744
­
0.793*
log(
PbB_
bm))))
­
(
1/(
1
+
exp(
2.744
­
0.793*
log(
PbB_
2m))));

ben_
hyp1
=
pr_
hyp1
*
exppop
*
pctmale
*
1141;
ben_
hyp2
=
pr_
hyp2
*
exppop
*
pctmale
*
1141;
hyppop
=
exppop
*
pctmale;
hyp_
red1
=
pr_
hyp1
*
exppop
*
pctmale;
hyp_
red2
=
pr_
hyp2
*
exppop
*
pctmale;

/*****************************************************************************/
/*
Calculate
Benefits
from
Changes
in
CHD,
non­
fatal
cases
only,
which
*/
/*
are
2/
3
of
the
cases
*/
/*****************************************************************************/

dbpm1
=
1.4
*
log(
PbB_
bm/
PbB_
1m);
/*
Change
in
bp
under
option
1
*/
dbpm2
=
1.4
*
log(
PbB_
bm/
PbB_
2m);
/*
Change
in
bp
under
option
2
*/

dbpm1e
=
1.4
*
log(
PbB_
bme/
PbB_
1me);
/*
Change
in
bp
under
option
1
*/
dbpm2e
=
1.4
*
log(
PbB_
bme/
PbB_
2me);
/*
Change
in
bp
under
option
2
*/

/*
Ages
40­
59,
change
in
the
10
year
prob
of
occ.
*/
d1m4059
=
bbpm4059
­
dbpm1;
d2m4059
=
bbpm4059
­
dbpm2;

pr1_
4059
=
(
1/(
1
+
exp(
4.996
­
0.030365*
bbpm4059)))
­
(
1/(
1
+
exp(
4.996
­
0.030365*
d1m4059)));

pr2_
4059
=
(
1/(
1
+
exp(
4.996
­
0.030365*
bbpm4059)))
­
(
1/(
1
+
exp(
4.996
­
0.030365*
d2m4059)));

/*
Ages
60­
64,
change
in
the
2
year
prob
of
occ.
*/
d1m6064
=
bbpm6064
­
dbpm1e;
d2m6064
=
bbpm6064
­
dbpm2e;

pr1_
6064
=
(
1/(
1
+
exp(
5.19676
­
0.02351*
bbpm6064)))
­
(
1/(
1
+
exp(
5.19676
­
0.02351*
d1m6064)));

pr2_
6064
=
(
1/(
1
+
exp(
5.19676
­
0.02351*
bbpm6064)))
­
(
1/(
1
+
exp(
5.19676
­
0.02351*
d2m6064)));

/*
Ages
65­
74,
change
in
the
2
year
prob
of
occ.
*/
d1m6574
=
bbpm6574
­
dbpm1e;
d2m6574
=
bbpm6574
­
dbpm2e;
132
132
pr1_
6574
=
(
1/(
1
+
exp(
4.90723
­
0.02031*
bbpm6574)))
­
(
1/(
1
+
exp(
4.90723
­
0.02031*
d1m6574)));

pr2_
6574
=
(
1/(
1
+
exp(
4.90723
­
0.02031*
bbpm6574)))
­
(
1/(
1
+
exp(
4.90723
­
0.02031*
d2m6574)));

b14059
=
(
pr1_
4059
*
exppop
*
pctm4059
*
76347
*
0.66)/
10;
b24059
=
(
pr2_
4059
*
exppop
*
pctm4059
*
76347
*
0.66)/
10;
b16064
=
(
pr1_
6064
*
exppop
*
pctm6064
*
76347
*
0.66)/
2;
b26064
=
(
pr2_
6064
*
exppop
*
pctm6064
*
76347
*
0.66)/
2;
b16574
=
(
pr1_
6574
*
exppop
*
pctm6574
*
76347
*
0.66)/
2;
b26574
=
(
pr2_
6574
*
exppop
*
pctm6574
*
76347
*
0.66)/
2;

/*****************************************************************************/
/*
Number
of
reduced
cases
*/
/*
*/
/*
Multiply
by
the
2/
3
(.
66)
and
divide
by
the
years
of
*/
/*
occurance
associated
with
the
probability
to
get
cases
*/
/*
for
one
year.
*/
/*****************************************************************************/

r14059
=
(
pr1_
4059
*
exppop
*
pctm4059
*
0.66)/
10;
r24059
=
(
pr2_
4059
*
exppop
*
pctm4059
*
0.66)/
10;
r16064
=
(
pr1_
6064
*
exppop
*
pctm6064
*
0.66)/
2;
r26064
=
(
pr2_
6064
*
exppop
*
pctm6064
*
0.66)/
2;
r16574
=
(
pr1_
6574
*
exppop
*
pctm6574
*
0.66)/
2;
r26574
=
(
pr2_
6574
*
exppop
*
pctm6574
*
0.66)/
2;

/*****************************************************************************/
/*
Calculate
the
exposed
populations
at
each
age
group
*/
/*****************************************************************************/

popm4059
=
exppop
*
pctm4059;
popm6064
=
exppop
*
pctm6064;
popm6574
=
exppop
*
pctm6574;

/*****************************************************************************/
/*
Calculate
Benefits
from
Reduced
Cerebrovascular
Accidents
and
Brain
*/
/*
Infarctions,
affects
men
aged
45­
74
*/
/*
Non­
fatal
only,
which
is
70%
of
all
cases
*/
/*****************************************************************************/

/*
Ages
45­
74,
change
in
the
2
year
prob
of
occ.
*/
d1m4574
=
bbpm4574
­
dbpm1e;
d2m4574
=
bbpm4574
­
dbpm2e;

pr1_
cba
=
(
1/(
1
+
exp(
8.58889
­
0.04066*
bbpm4574)))
­
(
1/(
1
+
exp(
8.58889
­
0.04066*
d1m4574)));

pr2_
cba
=
(
1/(
1
+
exp(
8.58889
­
0.04066*
bbpm4574)))
­
(
1/(
1
+
exp(
8.58889
­
0.04066*
d2m4574)));
133
133
pr1_
bi
=
(
1/(
1
+
exp(
9.9516
­
0.04840*
bbpm4574)))
­
(
1/(
1
+
exp(
9.9516
­
0.04840*
d1m4574)));

pr2_
bi
=
(
1/(
1
+
exp(
9.9516
­
0.04840*
bbpm4574)))
­
(
1/(
1
+
exp(
9.9516
­
0.04840*
d2m4574)));

/*****************************************************************************/
/*
Number
of
reduced
cases
*/
/*
*/
/*
Multiply
by
the
70%
(.
7)
and
divide
by
the
years
of
*/
/*
occurance
associated
with
the
probability
to
get
cases
for
one
year.
*/
/*****************************************************************************/

b1_
cba
=
(
pr1_
cba
*
exppop
*
pctm4574
*
335135
*
0.7)/
2;
b2_
cba
=
(
pr2_
cba
*
exppop
*
pctm4574
*
335135
*
0.7)/
2;
b1_
bi
=
(
pr1_
bi
*
exppop
*
pctm4574
*
335135
*
0.7)/
2;
b2_
bi
=
(
pr2_
bi
*
exppop
*
pctm4574
*
335135
*
0.7)/
2;

r1_
cba
=
(
pr1_
cba
*
exppop
*
pctm4574
*
0.7)/
2;
r2_
cba
=
(
pr2_
cba
*
exppop
*
pctm4574
*
0.7)/
2;
r1_
bi
=
(
pr1_
bi
*
exppop
*
pctm4574
*
0.7)/
2;
r2_
bi
=
(
pr2_
bi
*
exppop
*
pctm4574
*
0.7)/
2;

/*
Calculate
the
exposed
population*/
popm4574
=
exppop
*
pctm4574;

/*****************************************************************************/
/*
Calculate
Benefits
from
Premature
Mortality
*/
/*****************************************************************************/

/*
Ages
40­
54,
change
in
the
12
year
prob
of
death
*/
d1m4054
=
bbpm4054
­
dbpm1;
d2m4054
=
bbpm4054
­
dbpm2;

m1_
4054
=
(
1/(
1
+
exp(
5.3158
­
0.03516*
bbpm4054)))
­
(
1/(
1
+
exp(
5.3158
­
0.03516*
d1m4054)));

m2_
4054
=
(
1/(
1
+
exp(
5.3158
­
0.03516*
bbpm4054)))
­
(
1/(
1
+
exp(
5.3158
­
0.03516*
d2m4054)));

/*
Ages
55­
64,
change
in
the
2
year
prob
of
death
*/
d1m5564
=
bbpm5564
­
dbpm1e;
d2m5564
=
bbpm5564
­
dbpm2e;

m1_
5564
=
(
1/(
1
+
exp(
4.89528
­
0.01866*
bbpm5564)))
­
(
1/(
1
+
exp(
4.89528
­
0.01866*
d1m5564)));

m2_
5564
=
(
1/(
1
+
exp(
4.89528
­
0.01866*
bbpm5564)))
­
(
1/(
1
+
exp(
4.89528
­
0.01866*
d2m5564)));
134
134
/*
Ages
65­
74,
change
in
the
2
year
prob
of
death
*/
d1m6574
=
bbpm6574
­
dbpm1e;
d2m6574
=
bbpm6574
­
dbpm2e;

m1_
6574
=
(
1/(
1
+
exp(
3.05723
­
0.00547*
bbpm6574)))
­
(
1/(
1
+
exp(
3.05723
­
0.00547*
d1m6574)));

m2_
6574
=
(
1/(
1
+
exp(
3.05723
­
0.00547*
bbpm6574)))
­
(
1/(
1
+
exp(
3.05723
­
0.00547*
d2m6574)));

/*****************************************************************************/
/*
Number
of
reduced
cases
and
Benefits
*/
/*

*/
/*
Divide
by
the
years
of
occurance
associated
with
the
probability
to
get
*/
/*
cases
for
one
year.
*/
/*****************************************************************************/

m14054l
=
(
m1_
4054
*
exppop
*
pctm4054
*
2500000)/
12;
m24054l
=
(
m2_
4054
*
exppop
*
pctm4054
*
2500000)/
12;
m14054h
=
(
m1_
4054
*
exppop
*
pctm4054
*
13600000)/
12;
m24054h
=
(
m2_
4054
*
exppop
*
pctm4054
*
13600000)/
12;
mid40541
=
(
m1_
4054
*
exppop
*
pctm4054
*
6500000)/
12;
mid40542
=
(
m2_
4054
*
exppop
*
pctm4054
*
6500000)/
12;

m15564l
=
(
m1_
5564
*
exppop
*
pctm5564
*
2500000)/
2;
m25564l
=
(
m2_
5564
*
exppop
*
pctm5564
*
2500000)/
2;
m15564h
=
(
m1_
5564
*
exppop
*
pctm5564
*
13600000)/
2;
m25564h
=
(
m2_
5564
*
exppop
*
pctm5564
*
13600000)/
2;
mid55641
=
(
m1_
5564
*
exppop
*
pctm5564
*
6500000)/
2;
mid55642
=
(
m2_
5564
*
exppop
*
pctm5564
*
6500000)/
2;

m16574l
=
(
m1_
6574
*
exppop
*
pctm6574
*
2500000)/
2;
m26574l
=
(
m2_
6574
*
exppop
*
pctm6574
*
2500000)/
2;
m16574h
=
(
m1_
6574
*
exppop
*
pctm6574
*
13600000)/
2;
m26574h
=
(
m2_
6574
*
exppop
*
pctm6574
*
13600000)/
2;
mid65741
=
(
m1_
6574
*
exppop
*
pctm6574
*
6500000)/
2;
mid65742
=
(
m2_
6574
*
exppop
*
pctm6574
*
6500000)/
2;

r14054l
=
(
m1_
4054
*
exppop
*
pctm4054)/
12;
r24054l
=
(
m2_
4054
*
exppop
*
pctm4054)/
12;
r14054h
=
(
m1_
4054
*
exppop
*
pctm4054)/
12;
r24054h
=
(
m2_
4054
*
exppop
*
pctm4054)/
12;
r15564l
=
(
m1_
5564
*
exppop
*
pctm5564)/
2;
r25564l
=
(
m2_
5564
*
exppop
*
pctm5564)/
2;
r15564h
=
(
m1_
5564
*
exppop
*
pctm5564)/
2;
r25564h
=
(
m2_
5564
*
exppop
*
pctm5564)/
2;
r16574l
=
(
m1_
6574
*
exppop
*
pctm6574)/
2;
r26574l
=
(
m2_
6574
*
exppop
*
pctm6574)/
2;
r16574h
=
(
m1_
6574
*
exppop
*
pctm6574)/
2;
r26574h
=
(
m2_
6574
*
exppop
*
pctm6574)/
2;
135
135
/*
Calculate
the
exposed
populations
*/
popm4054
=
exppop
*
pctm4054;
popm5564
=
exppop
*
pctm5564;
run;

data
women;
set
lead;

/*
Set
up
some
constants
*/
/*
All
percentages
based
on
the
2000
Census
numbers
*/
pctfem
=
0.511735;
/*
Percentage
of
U.
S.
Pop.
who
are
female
*/
pctf4574
=
0.143282;
/*
Percentage
of
U.
S.
Pop.
who
are
female,
age
45­
74
*/

bbpf4574
=
74.8;
/*
Mean
diastolic
bp
from
NHANES
III,
females
age
45­
74
*/

/*****************************************************************************/
/*
Begin
Benefits
for
Females
*/
/*****************************************************************************/

/*****************************************************************************/
/*
No
dose­
response
function
for
female
hypertension
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Calculate
Benefits
from
Changes
in
CHD,
non­
fatal
cases
only
which
*/
/*
are
2/
3
of
the
cases
*/
/*****************************************************************************/

dbpf1
=
(
0.6
*
1.4)
*
log(
PbB_
bfe/
PbB_
1fe);
/*
Change
in
bp
under
option
1
*/
dbpf2
=
(
0.6
*
1.4)
*
log(
PbB_
bfe/
PbB_
2fe);
/*
Change
in
bp
under
option
2
*/

/*
Ages
45­
74,
change
in
the
2
year
prob
of
occ.
*/
d1f4574
=
bbpf4574
­
dbpf1;
d2f4574
=
bbpf4574
­
dbpf2;

pr1_
4574
=
(
1/(
1
+
exp(
6.9401
­
0.03072*
bbpf4574)))
­
(
1/(
1
+
exp(
6.9401
­
0.03072*
d1f4574)));

pr2_
4574
=
(
1/(
1
+
exp(
6.9401
­
0.03072*
bbpf4574)))
­
(
1/(
1
+
exp(
6.9401
­
0.03072*
d2f4574)));

b1fchd
=
(
pr1_
4574
*
exppop
*
pctf4574
*
76347
*
0.66)/
2;
b2fchd
=
(
pr2_
4574
*
exppop
*
pctf4574
*
76347
*
0.66)/
2;

red_
chd1
=
(
pr1_
4574
*
exppop
*
pctf4574
*
0.66)/
2;
red_
chd2
=
(
pr2_
4574
*
exppop
*
pctf4574
*
0.66)/
2;

popf4574
=
exppop
*
pctf4574;

/*****************************************************************************/
136
136
/*
Calculate
Benefits
from
Reduced
Cerebrovascular
Accidents
and
Brain
*/
/*
Infarctions,
affects
women
aged
45­
74
*/
/*
Non­
fatal
only
which
is
70%
of
all
cases
*/
/*****************************************************************************/

/*
Ages
45­
74,
change
in
the
2
year
prob
of
occ.
*/

pr1f_
bi
=
(
1/(
1
+
exp(
10.6716
­
0.0544*
bbpf4574)))
­
(
1/(
1
+
exp(
10.6716
­
0.0544*
d1f4574)));

pr2f_
bi
=
(
1/(
1
+
exp(
10.6716
­
0.0544*
bbpf4574)))
­
(
1/(
1
+
exp(
10.6716
­
0.0544*
d2f4574)));

pr1f_
cba
=
(
1/(
1
+
exp(
9.07737
­
0.04287*
bbpf4574)))
­
(
1/(
1
+
exp(
9.07737
­
0.04287*
d1f4574)));

pr2f_
cba
=
(
1/(
1
+
exp(
9.07737
­
0.04287*
bbpf4574)))
­
(
1/(
1
+
exp(
9.07737
­
0.04287*
d2f4574)));

b1f_
cba
=
(
pr1f_
cba
*
exppop
*
pctf4574
*
251351
*
0.7)/
2;
b2f_
cba
=
(
pr2f_
cba
*
exppop
*
pctf4574
*
251351
*
0.7)/
2;
b1f_
bi
=
(
pr1f_
bi
*
exppop
*
pctf4574
*
251351
*
0.7)/
2;
b2f_
bi
=
(
pr2f_
bi
*
exppop
*
pctf4574
*
251351
*
0.7)/
2;

r1f_
cba
=
(
pr1f_
cba
*
exppop
*
pctf4574
*
0.7)/
2;
r2f_
cba
=
(
pr2f_
cba
*
exppop
*
pctf4574
*
0.7)/
2;
r1f_
bi
=
(
pr1f_
bi
*
exppop
*
pctf4574
*
0.7)/
2;
r2f_
bi
=
(
pr2f_
bi
*
exppop
*
pctf4574
*
0.7)/
2;

/*
Calculate
Benefits
from
Premature
Mortality
*/

/*
Ages
45­
74,
change
in
the
2
year
prob
of
death
*/

m1_
4574
=
(
1/(
1
+
exp(
5.40374
­
0.01511*
bbpf4574)))
­
(
1/(
1
+
exp(
5.40374
­
0.01511*
d1f4574)));

m2_
4574
=
(
1/(
1
+
exp(
5.40374
­
0.01511*
bbpf4574)))
­
(
1/(
1
+
exp(
5.40374
­
0.01511*
d2f4574)));

m14574l
=
(
m1_
4574
*
exppop
*
pctf4574
*
2500000)/
2;
m24574l
=
(
m2_
4574
*
exppop
*
pctf4574
*
2500000)/
2;
m14574h
=
(
m1_
4574
*
exppop
*
pctf4574
*
13600000)/
2;
m24574h
=
(
m2_
4574
*
exppop
*
pctf4574
*
13600000)/
2;
mid45741
=
(
m1_
4574
*
exppop
*
pctf4574
*
6500000)/
2;
mid45742
=
(
m2_
4574
*
exppop
*
pctf4574
*
6500000)/
2;

r14574l
=
(
m1_
4574
*
exppop
*
pctf4574)/
2;
r24574l
=
(
m2_
4574
*
exppop
*
pctf4574)/
2;
r14574h
=
(
m1_
4574
*
exppop
*
pctf4574)/
2;
r24574h
=
(
m2_
4574
*
exppop
*
pctf4574)/
2;
run;
137
137
/*
Sum
benefits
and
cases
and
print
out
results
*/

proc
means
sum
data=
men;
weight
event_
wt;
var
ben_
hyp1
ben_
hyp2
hyppop
b14059
b24059
b16064
b26064
b16574
b26574
popm4059
popm6064
popm6574
b1_
cba
b2_
cba
b1_
bi
b2_
bi
popm4574
m14054l
m14054h
m24054l
m24054h
m15564l
m15564h
m25564l
m25564h
m16574l
m16574h
m26574l
m26574h
mid40541
mid40542
mid55641
mid55642
mid65741
mid65742
popm4054
popm5564
hyp_
red1
hyp_
red2
r14059
r24059
r16064
r26064
r16574
r26574
r1_
cba
r2_
cba
r1_
bi
r2_
bi
r14054l
r24054l
r15564l
r25564l
r16574l
r26574l;
output
out
=
rundat.
msptwght(
drop
=
_
type_
_
freq_)
sum
=
ben_
hyp1
ben_
hyp2
hyppop
b14059
b24059
b16064
b26064
b16574
b26574
popm4059
popm6064
popm6574
b1_
cba
b2_
cba
b1_
bi
b2_
bi
popm4574
m14054l
m14054h
m24054l
m24054h
m15564l
m15564h
m25564l
m25564h
m16574l
m16574h
m26574l
m26574h
mid40541
mid40542
mid55641
mid55642
mid65741
mid65742
popm4054
popm5564
hyp_
red1
hyp_
red2
r14059
r24059
r16064
r26064
r16574
r26574
r1_
cba
r2_
cba
r1_
bi
r2_
bi
r14054l
r24054l
r15564l
r25564l
r16574l
r26574l;
title3
'
Mens
Lead
Related
Benefits
($
2001)';
quit;

/*****************************************************************************/
/*
Macro
for
building
an
output
table
of
lead
benefits
for
males
*/
/*****************************************************************************/

%
macro
maleleadtable(
tbl_
in=,
tbl_
out=);
data
rundat.&
tbl_
out
(
keep=
gender
categ
agecat
type
case1
ben1l
ben1m
ben1h
case2
ben2l
ben2m
ben2h);
set
rundat.&
tbl_
in;

length
gender
$
50
categ
$
50
agecat
$
50
type
$
50;

array
_
hyper[
4]
ben_
hyp1
ben_
hyp2
hyp_
red1
hyp_
red2;
array
_
chd[
12]
b14059
b24059
b16064
b26064
b16574
b26574
r14059
r24059
r16064
r26064
r16574
r26574;
array
_
cba[
4]
b1_
cba
b2_
cba
r1_
cba
r2_
cba;
array
_
bi[
4]
b1_
bi
b2_
bi
r1_
bi
r2_
bi;
138
138
array
_
mort[
24]
m14054l
mid40541
m14054h
m24054l
mid40542
m24054h
m15564l
mid55641
m15564h
m25564l
mid55642
m25564h
m16574l
mid65741
m16574h
m26574l
mid65742
m26574h
r14054l
r24054l
r15564l
r25564l
r16574l
r26574l;
array
ben[
6]
ben1l
ben1m
ben1h
ben2l
ben2m
ben2h;
array
cases[
2]
case1
case2;

do
i
=
1
to
9;
if
i
=
1
then
do;
ben[
1]
=
_
hyper[
1];
ben[
2]
=
_
hyper[
1];
ben[
3]
=
_
hyper[
1];
ben[
4]
=
_
hyper[
2];
ben[
5]
=
_
hyper[
2];
ben[
6]
=
_
hyper[
2];
cases[
1]
=
_
hyper[
3];
cases[
2]
=
_
hyper[
4];
categ
=
"
Hypertension";
agecat
=
"
All";
type
=
"
Sport";
gender
=
"
Male";
output;
end;
if
i
=
2
then
do;
ben[
1]
=
_
chd[
1];
ben[
2]
=
_
chd[
1];
ben[
3]
=
_
chd[
1];
ben[
4]
=
_
chd[
2];
ben[
5]
=
_
chd[
2];
ben[
6]
=
_
chd[
2];
cases[
1]
=
_
chd[
7];
cases[
2]
=
_
chd[
8];
categ
=
"
CHD";
agecat
=
"
Age
40­
59";
type
=
"
Sport";
gender
=
"
Male";
output;
end;
if
i
=
3
then
do;
ben[
1]
=
_
chd[
3];
ben[
2]
=
_
chd[
3];
ben[
3]
=
_
chd[
3];
ben[
4]
=
_
chd[
4];
ben[
5]
=
_
chd[
4];
ben[
6]
=
_
chd[
4];
cases[
1]
=
_
chd[
9];
cases[
2]
=
_
chd[
10];
categ
=
"
CHD";
agecat
=
"
Age
60­
64";
type
=
"
Sport";
gender
=
"
Male";
output;
end;
if
i
=
4
then
do;
ben[
1]
=
_
chd[
5];
ben[
2]
=
_
chd[
5];
ben[
3]
=
_
chd[
5];
ben[
4]
=
_
chd[
6];
ben[
5]
=
_
chd[
6];
ben[
6]
=
_
chd[
6];
cases[
1]
=
_
chd[
11];
cases[
2]
=
_
chd[
12];
categ
=
"
CHD";
agecat
=
"
Age
65­
74";
type
=
"
Sport";
gender
=
"
Male";
output;
end;
if
i
=
5
then
do;
ben[
1]
=
_
cba[
1];
ben[
2]
=
_
cba[
1];
ben[
3]
=
_
cba[
1];
139
139
ben[
4]
=
_
cba[
2];
ben[
5]
=
_
cba[
2];
ben[
6]
=
_
cba[
2];
cases[
1]
=
_
cba[
3];
cases[
2]
=
_
cba[
4];
categ
=
"
CBA";
agecat
=
"
All";
type
=
"
Sport";
gender
=
"
Male";
output;
end;
if
i
=
6
then
do;
ben[
1]
=
_
bi[
1];
ben[
2]
=
_
bi[
1];
ben[
3]
=
_
bi[
1];
ben[
4]
=
_
bi[
2];
ben[
5]
=
_
bi[
2];
ben[
6]
=
_
bi[
2];
cases[
1]
=
_
bi[
3];
cases[
2]
=
_
bi[
4];
categ
=
"
BI";
agecat
=
"
All";
type
=
"
Sport";
gender
=
"
Male";
output;
end;
if
i
=
7
then
do;
ben[
1]
=
_
mort[
1];
ben[
2]
=
_
mort[
2];
ben[
3]
=
_
mort[
3];
ben[
4]
=
_
mort[
4];
ben[
5]
=
_
mort[
5];
ben[
6]
=
_
mort[
6];
cases[
1]
=
_
mort[
19];
cases[
2]
=
_
mort[
20];
categ
=
"
Mortality";
agecat
=
"
Age
40­
54";
type
=
"
Sport";
gender
=
"
Male";
output;
end;
if
i
=
8
then
do;
ben[
1]
=
_
mort[
7];
ben[
2]
=
_
mort[
8];
ben[
3]
=
_
mort[
9];
ben[
4]
=
_
mort[
10];
ben[
5]
=
_
mort[
11];
ben[
6]
=
_
mort[
12];
cases[
1]
=
_
mort[
21];
cases[
2]
=
_
mort[
22];
categ
=
"
Mortality";
agecat
=
"
Age
55­
64";
type
=
"
Sport";
gender
=
"
Male";
output;
end;
if
i
=
9
then
do;
ben[
1]
=
_
mort[
13];
ben[
2]
=
_
mort[
14];
ben[
3]
=
_
mort[
15];
ben[
4]
=
_
mort[
16];
ben[
5]
=
_
mort[
17];
ben[
6]
=
_
mort[
18];
cases[
1]
=
_
mort[
23];
cases[
2]
=
_
mort[
24];
categ
=
"
Mortality";
agecat
=
"
Age
65­
74";
type
=
"
Sport";
gender
=
"
Male";
output;
end;
end;
run;
%
mend;
140
140
/*****************************************************************************/
/*
Call
macro
to
build
male
benefits
table
*/
/*****************************************************************************/

%
maleleadtable(
tbl_
in=
msptwght,
tbl_
out=
tblmswgt);

proc
means
sum
data=
women;
weight
event_
wt;
var
b1fchd
b2fchd
popf4574
b1f_
cba
b2f_
cba
b1f_
bi
b2f_
bi
m14574l
m14574h
m24574l
m24574h
mid45741
mid45742
red_
chd1
red_
chd2
r1f_
cba
r2f_
cba
r1f_
bi
r2f_
bi
r14574l
r14574h
r24574l
r24574h;
output
out
=
rundat.
fsptwght(
drop
=
_
type_
_
freq_)
sum
=
b1fchd
b2fchd
popf4574
b1f_
cba
b2f_
cba
b1f_
bi
b2f_
bi
m14574l
m14574h
m24574l
m24574h
mid45741
mid45742
red_
chd1
red_
chd2
r1f_
cba
r2f_
cba
r1f_
bi
r2f_
bi
r14574l
r14574h
r24574l
r24574h;
title3
'
Female
Lead
Related
Benefits
($
2001)';
quit;

/*****************************************************************************/
/*
Macro
for
building
an
output
table
of
lead
benefits
for
females
*/
/*****************************************************************************/

%
macro
femaleleadtable(
tbl_
in=,
tbl_
out=);
data
rundat.&
tbl_
out
(
keep=
gender
categ
agecat
type
case1
ben1l
ben1m
ben1h
case2
ben2l
ben2m
ben2h);
set
rundat.&
tbl_
in;

length
gender
$
50
categ
$
50
agecat
$
50
type
$
50;

array
_
chd[
4]
b1fchd
b2fchd
red_
chd1
red_
chd2;
array
_
cba[
4]
b1f_
cba
b2f_
cba
r1f_
cba
r2f_
cba;
array
_
bi[
4]
b1f_
bi
b2f_
bi
r1f_
bi
r2f_
bi;
array
_
mort[
8]
m14574l
mid45741
m14574h
m24574l
mid45742
m24574h
r14574l
r24574l;
array
ben[
6]
ben1l
ben1m
ben1h
ben2l
ben2m
ben2h;
array
cases[
2]
case1
case2;

do
i
=
1
to
4;
if
i
=
1
then
do;
ben[
1]
=
_
chd[
1];
ben[
2]
=
_
chd[
1];
ben[
3]
=
_
chd[
1];
ben[
4]
=
_
chd[
2];
ben[
5]
=
_
chd[
2];
ben[
6]
=
_
chd[
2];
cases[
1]
=
_
chd[
3];
cases[
2]
=
_
chd[
4];
categ
=
"
CHD";
agecat
=
"
All";
type
=
"
Sport";
gender
=
"
Female";
141
141
output;
end;
if
i
=
2
then
do;
ben[
1]
=
_
cba[
1];
ben[
2]
=
_
cba[
1];
ben[
3]
=
_
cba[
1];
ben[
4]
=
_
cba[
2];
ben[
5]
=
_
cba[
2];
ben[
6]
=
_
cba[
2];
cases[
1]
=
_
cba[
3];
cases[
2]
=
_
cba[
4];
categ
=
"
CBA";
agecat
=
"
All";
type
=
"
Sport";
gender
=
"
Female";
output;
end;
if
i
=
3
then
do;
ben[
1]
=
_
bi[
1];
ben[
2]
=
_
bi[
1];
ben[
3]
=
_
bi[
1];
ben[
4]
=
_
bi[
2];
ben[
5]
=
_
bi[
2];
ben[
6]
=
_
bi[
2];
cases[
1]
=
_
bi[
3];
cases[
2]
=
_
bi[
4];
categ
=
"
BI";
agecat
=
"
All";
type
=
"
Sport";
gender
=
"
Female";
output;
end;
if
i
=
4
then
do;
ben[
1]
=
_
mort[
1];
ben[
2]
=
_
mort[
2];
ben[
3]
=
_
mort[
3];
ben[
4]
=
_
mort[
4];
ben[
5]
=
_
mort[
5];
ben[
6]
=
_
mort[
6];
cases[
1]
=
_
mort[
7];
cases[
2]
=
_
mort[
8];
categ
=
"
Mortality";
agecat
=
"
Age
45­
74";
type
=
"
Sport";
gender
=
"
Female";
output;
end;
end;
run;
%
mend;

/*****************************************************************************/
/*
Call
macro
to
build
female
benefits
table
*/
/*****************************************************************************/

%
femaleleadtable(
tbl_
in=
fsptwght,
tbl_
out=
tblfswgt);

data
rundat.
tblspt_
w;
set
rundat.
tblmswgt
rundat.
tblfswgt;
run;

proc
means
sum
data=
men;
var
event_
wt;
title3
'
Number
of
Affected
Ohio
Reaches';
quit;

proc
sql;
142
142
create
table
malepop
as
select
sum(
exppop)
as
tpops,
sum(
exppop*
pctmale)
as
pm2074s,
sum(
exppop*
pctm4574)
as
pm4574s,
sum(
exppop*
event_
wt)
as
tpopn,
sum(
exppop*
pctmale*
event_
wt)
as
pm2074n,
sum(
exppop*
pctm4574*
event_
wt)
as
pm4574n
from
men;

create
table
fempop
as
select
sum(
exppop)
as
tpops,
sum(
exppop*
pctf4574)
as
pf4574s,
sum(
exppop*
event_
wt)
as
tpopn,
sum(
exppop*
pctf4574*
event_
wt)
as
pf4574n
from
women;
quit;

proc
print
data=
malepop;
var
tpopn
pm2074n
pm4574n;
label
tpopn
=
'
Total
Exposed
Pop
(
male
+
fem)'
pm2074n
=
'
Exposed
Males
Age
20­
74'
pm4574n
=
'
Exposed
Males
Age
45­
74';
title3
'
Exposed
Population
­
Males';
quit;

proc
print
data=
fempop;
var
tpopn
pf4574n;
label
tpopn
=
'
Total
Exposed
Pop
(
male
+
fem)'
pf4574n
=
'
Exposed
Females
Age
45­
74';
title3
'
Exposed
Population
­
Females';
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
143
143
Program
Output
144
144
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Lead
Related
Benefits
Recreational
(
Sub
12)
10:
29
Friday,
November
29,
2002
Mens
Lead
Related
Benefits
($
2001)

The
MEANS
Procedure
Variable
Sum
                        
ben_
hyp1
8051.38
ben_
hyp2
31925.96
hyppop
3096.13
b14059
315.1183523
b24059
1241.20
b16064
88.5661310
b26064
348.8973914
b16574
137.0295229
b26574
539.8708025
popm4059
1152.58
popm6064
171.9975000
popm6574
304.5276300
b1_
cba
732.2457604
b2_
cba
2882.76
b1_
bi
412.4025971
b2_
bi
1623.13
popm4574
1253.21
m14054l
13137.06
m14054h
71465.63
m24054l
51737.80
m24054h
281453.61
m15564l
7158.29
m15564h
38941.09
m25564l
28203.77
m25564h
153428.50
m16574l
3499.00
m16574h
19034.55
m26574l
13792.26
m26574h
75029.88
mid40541
34156.37
mid40542
134518.27
mid55641
18611.55
mid55642
73329.80
mid65741
9097.39
mid65742
35859.87
popm4054
953.5444500
popm5564
371.0301000
hyp_
red1
7.0564250
hyp_
red2
27.9806808
r14059
0.0041274
r24059
0.0162573
r16064
0.0011600
r26064
0.0045699
r16574
0.0017948
r26574
0.0070713
r1_
cba
0.0021849
r2_
cba
0.0086018
r1_
bi
0.0012306
r2_
bi
0.0048432
r14054l
0.0052548
r24054l
0.0206951
r15564l
0.0028633
r25564l
0.0112815
r16574l
0.0013996
r26574l
0.0055169
                        
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Lead
Related
Benefits
Recreational
(
Sub
12)
10:
29
Friday,
November
29,
2002
Female
Lead
Related
Benefits
($
2001)

The
MEANS
Procedure
145
145
Variable
Sum
                        
b1fchd
213.5946775
b2fchd
838.7782252
popf4574
1388.40
b1f_
cba
308.6889590
b2f_
cba
1211.80
b1f_
bi
188.8955856
b2f_
bi
741.3050500
m14574l
7477.51
m14574h
40677.67
m24574l
29376.11
m24574h
159806.04
mid45741
19441.53
mid45742
76377.88
red_
chd1
0.0027977
red_
chd2
0.0109864
r1f_
cba
0.0012281
r2f_
cba
0.0048212
r1f_
bi
0.000751521
r2f_
bi
0.0029493
r14574l
0.0029910
r14574h
0.0029910
r24574l
0.0117504
r24574h
0.0117504
                        
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Lead
Related
Benefits
Recreational
(
Sub
12)
10:
29
Friday,
November
29,
2002
Number
of
Affected
Ohio
Reaches
The
MEANS
Procedure
Analysis
Variable
:
EVENT_
WT
Sum
            
4.0000000
            
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Lead
Related
Benefits
Recreational
(
Sub
12)
10:
29
Friday,
November
29,
2002
Exposed
Population
­
Males
Obs
tpopn
pm2074n
pm4574n
1
9690
3096.13
1253.21
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Lead
Related
Benefits
Recreational
(
Sub
12)
10:
29
Friday,
November
29,
2002
Exposed
Population
­
Females
Obs
tpopn
pf4574n
1
9690
1388.40
146
146
"
Subsistence
Lead
Benefits
(
Sub
17).
sas"
Using
data
from
the
lead
specific
data
set,
changes
in
blood
lead
levels
are
estimated
and
benefits
calculated
for
reductions
in
cases
of
hypertension,
CHD,
brain
infarctions,
and
mortality
for
subsistence
fishermen
and
their
families.
147
147
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Subsistence
Lead
Benefits
(
Sub
17)
­
New
Output.
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
07/
11/
2000
*/
/*
Updated:
08/
27/
2002
*/
/*

*/
/*
This
program
estimates
benefits
from
reduced
consumption
of
fish
tissue
*/
/*
containing
lead.
Reductions
in
MP&
M
facility
lead
loadings
result
in
lower*/
/*
probabilties
of
lead
related
illnesses.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Subsistence
Lead
Related
Benefits
(
Sub
17)';

/*****************************************************************************/
/*
Set
pathname
macro
for
excel
benefits
spreadsheet
*/
/*
Maps
to
the
results
libname
set
in
the
main
program
*/
/*****************************************************************************/

%
let
tbl_
path
=
%
sysfunc(
pathname(
results));

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

data
lead;
set
rundat.
lead;

/*****************************************************************************/
/*
Combine
the
exposed
populations
for
subsistence;
fresh
and
saltwater.
*/
/*****************************************************************************/

exppop
=
fwsubpop
+
swsubpop;

/*****************************************************************************/
/*
Calculate
the
blood
lead
levels
under
the
baseline
and
post
compliance
*/
/*
scenarios
*/
/*****************************************************************************/

PbB0m
=
5.40;
/*
Typical
PbB
conc.
in
absence
of
fish
cons.
for
men
*/
PbB0f
=
4.12;
/*
Typical
PbB
conc.
in
absence
of
fish
cons.
for
women
*/
148
148
bcf
=
49;
/*
Bioconcentration
factor
for
lead
L/
KG
*/
bksf
=
0.4;
/*
Biokinetic
slope
factor
for
lead
*/
ingm
=
142.4;
/*
Average
daily
fish
consumption
(
g/
day)
males
age
15­
44
*/
ingf
=
142.4;
/*
Average
daily
fish
consumption
(
g/
day)
females
age
15­
44
*/
ingm2
=
142.4;
/*
Average
daily
fish
consumption
(
g/
day)
males
over
age
45
*/
ingf2
=
142.4;
/*
Average
daily
fish
consumption
(
g/
day)
females
over
age
45*/
af
=
0.03;
/*
Absorbtion
factor
*/
ef
=
365;
/*
Exposure
Frequency
*/
at
=
365;
/*
Average
timing,
or
duration
of
exposure
in
days
*/
cf
=
0.001;
/*
Conversion
factor
kg/
g
*/

/*
Uses
ingestion
for
males
ages
15­
44
*/
PbB_
bm
=
PbB0m
+
((
cnc_
base*
bcf*
ingm*
af*
bksf*
ef*
cf)/
at);
PbB_
1m
=
PbB0m
+
((
cnc_
trt1*
bcf*
ingm*
af*
bksf*
ef*
cf)/
at);
PbB_
2m
=
PbB0m
+
((
cnc_
trt2*
bcf*
ingm*
af*
bksf*
ef*
cf)/
at);

/*
Uses
ingestion
for
males
over
age
45
*/
PbB_
bme
=
PbB0m
+
((
cnc_
base*
bcf*
ingm2*
af*
bksf*
ef*
cf)/
at);
PbB_
1me
=
PbB0m
+
((
cnc_
trt1*
bcf*
ingm2*
af*
bksf*
ef*
cf)/
at);
PbB_
2me
=
PbB0m
+
((
cnc_
trt2*
bcf*
ingm2*
af*
bksf*
ef*
cf)/
at);

/*
Uses
ingestion
for
females
ages
15­
44
*/
PbB_
bf
=
PbB0f
+
((
cnc_
base*
bcf*
ingf*
af*
bksf*
ef*
cf)/
at);
PbB_
1f
=
PbB0f
+
((
cnc_
trt1*
bcf*
ingf*
af*
bksf*
ef*
cf)/
at);
PbB_
2f
=
PbB0f
+
((
cnc_
trt2*
bcf*
ingf*
af*
bksf*
ef*
cf)/
at);

/*
Uses
ingestion
for
females
over
age
45
*/
PbB_
bfe
=
PbB0f
+
((
cnc_
base*
bcf*
ingf2*
af*
bksf*
ef*
cf)/
at);
PbB_
1fe
=
PbB0f
+
((
cnc_
trt1*
bcf*
ingf2*
af*
bksf*
ef*
cf)/
at);
PbB_
2fe
=
PbB0f
+
((
cnc_
trt2*
bcf*
ingf2*
af*
bksf*
ef*
cf)/
at);

drop
fwsptpop
fwsubpop
swsptpop
swsubpop;
run;

/*
Print
reaches
in
the
lead
dataset
*/
proc
print;
var
reachnmb
PbB_
bm
PbB_
1m
PbB_
2m
cnc_
base
cnc_
trt1
cnc_
trt2
exppop
event_
wt;
quit;

data
men;
set
lead;

/*
Set
up
some
constants
*/
/*
All
percentages
based
on
the
2000
Census
numbers
*/

pctmale
=
0.319518;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
20­
74
*/
pctm4054
=
0.098405;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
40­
54
*/
pctm4059
=
0.118945;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
40­
59
*/
pctm4574
=
0.12933;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
45­
74
*/
pctm5564
=
0.03829;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
55­
64
*/
149
149
pctm6064
=
0.01775;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
60­
64
*/
pctm6574
=
0.031427;
/*
Percentage
of
U.
S.
Pop.
who
are
male,
age
65­
74
*/

bbpm4054
=
81.9;
/*
Mean
diastolic
bp
from
NHANES
III,
males,
age
40­
54
*/
bbpm4059
=
81.8;
/*
Mean
diastolic
bp
from
NHANES
III,
males,
age
40­
59
*/
bbpm4574
=
81.1;
/*
Mean
diastolic
bp
from
NHANES
III,
males,
age
45­
74
*/
bbpm5564
=
80.6;
/*
Mean
diastolic
bp
from
NHANES
III,
males,
age
55­
64
*/
bbpm6064
=
79.5;
/*
Mean
diastolic
bp
from
NHANES
III,
males
age
60­
64
*/
bbpm6574
=
79.5;
/*
Mean
diastolic
bp
from
NHANES
III,
males
age
65­
74
*/

/*****************************************************************************/
/*
Begin
Benefits
for
Males
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Calculate
the
change
in
the
probability
of
hypertension
*/
/*****************************************************************************/

pr_
hyp1
=
(
1/(
1
+
exp(
2.744
­
0.793*
log(
PbB_
bm))))
­
(
1/(
1
+
exp(
2.744
­
0.793*
log(
PbB_
1m))));

pr_
hyp2
=
(
1/(
1
+
exp(
2.744
­
0.793*
log(
PbB_
bm))))
­
(
1/(
1
+
exp(
2.744
­
0.793*
log(
PbB_
2m))));

ben_
hyp1
=
pr_
hyp1
*
exppop
*
pctmale
*
1141;
ben_
hyp2
=
pr_
hyp2
*
exppop
*
pctmale
*
1141;
hyppop
=
exppop
*
pctmale;
hyp_
red1
=
pr_
hyp1
*
exppop
*
pctmale;
hyp_
red2
=
pr_
hyp2
*
exppop
*
pctmale;

/*****************************************************************************/
/*
Calculate
Benefits
from
Changes
in
CHD,
non­
fatal
cases
only
which
*/
/*
are
2/
3
of
the
cases
*/
/*****************************************************************************/

dbpm1
=
1.4
*
log(
PbB_
bm/
PbB_
1m);
/*
Change
in
bp
under
option
1
*/
dbpm2
=
1.4
*
log(
PbB_
bm/
PbB_
2m);
/*
Change
in
bp
under
option
2
*/

dbpm1e
=
1.4
*
log(
PbB_
bme/
PbB_
1me);
/*
Change
in
bp
under
option
1
*/
dbpm2e
=
1.4
*
log(
PbB_
bme/
PbB_
2me);
/*
Change
in
bp
under
option
2
*/

/*
Ages
40­
59,
change
in
the
10
year
prob
of
occ.
*/
d1m4059
=
bbpm4059
­
dbpm1;
d2m4059
=
bbpm4059
­
dbpm2;

pr1_
4059
=
(
1/(
1
+
exp(
4.996
­
0.030365*
bbpm4059)))
­
(
1/(
1
+
exp(
4.996
­
0.030365*
d1m4059)));

pr2_
4059
=
(
1/(
1
+
exp(
4.996
­
0.030365*
bbpm4059)))
­
(
1/(
1
+
exp(
4.996
­
0.030365*
d2m4059)));

/*
Ages
60­
64,
change
in
the
2
year
prob
of
occ.
*/
150
150
d1m6064
=
bbpm6064
­
dbpm1e;
d2m6064
=
bbpm6064
­
dbpm2e;

pr1_
6064
=
(
1/(
1
+
exp(
5.19676
­
0.02351*
bbpm6064)))
­
(
1/(
1
+
exp(
5.19676
­
0.02351*
d1m6064)));

pr2_
6064
=
(
1/(
1
+
exp(
5.19676
­
0.02351*
bbpm6064)))
­
(
1/(
1
+
exp(
5.19676
­
0.02351*
d2m6064)));

/*
Ages
65­
74,
change
in
the
2
year
prob
of
occ.
*/
d1m6574
=
bbpm6574
­
dbpm1e;
d2m6574
=
bbpm6574
­
dbpm2e;

pr1_
6574
=
(
1/(
1
+
exp(
4.90723
­
0.02031*
bbpm6574)))
­
(
1/(
1
+
exp(
4.90723
­
0.02031*
d1m6574)));

pr2_
6574
=
(
1/(
1
+
exp(
4.90723
­
0.02031*
bbpm6574)))
­
(
1/(
1
+
exp(
4.90723
­
0.02031*
d2m6574)));

b14059
=
(
pr1_
4059
*
exppop
*
pctm4059
*
76347
*
0.66)/
10;
b24059
=
(
pr2_
4059
*
exppop
*
pctm4059
*
76347
*
0.66)/
10;
b16064
=
(
pr1_
6064
*
exppop
*
pctm6064
*
76347
*
0.66)/
2;
b26064
=
(
pr2_
6064
*
exppop
*
pctm6064
*
76347
*
0.66)/
2;
b16574
=
(
pr1_
6574
*
exppop
*
pctm6574
*
76347
*
0.66)/
2;
b26574
=
(
pr2_
6574
*
exppop
*
pctm6574
*
76347
*
0.66)/
2;

/*
Number
of
reduced
cases
*/
r14059
=
(
pr1_
4059
*
exppop
*
pctm4059
*
0.66)/
10;
r24059
=
(
pr2_
4059
*
exppop
*
pctm4059
*
0.66)/
10;
r16064
=
(
pr1_
6064
*
exppop
*
pctm6064
*
0.66)/
2;
r26064
=
(
pr2_
6064
*
exppop
*
pctm6064
*
0.66)/
2;
r16574
=
(
pr1_
6574
*
exppop
*
pctm6574
*
0.66)/
2;
r26574
=
(
pr2_
6574
*
exppop
*
pctm6574
*
0.66)/
2;

popm4059
=
exppop
*
pctm4059;
popm6064
=
exppop
*
pctm6064;
popm6574
=
exppop
*
pctm6574;

/*****************************************************************************/
/*
Calculate
Benefits
from
Reduced
Cerebrovascular
Accidents
and
Brain
*/
/*
Infarctions,
affects
men
aged
45­
74
*/
/*
Non­
fatal
only
which
is
70%
of
all
cases
*/
/*****************************************************************************/

/*
Ages
45­
74,
change
in
the
2
year
prob
of
occ.
*/
d1m4574
=
bbpm4574
­
dbpm1e;
d2m4574
=
bbpm4574
­
dbpm2e;

pr1_
cba
=
(
1/(
1
+
exp(
8.58889
­
0.04066*
bbpm4574)))
­
(
1/(
1
+
exp(
8.58889
­
0.04066*
d1m4574)));

pr2_
cba
=
(
1/(
1
+
exp(
8.58889
­
0.04066*
bbpm4574)))
­
151
151
(
1/(
1
+
exp(
8.58889
­
0.04066*
d2m4574)));

pr1_
bi
=
(
1/(
1
+
exp(
9.9516
­
0.04840*
bbpm4574)))
­
(
1/(
1
+
exp(
9.9516
­
0.04840*
d1m4574)));

pr2_
bi
=
(
1/(
1
+
exp(
9.9516
­
0.04840*
bbpm4574)))
­
(
1/(
1
+
exp(
9.9516
­
0.04840*
d2m4574)));

b1_
cba
=
(
pr1_
cba
*
exppop
*
pctm4574
*
335135
*
0.7)/
2;
b2_
cba
=
(
pr2_
cba
*
exppop
*
pctm4574
*
335135
*
0.7)/
2;
b1_
bi
=
(
pr1_
bi
*
exppop
*
pctm4574
*
335135
*
0.7)/
2;
b2_
bi
=
(
pr2_
bi
*
exppop
*
pctm4574
*
335135
*
0.7)/
2;

r1_
cba
=
(
pr1_
cba
*
exppop
*
pctm4574
*
0.7)/
2;
r2_
cba
=
(
pr2_
cba
*
exppop
*
pctm4574
*
0.7)/
2;
r1_
bi
=
(
pr1_
bi
*
exppop
*
pctm4574
*
0.7)/
2;
r2_
bi
=
(
pr2_
bi
*
exppop
*
pctm4574
*
0.7)/
2;

popm4574
=
exppop
*
pctm4574;

/*****************************************************************************/
/*
Calculate
Benefits
from
Premature
Mortality
*/
/*****************************************************************************/

/*
Ages
40­
54,
change
in
the
12
year
prob
of
death
*/
d1m4054
=
bbpm4054
­
dbpm1;
d2m4054
=
bbpm4054
­
dbpm2;

m1_
4054
=
(
1/(
1
+
exp(
5.3158
­
0.03516*
bbpm4054)))
­
(
1/(
1
+
exp(
5.3158
­
0.03516*
d1m4054)));

m2_
4054
=
(
1/(
1
+
exp(
5.3158
­
0.03516*
bbpm4054)))
­
(
1/(
1
+
exp(
5.3158
­
0.03516*
d2m4054)));

/*
Ages
55­
64,
change
in
the
2
year
prob
of
death
*/
d1m5564
=
bbpm5564
­
dbpm1e;
d2m5564
=
bbpm5564
­
dbpm2e;

m1_
5564
=
(
1/(
1
+
exp(
4.89528
­
0.01866*
bbpm5564)))
­
(
1/(
1
+
exp(
4.89528
­
0.01866*
d1m5564)));

m2_
5564
=
(
1/(
1
+
exp(
4.89528
­
0.01866*
bbpm5564)))
­
(
1/(
1
+
exp(
4.89528
­
0.01866*
d2m5564)));

/*
Ages
65­
74,
change
in
the
2
year
prob
of
death
*/
d1m6574
=
bbpm6574
­
dbpm1e;
d2m6574
=
bbpm6574
­
dbpm2e;

m1_
6574
=
(
1/(
1
+
exp(
3.05723
­
0.00547*
bbpm6574)))
­
(
1/(
1
+
exp(
3.05723
­
0.00547*
d1m6574)));

m2_
6574
=
(
1/(
1
+
exp(
3.05723
­
0.00547*
bbpm6574)))
­
152
152
(
1/(
1
+
exp(
3.05723
­
0.00547*
d2m6574)));

m14054l
=
(
m1_
4054
*
exppop
*
pctm4054
*
2500000)/
12;
m24054l
=
(
m2_
4054
*
exppop
*
pctm4054
*
2500000)/
12;
m14054h
=
(
m1_
4054
*
exppop
*
pctm4054
*
13600000)/
12;
m24054h
=
(
m2_
4054
*
exppop
*
pctm4054
*
13600000)/
12;
mid40541
=
(
m1_
4054
*
exppop
*
pctm4054
*
6500000)/
12;
mid40542
=
(
m2_
4054
*
exppop
*
pctm4054
*
6500000)/
12;

m15564l
=
(
m1_
5564
*
exppop
*
pctm5564
*
2500000)/
2;
m25564l
=
(
m2_
5564
*
exppop
*
pctm5564
*
2500000)/
2;
m15564h
=
(
m1_
5564
*
exppop
*
pctm5564
*
13600000)/
2;
m25564h
=
(
m2_
5564
*
exppop
*
pctm5564
*
13600000)/
2;
mid55641
=
(
m1_
5564
*
exppop
*
pctm5564
*
6500000)/
2;
mid55642
=
(
m2_
5564
*
exppop
*
pctm5564
*
6500000)/
2;

m16574l
=
(
m1_
6574
*
exppop
*
pctm6574
*
2500000)/
2;
m26574l
=
(
m2_
6574
*
exppop
*
pctm6574
*
2500000)/
2;
m16574h
=
(
m1_
6574
*
exppop
*
pctm6574
*
13600000)/
2;
m26574h
=
(
m2_
6574
*
exppop
*
pctm6574
*
13600000)/
2;
mid65741
=
(
m1_
6574
*
exppop
*
pctm6574
*
6500000)/
2;
mid65742
=
(
m2_
6574
*
exppop
*
pctm6574
*
6500000)/
2;

r14054l
=
(
m1_
4054
*
exppop
*
pctm4054)/
12;
r24054l
=
(
m2_
4054
*
exppop
*
pctm4054)/
12;
r14054h
=
(
m1_
4054
*
exppop
*
pctm4054)/
12;
r24054h
=
(
m2_
4054
*
exppop
*
pctm4054)/
12;
r15564l
=
(
m1_
5564
*
exppop
*
pctm5564)/
2;
r25564l
=
(
m2_
5564
*
exppop
*
pctm5564)/
2;
r15564h
=
(
m1_
5564
*
exppop
*
pctm5564)/
2;
r25564h
=
(
m2_
5564
*
exppop
*
pctm5564)/
2;
r16574l
=
(
m1_
6574
*
exppop
*
pctm6574)/
2;
r26574l
=
(
m2_
6574
*
exppop
*
pctm6574)/
2;
r16574h
=
(
m1_
6574
*
exppop
*
pctm6574)/
2;
r26574h
=
(
m2_
6574
*
exppop
*
pctm6574)/
2;

popm4054
=
exppop
*
pctm4054;
popm5564
=
exppop
*
pctm5564;
run;

data
women;
set
lead;

/*
Set
up
some
constants
*/
/*
All
percentages
based
on
the
2000
Census
numbers
*/
pctfem
=
0.511735;
/*
Percentage
of
U.
S.
Pop.
who
are
female
*/
pctf4574
=
0.143282;
/*
Percentage
of
U.
S.
Pop.
who
are
female,
age
45­
74
*/

bbpf4574
=
76.5;
/*
Mean
diastolic
bp
from
NHANES
III,
females
age
45­
74
*/
153
153
/*****************************************************************************/
/*
Begin
Benefits
for
Females
*/
/*****************************************************************************/

/*****************************************************************************/
/*
No
dose­
response
function
for
female
hypertension
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Calculate
Benefits
from
Changes
in
CHD,
non­
fatal
cases
only
which
*/
/*
are
2/
3
of
the
cases
*/
/*****************************************************************************/

dbpf1
=
(
0.6
*
1.4)
*
log(
PbB_
bfe/
PbB_
1fe);
/*
Change
in
bp
under
option
1
*/
dbpf2
=
(
0.6
*
1.4)
*
log(
PbB_
bfe/
PbB_
2fe);
/*
Change
in
bp
under
option
2
*/

/*
Ages
45­
74,
change
in
the
2
year
prob
of
occ.
*/
d1f4574
=
bbpf4574
­
dbpf1;
d2f4574
=
bbpf4574
­
dbpf2;

pr1_
4574
=
(
1/(
1
+
exp(
6.9401
­
0.03072*
bbpf4574)))
­
(
1/(
1
+
exp(
6.9401
­
0.03072*
d1f4574)));

pr2_
4574
=
(
1/(
1
+
exp(
6.9401
­
0.03072*
bbpf4574)))
­
(
1/(
1
+
exp(
6.9401
­
0.03072*
d2f4574)));

b1fchd
=
(
pr1_
4574
*
exppop
*
pctf4574
*
76347
*
0.66)/
2;
b2fchd
=
(
pr2_
4574
*
exppop
*
pctf4574
*
76347
*
0.66)/
2;

red_
chd1
=
(
pr1_
4574
*
exppop
*
pctf4574
*
0.66)/
2;
red_
chd2
=
(
pr2_
4574
*
exppop
*
pctf4574
*
0.66)/
2;

popf4574
=
exppop
*
pctf4574;

/*****************************************************************************/
/*
Calculate
Benefits
from
Reduced
Cerebrovascular
Accidents
and
Brain
*/
/*
Infarctions,
affects
women
aged
45­
74
*/
/*
Non­
fatal
only
which
is
70%
of
all
cases
*/
/*****************************************************************************/

/*
Ages
45­
74,
change
in
the
2
year
prob
of
occ.
*/

pr1f_
bi
=
(
1/(
1
+
exp(
10.6716
­
0.0544*
bbpf4574)))
­
(
1/(
1
+
exp(
10.6716
­
0.0544*
d1f4574)));

pr2f_
bi
=
(
1/(
1
+
exp(
10.6716
­
0.0544*
bbpf4574)))
­
(
1/(
1
+
exp(
10.6716
­
0.0544*
d2f4574)));

pr1f_
cba
=
(
1/(
1
+
exp(
9.07737
­
0.04287*
bbpf4574)))
­
(
1/(
1
+
exp(
9.07737
­
0.04287*
d1f4574)));

pr2f_
cba
=
(
1/(
1
+
exp(
9.07737
­
0.04287*
bbpf4574)))
­
154
154
(
1/(
1
+
exp(
9.07737
­
0.04287*
d2f4574)));

b1f_
cba
=
(
pr1f_
cba
*
exppop
*
pctf4574
*
251351
*
0.7)/
2;
b2f_
cba
=
(
pr2f_
cba
*
exppop
*
pctf4574
*
251351
*
0.7)/
2;
b1f_
bi
=
(
pr1f_
bi
*
exppop
*
pctf4574
*
251351
*
0.7)/
2;
b2f_
bi
=
(
pr2f_
bi
*
exppop
*
pctf4574
*
251351
*
0.7)/
2;

r1f_
cba
=
(
pr1f_
cba
*
exppop
*
pctf4574
*
0.7)/
2;
r2f_
cba
=
(
pr2f_
cba
*
exppop
*
pctf4574
*
0.7)/
2;
r1f_
bi
=
(
pr1f_
bi
*
exppop
*
pctf4574
*
0.7)/
2;
r2f_
bi
=
(
pr2f_
bi
*
exppop
*
pctf4574
*
0.7)/
2;

/*
Calculate
Benefits
from
Premature
Mortality
*/

/*
Ages
45­
74,
change
in
the
2
year
prob
of
death
*/

m1_
4574
=
(
1/(
1
+
exp(
5.40374
­
0.01511*
bbpf4574)))
­
(
1/(
1
+
exp(
5.40374
­
0.01511*
d1f4574)));

m2_
4574
=
(
1/(
1
+
exp(
5.40374
­
0.01511*
bbpf4574)))
­
(
1/(
1
+
exp(
5.40374
­
0.01511*
d2f4574)));

m14574l
=
(
m1_
4574
*
exppop
*
pctf4574
*
2500000)/
2;
m24574l
=
(
m2_
4574
*
exppop
*
pctf4574
*
2500000)/
2;
m14574h
=
(
m1_
4574
*
exppop
*
pctf4574
*
13600000)/
2;
m24574h
=
(
m2_
4574
*
exppop
*
pctf4574
*
13600000)/
2;
mid45741
=
(
m1_
4574
*
exppop
*
pctf4574
*
6500000)/
2;
mid45742
=
(
m2_
4574
*
exppop
*
pctf4574
*
6500000)/
2;

r14574l
=
(
m1_
4574
*
exppop
*
pctf4574)/
2;
r24574l
=
(
m2_
4574
*
exppop
*
pctf4574)/
2;
r14574h
=
(
m1_
4574
*
exppop
*
pctf4574)/
2;
r24574h
=
(
m2_
4574
*
exppop
*
pctf4574)/
2;
run;

/*****************************************************************************/
/*
Sum
up
benefits
and
reduced
cases
and
print
results
*/
/*****************************************************************************/

proc
means
sum
data=
men;
weight
event_
wt;
var
ben_
hyp1
ben_
hyp2
hyppop
b14059
b24059
b16064
b26064
b16574
b26574
popm4059
popm6064
popm6574
b1_
cba
b2_
cba
b1_
bi
b2_
bi
popm4574
m14054l
m14054h
m24054l
m24054h
m15564l
m15564h
m25564l
m25564h
m16574l
m16574h
m26574l
m26574h
mid40541
mid40542
mid55641
mid55642
mid65741
mid65742
popm4054
popm5564
hyp_
red1
hyp_
red2
r14059
r24059
r16064
r26064
r16574
r26574
r1_
cba
r2_
cba
r1_
bi
r2_
bi
r14054l
r24054l
155
155
r15564l
r25564l
r16574l
r26574l;
output
out
=
rundat.
msubwght(
drop
=
_
type_
_
freq_)
sum
=
ben_
hyp1
ben_
hyp2
hyppop
b14059
b24059
b16064
b26064
b16574
b26574
popm4059
popm6064
popm6574
b1_
cba
b2_
cba
b1_
bi
b2_
bi
popm4574
m14054l
m14054h
m24054l
m24054h
m15564l
m15564h
m25564l
m25564h
m16574l
m16574h
m26574l
m26574h
mid40541
mid40542
mid55641
mid55642
mid65741
mid65742
popm4054
popm5564
hyp_
red1
hyp_
red2
r14059
r24059
r16064
r26064
r16574
r26574
r1_
cba
r2_
cba
r1_
bi
r2_
bi
r14054l
r24054l
r15564l
r25564l
r16574l
r26574l;
title3
'
Mens
Lead
Related
Benefits
($
2001)';
quit;

/*****************************************************************************/
/*
Macro
for
building
an
output
table
of
lead
benefits
for
males
*/
/*****************************************************************************/

%
macro
maleleadtable(
tbl_
in=,
tbl_
out=);
data
rundat.&
tbl_
out
(
keep=
gender
categ
agecat
type
case1
ben1l
ben1m
ben1h
case2
ben2l
ben2m
ben2h);
set
rundat.&
tbl_
in;

length
gender
$
50
categ
$
50
agecat
$
50
type
$
50;

array
_
hyper[
4]
ben_
hyp1
ben_
hyp2
hyp_
red1
hyp_
red2;
array
_
chd[
12]
b14059
b24059
b16064
b26064
b16574
b26574
r14059
r24059
r16064
r26064
r16574
r26574;
array
_
cba[
4]
b1_
cba
b2_
cba
r1_
cba
r2_
cba;
array
_
bi[
4]
b1_
bi
b2_
bi
r1_
bi
r2_
bi;
array
_
mort[
24]
m14054l
mid40541
m14054h
m24054l
mid40542
m24054h
m15564l
mid55641
m15564h
m25564l
mid55642
m25564h
m16574l
mid65741
m16574h
m26574l
mid65742
m26574h
r14054l
r24054l
r15564l
r25564l
r16574l
r26574l;
array
ben[
6]
ben1l
ben1m
ben1h
ben2l
ben2m
ben2h;
array
cases[
2]
case1
case2;

do
i
=
1
to
9;
if
i
=
1
then
do;
ben[
1]
=
_
hyper[
1];
ben[
2]
=
_
hyper[
1];
ben[
3]
=
_
hyper[
1];
ben[
4]
=
_
hyper[
2];
ben[
5]
=
_
hyper[
2];
ben[
6]
=
_
hyper[
2];
cases[
1]
=
_
hyper[
3];
cases[
2]
=
_
hyper[
4];
categ
=
"
Hypertension";
156
156
agecat
=
"
All";
type
=
"
Sub";
gender
=
"
Male";
output;
end;
if
i
=
2
then
do;
ben[
1]
=
_
chd[
1];
ben[
2]
=
_
chd[
1];
ben[
3]
=
_
chd[
1];
ben[
4]
=
_
chd[
2];
ben[
5]
=
_
chd[
2];
ben[
6]
=
_
chd[
2];
cases[
1]
=
_
chd[
7];
cases[
2]
=
_
chd[
8];
categ
=
"
CHD";
agecat
=
"
Age
40­
59";
type
=
"
Sub";
gender
=
"
Male";
output;
end;
if
i
=
3
then
do;
ben[
1]
=
_
chd[
3];
ben[
2]
=
_
chd[
3];
ben[
3]
=
_
chd[
3];
ben[
4]
=
_
chd[
4];
ben[
5]
=
_
chd[
4];
ben[
6]
=
_
chd[
4];
cases[
1]
=
_
chd[
9];
cases[
2]
=
_
chd[
10];
categ
=
"
CHD";
agecat
=
"
Age
60­
64";
type
=
"
Sub";
gender
=
"
Male";
output;
end;
if
i
=
4
then
do;
ben[
1]
=
_
chd[
5];
ben[
2]
=
_
chd[
5];
ben[
3]
=
_
chd[
5];
ben[
4]
=
_
chd[
6];
ben[
5]
=
_
chd[
6];
ben[
6]
=
_
chd[
6];
cases[
1]
=
_
chd[
11];
cases[
2]
=
_
chd[
12];
categ
=
"
CHD";
agecat
=
"
Age
65­
74";
type
=
"
Sub";
gender
=
"
Male";
output;
end;
if
i
=
5
then
do;
ben[
1]
=
_
cba[
1];
ben[
2]
=
_
cba[
1];
ben[
3]
=
_
cba[
1];
ben[
4]
=
_
cba[
2];
ben[
5]
=
_
cba[
2];
ben[
6]
=
_
cba[
2];
cases[
1]
=
_
cba[
3];
cases[
2]
=
_
cba[
4];
categ
=
"
CBA";
agecat
=
"
All";
type
=
"
Sub";
gender
=
"
Male";
output;
end;
if
i
=
6
then
do;
ben[
1]
=
_
bi[
1];
ben[
2]
=
_
bi[
1];
ben[
3]
=
_
bi[
1];
ben[
4]
=
_
bi[
2];
ben[
5]
=
_
bi[
2];
ben[
6]
=
_
bi[
2];
cases[
1]
=
_
bi[
3];
cases[
2]
=
_
bi[
4];
categ
=
"
BI";
agecat
=
"
All";
type
=
"
Sub";
157
157
gender
=
"
Male";
output;
end;
if
i
=
7
then
do;
ben[
1]
=
_
mort[
1];
ben[
2]
=
_
mort[
2];
ben[
3]
=
_
mort[
3];
ben[
4]
=
_
mort[
4];
ben[
5]
=
_
mort[
5];
ben[
6]
=
_
mort[
6];
cases[
1]
=
_
mort[
19];
cases[
2]
=
_
mort[
20];
categ
=
"
Mortality";
agecat
=
"
Age
40­
54";
type
=
"
Sub";
gender
=
"
Male";
output;
end;
if
i
=
8
then
do;
ben[
1]
=
_
mort[
7];
ben[
2]
=
_
mort[
8];
ben[
3]
=
_
mort[
9];
ben[
4]
=
_
mort[
10];
ben[
5]
=
_
mort[
11];
ben[
6]
=
_
mort[
12];
cases[
1]
=
_
mort[
21];
cases[
2]
=
_
mort[
22];
categ
=
"
Mortality";
agecat
=
"
Age
55­
64";
type
=
"
Sub";
gender
=
"
Male";
output;
end;
if
i
=
9
then
do;
ben[
1]
=
_
mort[
13];
ben[
2]
=
_
mort[
14];
ben[
3]
=
_
mort[
15];
ben[
4]
=
_
mort[
16];
ben[
5]
=
_
mort[
17];
ben[
6]
=
_
mort[
18];
cases[
1]
=
_
mort[
23];
cases[
2]
=
_
mort[
24];
categ
=
"
Mortality";
agecat
=
"
Age
65­
74";
type
=
"
Sub";
gender
=
"
Male";
output;
end;
end;
run;
%
mend;

/*****************************************************************************/
/*
Call
macro
to
build
male
benefits
table
*/
/*****************************************************************************/

%
maleleadtable(
tbl_
in=
msubwght,
tbl_
out=
tblmbwgt);

proc
means
sum
data=
women;
weight
event_
wt;
var
b1fchd
b2fchd
popf4574
b1f_
cba
b2f_
cba
b1f_
bi
b2f_
bi
m14574l
m14574h
m24574l
m24574h
mid45741
mid45742
red_
chd1
red_
chd2
r1f_
cba
r2f_
cba
r1f_
bi
r2f_
bi
r14574l
r14574h
r24574l
r24574h;
output
out
=
rundat.
fsubwght(
drop
=
_
type_
_
freq_)
sum
=
158
158
b1fchd
b2fchd
popf4574
b1f_
cba
b2f_
cba
b1f_
bi
b2f_
bi
m14574l
m14574h
m24574l
m24574h
mid45741
mid45742
red_
chd1
red_
chd2
r1f_
cba
r2f_
cba
r1f_
bi
r2f_
bi
r14574l
r14574h
r24574l
r24574h;
title3
'
Female
Lead
Related
Benefits
($
2001)';
quit;

/*****************************************************************************/
/*
Macro
for
building
an
output
table
of
lead
benefits
for
females
*/
/*****************************************************************************/

%
macro
femaleleadtable(
tbl_
in=,
tbl_
out=);
data
rundat.&
tbl_
out
(
keep=
gender
categ
agecat
type
case1
ben1l
ben1m
ben1h
case2
ben2l
ben2m
ben2h);
set
rundat.&
tbl_
in;

length
gender
$
50
categ
$
50
agecat
$
50
type
$
50;

array
_
chd[
4]
b1fchd
b2fchd
red_
chd1
red_
chd2;
array
_
cba[
4]
b1f_
cba
b2f_
cba
r1f_
cba
r2f_
cba;
array
_
bi[
4]
b1f_
bi
b2f_
bi
r1f_
bi
r2f_
bi;
array
_
mort[
8]
m14574l
mid45741
m14574h
m24574l
mid45742
m24574h
r14574l
r24574l;
array
ben[
6]
ben1l
ben1m
ben1h
ben2l
ben2m
ben2h;
array
cases[
2]
case1
case2;

do
i
=
1
to
4;
if
i
=
1
then
do;
ben[
1]
=
_
chd[
1];
ben[
2]
=
_
chd[
1];
ben[
3]
=
_
chd[
1];
ben[
4]
=
_
chd[
2];
ben[
5]
=
_
chd[
2];
ben[
6]
=
_
chd[
2];
cases[
1]
=
_
chd[
3];
cases[
2]
=
_
chd[
4];
categ
=
"
CHD";
agecat
=
"
All";
type
=
"
Sub";
gender
=
"
Female";
output;
end;
if
i
=
2
then
do;
ben[
1]
=
_
cba[
1];
ben[
2]
=
_
cba[
1];
ben[
3]
=
_
cba[
1];
ben[
4]
=
_
cba[
2];
ben[
5]
=
_
cba[
2];
ben[
6]
=
_
cba[
2];
cases[
1]
=
_
cba[
3];
cases[
2]
=
_
cba[
4];
categ
=
"
CBA";
agecat
=
"
All";
type
=
"
Sub";
gender
=
"
Female";
output;
end;
if
i
=
3
then
do;
ben[
1]
=
_
bi[
1];
ben[
2]
=
_
bi[
1];
ben[
3]
=
_
bi[
1];
ben[
4]
=
_
bi[
2];
ben[
5]
=
_
bi[
2];
ben[
6]
=
_
bi[
2];
159
159
cases[
1]
=
_
bi[
3];
cases[
2]
=
_
bi[
4];
categ
=
"
BI";
agecat
=
"
All";
type
=
"
Sub";
gender
=
"
Female";
output;
end;
if
i
=
4
then
do;
ben[
1]
=
_
mort[
1];
ben[
2]
=
_
mort[
2];
ben[
3]
=
_
mort[
3];
ben[
4]
=
_
mort[
4];
ben[
5]
=
_
mort[
5];
ben[
6]
=
_
mort[
6];
cases[
1]
=
_
mort[
7];
cases[
2]
=
_
mort[
8];
categ
=
"
Mortality";
agecat
=
"
Age
45­
74";
type
=
"
Sub";
gender
=
"
Female";
output;
end;
end;
run;
%
mend;

/*****************************************************************************/
/*
Call
macro
to
build
female
benefits
table
*/
/*****************************************************************************/

%
femaleleadtable(
tbl_
in=
fsubwght,
tbl_
out=
tblfbwgt);

data
rundat.
tblsub_
w;
set
rundat.
tblmbwgt
rundat.
tblfbwgt;
run;

proc
means
sum
data=
men;
var
event_
wt;
title3
'
Number
of
Affected
Ohio
Reaches';
quit;

proc
sql;

create
table
malepop
as
select
sum(
exppop)
as
tpops,
sum(
exppop*
pctmale)
as
pm2074s,
sum(
exppop*
pctm4574)
as
pm4574s,
sum(
exppop*
event_
wt)
as
tpopn,
sum(
exppop*
pctmale*
event_
wt)
as
pm2074n,
sum(
exppop*
pctm4574*
event_
wt)
as
pm4574n
from
men;

create
table
fempop
as
select
sum(
exppop)
as
tpops,
sum(
exppop*
pctf4574)
as
pf4574s,
sum(
exppop*
event_
wt)
as
tpopn,
sum(
exppop*
pctf4574*
event_
wt)
as
pf4574n
160
160
from
women;
quit;

proc
print
data=
malepop;
var
tpopn
pm2074n
pm4574n;
label
tpopn
=
'
Total
Exposed
Pop
(
male
+
fem)'
pm2074n
=
'
Exposed
Males
Age
20­
74'
pm4574n
=
'
Exposed
Males
Age
45­
74';
title3
'
Exposed
Population
­
Males';
quit;

proc
print
data=
fempop;
var
tpopn
pf4574n;
label
tpopn
=
'
Total
Exposed
Pop
(
male
+
fem)'
pf4574n
=
'
Exposed
Females
Age
45­
74';
title3
'
Exposed
Population
­
Females';
quit;

data
rundat.
leadtblw;
if
_
n_
=
1
then
do;
do
i
=
1
to
13;
set
rundat.
tblspt_
w
point
=
i;
output;
set
rundat.
tblsub_
w
point
=
i;
output;
end;
end;
run;

proc
summary
data=
rundat.
leadtblw
nway;
class
gender
categ;
var
case1
ben1l
ben1m
ben1h
case2
ben2l
ben2m
ben2h;
output
out
=
rundat.
leadsumw
(
drop=
_
type_
_
freq_)
sum
=
case1
ben1l
ben1m
ben1h
case2
ben2l
ben2m
ben2h;
run;

proc
summary
data=
rundat.
leadtblw;
var
ben1l
ben1m
ben1h
ben2l
ben2m
ben2h;
output
out
=
rundat.
ldallw
(
drop=
_
type_
_
freq_)
sum
=
ben1l
ben1m
ben1h
ben2l
ben2m
ben2h;
run;

/*****************************************************************************/
/*
Generate
a
data
set
of
lead
benefits
for
export
to
excel
*/
/*****************************************************************************/

data
exlleadw
(
keep=
titlecol
col1­
col10
label="
Adult
Lead
Benefits­
unweighted");
set
rundat.
leadsumw
rundat.
ldallw;
161
161
length
titlecol
$
50
col1
­
col10
$
128;

if
_
n_
=
1
then
do;
titlecol
=
"
Table:
Adult
Lead
Benefits,
Unweighted
Estimates";
output;
titlecol
=
&
thetitle;
output;
titlecol
=
"
";
output;
col3
=
"
Option
1";
col7
=
"
Option
2";
output;
col3
=
"
Reduced
Cases";
col4
=
"
Low";
col5
=
"
Mid";
col6
=
"
High";
col7
=
"
Reduced
Cases";
col8
=
"
Low";
col9
=
"
Mid";
col10
=
"
High";
output;
end;

if
_
n_
=
1
or
_
n_
=
6
then
do;
col1
=
gender;
end;

if
_
n_
=
10
then
do;
col1
=
"
Total";
end;

col2
=
trim(
categ);
col3
=
trim(
case1);
col4
=
trim(
ben1l);
col5
=
trim(
ben1m);
col6
=
trim(
ben1h);
col7
=
trim(
case2);
col8
=
trim(
ben2l);
col9
=
trim(
ben2m);
col10
=
trim(
ben2h);
output;
run;

/*****************************************************************************/
/*
Export
the
lead
benefits
data
set
as
an
excel
spreadsheet
*/
/*****************************************************************************/

proc
export
data
=
exlleadw
outfile
=
"&
tbl_
path\
Ohio
Adult
Lead.
xls"
dbms=
excel2000
replace;
run;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
162
162
Program
Output
163
163
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Subsistence
Lead
Related
Benefits
(
Sub
17)
10:
29
Friday,
November
29,
2002
Mens
Lead
Related
Benefits
($
2001)

The
MEANS
Procedure
Variable
Sum
                        
ben_
hyp1
2619.25
ben_
hyp2
10115.94
hyppop
154.6467120
b14059
88.3944989
b24059
336.6286642
b16064
24.6328686
b26064
93.8681953
b16574
38.9603563
b26574
148.5382645
popm4059
57.5693800
popm6064
8.5910000
popm6574
15.2106680
b1_
cba
214.3662977
b2_
cba
814.4805268
b1_
bi
122.7292504
b2_
bi
465.7184213
popm4574
62.5957200
m14054l
3729.13
m14054h
20286.45
m24054l
14192.98
m24054h
77209.79
m15564l
1974.45
m15564h
10741.01
m25564l
7529.40
m25564h
40959.94
m16574l
955.1394735
m16574h
5195.96
m26574l
3649.84
m26574h
19855.12
mid40541
9695.73
mid40542
36901.74
mid55641
5133.57
mid55642
19576.44
mid65741
2483.36
mid65742
9489.58
popm4054
47.6280200
popm5564
18.5323600
hyp_
red1
2.2955756
hyp_
red2
8.8658509
r14059
0.0011578
r24059
0.0044092
r16064
0.000322644
r26064
0.0012295
r16574
0.000510306
r26574
0.0019456
r1_
cba
0.000639642
r2_
cba
0.0024303
r1_
bi
0.000366208
r2_
bi
0.0013896
r14054l
0.0014917
r24054l
0.0056772
r15564l
0.000789780
r25564l
0.0030118
r16574l
0.000382056
r26574l
0.0014599
                        
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Subsistence
Lead
Related
Benefits
(
Sub
17)
10:
29
Friday,
November
29,
2002
Female
Lead
Related
Benefits
($
2001)

The
MEANS
Procedure
164
164
Variable
Sum
                        
b1fchd
56.5346293
b2fchd
215.0984925
popf4574
69.3484880
b1f_
cba
83.2902905
b2f_
cba
316.4422955
b1f_
bi
51.8872227
b2f_
bi
196.8717102
m14574l
1932.75
m14574h
10514.19
m24574l
7366.65
m24574h
40074.58
mid45741
5025.16
mid45742
19153.29
red_
chd1
0.000740496
red_
chd2
0.0028174
r1f_
cba
0.000331370
r2f_
cba
0.0012590
r1f_
bi
0.000206433
r2f_
bi
0.000783254
r14574l
0.000773102
r14574h
0.000773102
r24574l
0.0029467
r24574h
0.0029467
                        
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Subsistence
Lead
Related
Benefits
(
Sub
17)
10:
29
Friday,
November
29,
2002
Number
of
Affected
Ohio
Reaches
The
MEANS
Procedure
Analysis
Variable
:
EVENT_
WT
Sum
            
4.0000000
            
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Subsistence
Lead
Related
Benefits
(
Sub
17)
10:
29
Friday,
November
29,
2002
Exposed
Population
­
Males
Obs
tpopn
pm2074n
pm4574n
1
484
154.647
62.5957
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Subsistence
Lead
Related
Benefits
(
Sub
17)
10:
29
Friday,
November
29,
2002
Exposed
Population
­
Females
Obs
tpopn
pf4574n
1
484
69.3485
Contents
of
Ohio
Adult
Lead.
xls
titlecol
col1
col2
col3
col4
col5
col6
Table:
Adult
Lead
Benefits,
Unweighted
Estimates
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)

Option
1
Reduced
Cases
Low
Mid
High
Female
BI
$
0.00
$
240.78
$
240.78
$
240.78
CBA
$
0.00
$
391.98
$
391.98
$
391.98
165
165
CHD
$
0.00
$
270.13
$
270.13
$
270.13
Mortality
$
0.00
$
9,410.27
$
24,466.69
$
51,191.85
BI
$
0.00
$
535.13
$
535.13
$
535.13
Male
CBA
$
0.00
$
946.61
$
946.61
$
946.61
CHD
$
0.01
$
692.70
$
692.70
$
692.70
Hypertensio
n
$
9.35
$
10,670.63
$
10,670.63
$
10,670.63
Mortality
$
0.01
$
30,453.07
$
79,177.98
$
165,664.69
Total
.
$
53,611.30
$
117,392.64
$
230,604.51
166
166
Lead
Benefits
for
Children
167
167
"
Cancer­
fish
(
Sub
4).
sas"
From
the
data
set
of
pollutant
concentrations
for
each
RF1
reach,
observations
for
in­
stream
lead
concentrations
are
outputed
into
a
separate
data
set.
See
Cancer
from
Fish
Consumption
for
program
code.
168
168
"
NeoNatal
Mortality
Benefits
(
Sub
15).
sas"
Using
data
from
the
lead
specific
data
set,
changes
in
blood
lead
levels
for
women
of
childbearing
age
are
estimated.
Reduced
risk
of
neonatal
mortality
is
calculated
and
monetized.
169
169
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
NeoNatal
Mortality
Benefits
(
Sub
15).
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
07/
11/
2000
*/
/*
Updated:
11/
12/
2002
*/
/*

*/
/*
This
program
estimates
benefits
from
reduced
consumption
of
fish
tissue
*/
/*
containing
lead.
Reductions
in
MP&
M
facility
lead
loadings
result
in
*/
/*
lower
probabilties
of
neo­
natal
mortality.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
NeoNatal
Mortality
Lead
Benefits
(
Sub
15)';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

data
lead;
set
rundat.
lead;

/*****************************************************************************/
/*
Combine
the
exposed
recreational
and
subsistence
populations;
fresh
and
*/
/*
salt
water
*/
/*****************************************************************************/

sptpop
=
fwsptpop
+
swsptpop;
subpop
=
fwsubpop
+
swsubpop;

/*****************************************************************************/
/*
Calculate
the
blood
lead
levels
under
the
baseline
and
post
compliance
*/
/*
scenarios
*/
/*****************************************************************************/

PbB0f
=
2.05;
/*
Typical
PbB
conc.
in
absence
of
fish
cons.
for
women
*/
/*
Aged
15­
45
*/
bcf
=
49;
/*
Bioconcentration
factor
for
lead
L/
KG
*/
bksf
=
0.4;
/*
Biokinetic
slope
factor
for
lead
*/
ing
=
14.5;
/*
Average
daily
fish
consumption
(
g/
day)
recreational
*/
ing2
=
142.4;
/*
Average
daily
fish
consumption
(
g/
day)
subsistence
*/
170
170
af
=
0.03;
/*
Absorbtion
factor
*/
ef
=
365;
/*
Exposure
Frequency
*/
at
=
365;
/*
Average
timing,
or
duration
of
exposure
in
days
*/
cf
=
0.001;
/*
Conversion
factor
kg/
g
*/

/*
Recreational
*/
PbB_
bfr
=
(
PbB0f
+
(
cnc_
base*
bcf*
ing*
af*
bksf*
ef*
cf))/
at;
PbB_
1fr
=
(
PbB0f
+
(
cnc_
trt1*
bcf*
ing*
af*
bksf*
ef*
cf))/
at;
PbB_
2fr
=
(
PbB0f
+
(
cnc_
trt2*
bcf*
ing*
af*
bksf*
ef*
cf))/
at;

/*
Subsistence
*/
PbB_
bfs
=
(
PbB0f
+
(
cnc_
base*
bcf*
ing2*
af*
bksf*
ef*
cf))/
at;
PbB_
1fs
=
(
PbB0f
+
(
cnc_
trt1*
bcf*
ing2*
af*
bksf*
ef*
cf))/
at;
PbB_
2fs
=
(
PbB0f
+
(
cnc_
trt2*
bcf*
ing2*
af*
bksf*
ef*
cf))/
at;

/*
Changes
in
blood
lead
levels
*/
diff1r
=
PbB_
bfr
­
PbB_
1fr;
diff2r
=
PbB_
bfr
­
PbB_
2fr;

diff1s
=
PbB_
bfs
­
PbB_
1fs;
diff2s
=
PbB_
bfs
­
PbB_
2fs;

drop
fwsptpop
fwsubpop
swsptpop
swsubpop;
run;

proc
print;
var
reachnmb
PbB_
bfr
PbB_
1fr
PbB_
2fr
PbB_
bfs
PbB_
1fs
PbB_
2fs
diff1r
diff2r
diff1s
diff2s
cnc_
base
cnc_
trt1
cnc_
trt2
sptpop
subpop
event_
wt;
quit;

data
neo;
set
lead;

pctfem
=
0.22531;
/*
Percentage
of
Women
Aged
15­
45
(
Childbearing
Age)
*/
/*
from
the
US
census
2000
*/
expspt
=
sptpop*
pctfem;
expsub
=
subpop*
pctfem;

red1r
=
diff1r
*
sptpop
*
pctfem
*
0.0001;
red2r
=
diff2r
*
sptpop
*
pctfem
*
0.0001;

red1s
=
diff1s
*
subpop
*
pctfem
*
0.0001;
red2s
=
diff2s
*
subpop
*
pctfem
*
0.0001;

/*****************************************************************************/
/*
Calculate
benefits
under
the
options
and
the
monetized
*/
/*
benefit
based
on
the
value
of
a
statistical
life
(
in
$
2001)
*/
/*
*/
/*
mid
value
of
statistical
life
in
$
2001
is
$
6.5
million
*/
/*
171
171
*/
/*
KUNAL
SHARMA
(
03.20.02)
­
Mid
Value
Has
Changed.
See
Below.
*/
/*
STUART
SMITH
(
07.11.02)
­
Mid
Value
Changed
to
$
2001
*/
/*****************************************************************************/

ben1_
lr
=
red1r
*
2500000;
ben1_
hr
=
red1r
*
13600000;
ben2_
lr
=
red2r
*
2500000;
ben2_
hr
=
red2r
*
13600000;
mid1r
=
red1r
*
6500000;
mid2r
=
red2r
*
6500000;

ben1_
ls
=
red1s
*
2500000;
ben1_
hs
=
red1s
*
13600000;
ben2_
ls
=
red2s
*
2500000;
ben2_
hs
=
red2s
*
13600000;
mid1s
=
red1s
*
6500000;
mid2s
=
red2s
*
6500000;

tot1_
l
=
ben1_
lr
+
ben1_
ls;
tot1_
h
=
ben1_
hr
+
ben1_
hs;
tot2_
l
=
ben2_
lr
+
ben2_
ls;
tot2_
h
=
ben2_
hr
+
ben2_
hs;
mid1
=
mid1r
+
mid1s;
mid2
=
mid2r
+
mid2s;
run;

proc
means
sum
data=
neo;
weight
event_
wt;
var
red1r
red2r
red1s
red2s
ben1_
lr
ben1_
ls
ben1_
hr
ben1_
hs
ben2_
lr
ben2_
ls
ben2_
hr
ben2_
hs
tot1_
l
tot1_
h
tot2_
l
tot2_
h
mid1r
mid1s
mid2r
mid2s
mid1
mid2
expspt
expsub;
label
red1r
=
'
Number
of
Reductions
rec
(
Opt
1)'
red2r
=
'
Number
of
Reductions
rec
(
Opt
2)'
red1s
=
'
Number
of
Reductions
sub
(
Opt
1)'
red2s
=
'
Number
of
Reductions
sub
(
Opt
2)'
ben1_
lr
=
'
Sport
Low
(
Opt1)'
ben1_
ls
=
'
Sub
Low
(
Opt1)'
ben1_
hr
=
'
Sport
High
(
Opt1)'
ben1_
hs
=
'
Sub
High
(
Opt1)'
ben2_
lr
=
'
Sport
Low
(
Opt2)'
ben2_
ls
=
'
Sub
Low
(
Opt2)'
ben2_
hr
=
'
Sport
High
(
Opt2)'
ben2_
hs
=
'
Sub
High
(
Opt2)'
tot1_
l
=
'
Total
Benefits
­
Low
(
Opt
1)'
tot1_
h
=
'
Total
Benefits
­
High
(
Opt
1)'
tot2_
l
=
'
Total
Benefits
­
Low
(
Opt
2)'
tot2_
h
=
'
Total
Benefits
­
High
(
Opt
2)'
mid1
=
'
Mid
Benefits
(
Opt1)'
mid2
=
'
Mid
Benefits
(
Opt2)'
expspt
=
'
Exposed
Sport
Pop
(
15­
45yrs)'
expsub
=
'
Exposed
Sub
Pop
(
15­
45yrs)';
172
172
output
out
=
rundat.
chld_
neo
(
drop=
_
type_
_
freq_)
sum
=
red1r
red2r
red1s
red2s
ben1_
lr
ben1_
ls
ben1_
hr
ben1_
hs
ben2_
lr
ben2_
ls
ben2_
hr
ben2_
hs
tot1_
l
tot1_
h
tot2_
l
tot2_
h
mid1r
mid1s
mid2r
mid2s
mid1
mid2
expspt
expsub;
title3
'
Benefits
($
2001)';
quit;

data
rundat.
neo_
tbl
(
keep=
gender
categ
type
exppop
case1
case2
benlow1
benlow2
benmid1
benmid2
benhigh1
benhigh2);
set
rundat.
chld_
neo;

length
gender
$
50
categ
$
50
type
$
50;

gender
=
"
Children";
categ
=
"
Neo­
Natal
Mortality";
type
=
"
Sport";
exppop
=
expspt;
case1
=
red1r;
case2
=
red2r;
benlow1
=
ben1_
lr;
benlow2
=
ben2_
lr;
benmid1
=
mid1r;
benmid2
=
mid2r;
benhigh1
=
ben1_
hr;
benhigh2
=
ben2_
hr;
output;

gender
=
"
Children";
categ
=
"
Neo­
Natal
Mortality";
type
=
"
Sub";
exppop
=
expsub;
case1
=
red1s;
case2
=
red2s;
benlow1
=
ben1_
ls;
benlow2
=
ben2_
ls;
benmid1
=
mid1s;
benmid2
=
mid2s;
benhigh1
=
ben1_
hs;
benhigh2
=
ben2_
hs;
output;
run;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
173
173
Program
Output
174
174
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
NeoNatal
Mortality
Lead
Benefits
(
Sub
15)
10:
29
Friday,
November
29,
2002
Benefits
($
2001)

The
MEANS
Procedure
Variable
Label
Sum
                                                            
red1r
Number
of
Reductions
rec
(
Opt
1)
0.0167119
red2r
Number
of
Reductions
rec
(
Opt
2)
0.0666803
red1s
Number
of
Reductions
sub
(
Opt
1)
0.0082255
red2s
Number
of
Reductions
sub
(
Opt
2)
0.0327312
ben1_
lr
Sport
Low
(
Opt1)
41779.81
ben1_
ls
Sub
Low
(
Opt1)
20563.87
ben1_
hr
Sport
High
(
Opt1)
227282.17
ben1_
hs
Sub
High
(
Opt1)
111867.47
ben2_
lr
Sport
Low
(
Opt2)
166700.78
ben2_
ls
Sub
Low
(
Opt2)
81827.97
ben2_
hr
Sport
High
(
Opt2)
906852.27
ben2_
hs
Sub
High
(
Opt2)
445144.15
tot1_
l
Total
Benefits
­
Low
(
Opt
1)
62343.68
tot1_
h
Total
Benefits
­
High
(
Opt
1)
339149.64
tot2_
l
Total
Benefits
­
Low
(
Opt
2)
248528.75
tot2_
h
Total
Benefits
­
High
(
Opt
2)
1351996.42
mid1r
108627.51
mid1s
53466.07
mid2r
433422.04
mid2s
212752.72
mid1
Mid
Benefits
(
Opt1)
162093.58
mid2
Mid
Benefits
(
Opt2)
646174.76
expspt
Exposed
Sport
Pop
(
15­
45yrs)
2183.25
expsub
Exposed
Sub
Pop
(
15­
45yrs)
109.0500400
                                                            
175
175
Integrated
Exposure
Uptake
Biokinetic
Model
(
IEUBK)
The
model
used
a
range
of
lead
concentrations
in
fish
tissue
to
estimate
the
corresponding
blood
lead
level
associated
with
a
given
lead
concentration
in
the
fish
tissue.
176
176
"
Gen4.
txt"
Output
data
set
from
the
IEUBK
model
run.
See
DCN
37651.
177
177
"
Create
Lookup
Table.
sas"
Takes
the
output
file
from
the
IEUBK
model
run
and
generates
another
SAS
program
which
when
run
creates
a
format
used
to
transform
lead
concentrations
in
fish
tissue
into
blood
lead
levels.
See
DCN
37651
for
program
code.
178
178
"
Cnc_
fmt3.
sas"
Creates
a
library
format
for
transforming
lead
concentrations
in
fish
tissue
into
blood
lead
levels.
The
overall
hazard
ratio
for
each
RF1
reach
is
then
estimated.
See
DCN
37651.
179
179
"
Child
Lead
Benefits
(
Sub
16).
sas"
Using
data
from
the
lead
specific
data
set
and
results
of
the
IEUBK
lead
model,
child
blood
lead
levels
are
estimated
based
on
fish
consumption
in
recreational
and
subsistence
fishing
families.
180
180
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Child
Lead
Benefits
(
Sub
16)
04
seven
years.
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
06/
12/
2000
*/
/*
Updated:
11/
12/
2002
*/
/*

*/
/*
This
program
estimates
benefits
from
reduced
consumption
of
fish
tissue
*/
/*
containing
lead.
Reductions
in
MP&
M
facility
lead
loadings
result
in
*/
/*
lower
probabilties
of
lead
related
illnesses
in
children.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Child
Lead
Related
Benefits
(
Sub
16)';

/*****************************************************************************/
/*
Set
pathname
macro
for
excel
benefits
spreadsheet
*/
/*
Maps
to
the
results
libname
set
in
the
main
program
*/
/*****************************************************************************/

%
let
tbl_
path
=
%
sysfunc(
pathname(
results));

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

data
lead;
set
rundat.
lead;

/*****************************************************************************/
/*
Combine
the
exposed
populations,
recreational
and
subsistence;
fresh
and
*/
/*
salt
water
*/
/*****************************************************************************/

expspt
=
fwsptpop
+
swsptpop;
expsub
=
fwsubpop
+
swsubpop;

/*****************************************************************************/
/*
Calculate
the
lead
concentration
in
fish
tissue
available
for
intake
*/
/*
=
instream
conc
(
ug/
L)*
biocon
factor
(
kg/
L)*
ingestion
rate(
kg/
day)
*/
/*****************************************************************************/
181
181
bcncspt
=
cnc_
base*
49*
0.00603;
t1cncspt
=
cnc_
trt1*
49*
0.00603;
t2cncspt
=
cnc_
trt2*
49*
0.00603;

bcncsub
=
cnc_
base*
49*
0.03033;
t1cncsub
=
cnc_
trt1*
49*
0.03033;
t2cncsub
=
cnc_
trt2*
49*
0.03033;

keep
reachnmb
expspt
expsub
bcncspt
t1cncspt
t2cncspt
bcncsub
t1cncsub
t2cncsub
event_
wt;
run;

proc
print;
var
reachnmb
expspt
expsub
bcncspt
t1cncspt
t2cncspt
bcncsub
t1cncsub
t2cncsub
event_
wt;
title3
'
Exposed
Pops
and
Pb
conc
in
fish
tissue';
quit;

data
lead2;
set
lead;

/*****************************************************************************/
/*
Determine
sport
blood
levels
*/
/*
cnc_
fmt.
is
a
special
format
which
translates
the
concentration
in
the
*/
/*
fish
tissue
into
an
index
value
for
a
lookup
table
of
corresponding
blood*/
/*
lead
levels
*/
/*****************************************************************************/

/*****************************************************************************/
/*
The
following
codes
uses
special
user
defined
formats
to
translate
the
*/
/*
concentration
in
fish
tissue
into
a
blood
lead
level.
The
IEUBK
model
was*/
/*
run
with
several
hundred
concentrations
in
fish
tissue
resulting
in
a
*/
/*
large
file
with
blood
lead
levels
for
each
concentration.
The
SAS
format
*/
/*
maps
the
concentration
to
the
appropriate
row
in
the
blood
lead
level
*/
/*
data
set
*/
/*
*/
/*
If
the
concentration
cannot
be
mapped
(
a
return
value
of
9999)
and
it
is
*/
/*
larger
than
the
smallest
concentration
value
then
it
must
be
larger
than
*/
/*
the
maximum
in
the
set,
so
set
it
to
at
least
the
maximum
(
found
in
row
*/
/*
2996).
If
it
is
not
larger
than
0.5,
then
use
the
blodd
lead
associated
*/
/*
with
a
concentration
of
0.5
which
is
found
in
row
1.
*/
/*****************************************************************************/

/*
Get
base
pbp
level
*/
lookup
=
input(
put(
round(
bcncspt,.
1),
cnc_
fmt.),
4.0);
if
lookup
=
9999
then
lookup
=
1;
if
lookup
=
9999
and
bcncspt
>
0.5
then
lookup
=
2996;
set
ohio.
ubklook4
point
=
lookup;
pb_
bspt
=
bloodPb;

/*
Get
t1
pbp
level
*/
lookup
=
input(
put(
round(
t1cncspt,.
1),
cnc_
fmt.),
4.0);
182
182
if
lookup
=
9999
then
lookup
=
1;
if
lookup
=
9999
and
t1cncspt
>
0.5
then
lookup
=
2996;
set
ohio.
ubklook4
point
=
lookup;
pb_
1spt
=
bloodPb;

/*
Get
t2
pbp
level
*/
lookup
=
input(
put(
round(
t2cncspt,.
1),
cnc_
fmt.),
4.0);
if
lookup
=
9999
then
lookup
=
1;
if
lookup
=
9999
and
t2cncspt
>
0.5
then
lookup
=
1;
set
ohio.
ubklook4
point
=
lookup;
pb_
2spt
=
bloodPb;

/*
Determine
subsistence
blood
levels
*/
/*
Get
base
pbp
level
*/
lookup
=
input(
put(
round(
bcncsub,.
1),
cnc_
fmt.),
4.0);
if
lookup
=
9999
then
lookup
=
1;
if
lookup
=
9999
and
bcncsub
>
0.5
then
lookup
=
2996;
set
ohio.
ubklook4
point
=
lookup;
pb_
bsub
=
bloodPb;

/*
Get
t1
pbp
level
*/
lookup
=
input(
put(
round(
t1cncsub,.
1),
cnc_
fmt.),
4.0);
if
lookup
=
9999
then
lookup
=
1;
if
lookup
=
9999
and
t1cncsub
>
0.5
then
lookup
=
2996;
set
ohio.
ubklook4
point
=
lookup;
pb_
1sub
=
bloodPb;

/*
Get
t2
pbp
level
*/
lookup
=
input(
put(
round(
t2cncsub,.
1),
cnc_
fmt.),
4.0);
if
lookup
=
9999
then
lookup
=
1;
if
lookup
=
9999
and
t2cncsub
>
0.5
then
lookup
=
2996;
set
ohio.
ubklook4
point
=
lookup;
pb_
2sub
=
bloodPb;

run;

proc
print;
var
reachnmb
pb_
bspt
pb_
1spt
pb_
2spt
pb_
bsub
pb_
1sub
pb_
2sub;
title3
'
Blood
lead
levels';
quit;

data
lead3;
set
lead2;

kidspct
=
0.1177;
/*
Percent
of
kids
aged
0­
7,
U.
S.
Census
2000
*/

popspt
=
expspt*
kidspct;
popsub
=
expsub*
kidspct;

GM1_
spt
=
pb_
bspt
­
pb_
1spt;
GM2_
spt
=
pb_
bspt
­
pb_
2spt;
183
183
GM1_
sub
=
pb_
bsub
­
pb_
1sub;
GM2_
sub
=
pb_
bsub
­
pb_
2sub;

/*
Avoided
lost
IQ
points
*/
avIQ1spt
=
(
GM1_
spt)*
0.25*(
popspt/
7);
avIQ2spt
=
(
GM2_
spt)*
0.25*(
popspt/
7);

avIQ1sub
=
(
GM1_
sub)*
0.25*(
popsub/
7);
avIQ2sub
=
(
GM2_
sub)*
0.25*(
popsub/
7);

IQ1_
spt
=
avIQ1spt
*
9419;
IQ2_
spt
=
avIQ2spt
*
9419;

IQ1_
sub
=
avIQ1sub
*
9419;
IQ2_
sub
=
avIQ2sub
*
9419;

/*
Fewer
children
with
IQ
below
70
*/

if
GM1_
spt
>
0
then
do;
num1spt
=
(
70
­
(
100
+
0.25*
GM1_
spt))/
15;
sv701spt
=
0.02275
­
cdf('
NORMAL',
num1spt);
b70_
1spt
=
sv701spt
*
(
popspt/
7)
*
58012;
end;
else
do;
sv701spt
=
0;
b70_
1spt
=
0;
end;

if
GM2_
spt
>
0
then
do;
num2spt
=
(
70
­
(
100
+
0.25*
GM2_
spt))/
15;
sv702spt
=
0.02275
­
cdf('
NORMAL',
num2spt);
b70_
2spt
=
sv702spt
*
(
popspt/
7)
*
58012;
end;
else
do;
sv702spt
=
0;
b70_
2spt
=
0;
end;

if
GM1_
sub
>
0
then
do;
num1sub
=
(
70
­
(
100
+
0.25*
GM1_
sub))/
15;
sv701sub
=
0.02275
­
cdf('
NORMAL',
num1sub);
b70_
1sub
=
sv701sub
*
(
popsub/
7)
*
58012;
end;
else
do;
sv701sub
=
0;
b70_
1sub
=
0;
end;

if
GM2_
sub
>
0
then
do;
num2sub
=
(
70
­
(
100
+
0.25*
GM2_
sub))/
15;
sv702sub
=
0.02275
­
cdf('
NORMAL',
num2sub);
b70_
2sub
=
sv702sub
*
(
popsub/
7)
*
58012;
184
184
end;
else
do;
sv702sub
=
0;
b70_
2sub
=
0;
end;

/*
Number
of
cases
of
IQ<
70
saved
*/

c70_
1spt
=
sv701spt
*
(
popspt/
7);
c70_
2spt
=
sv702spt
*
(
popspt/
7);
c70_
1sub
=
sv701sub
*
(
popsub/
7);
c70_
2sub
=
sv702sub
*
(
popsub/
7);

check1
=
pdf('
LOGNORMAL',
20,
pb_
bspt,
2.09);
check2
=
pdf('
LOGNORMAL',
20,
pb_
bsub,
2.09);

spt1_
20=(
pdf('
LOGNORMAL',
20,
pb_
1spt,
2.09)
­
check1)*
0.2*(
popspt/
7)*
16485;
spt2_
20=(
pdf('
LOGNORMAL',
20,
pb_
2spt,
2.09)
­
check1)*
0.2*(
popspt/
7)*
16485;
sub1_
20=(
pdf('
LOGNORMAL',
20,
pb_
1sub,
2.09)
­
check2)*
0.2*(
popsub/
7)*
16485;
sub2_
20=(
pdf('
LOGNORMAL',
20,
pb_
2sub,
2.09)
­
check2)*
0.2*(
popsub/
7)*
16485;

red201sp=(
pdf('
LOGNORMAL',
20,
pb_
1spt,
2.09)
­
check1)*
0.2*(
popspt/
7);
red202sp=(
pdf('
LOGNORMAL',
20,
pb_
2spt,
2.09)
­
check1)*
0.2*(
popspt/
7);
red201sb=(
pdf('
LOGNORMAL',
20,
pb_
1sub,
2.09)
­
check2)*
0.2*(
popsub/
7);
red202sb=(
pdf('
LOGNORMAL',
20,
pb_
2sub,
2.09)
­
check2)*
0.2*(
popsub/
7);
run;

proc
means
sum
data=
lead3;
weight
event_
wt;
var
avIQ1spt
avIQ1sub
avIQ2spt
avIQ2sub
IQ1_
spt
IQ1_
sub
IQ2_
spt
IQ2_
sub
b70_
1spt
b70_
1sub
b70_
2spt
b70_
2sub
sv701spt
sv702spt
sv701sub
sv702sub
c70_
1spt
c70_
2spt
c70_
1sub
c70_
2sub
spt1_
20
spt2_
20
sub1_
20
sub2_
20
red201sp
red202sp
red201sb
red202sb
popspt
popsub;
output
out
=
rundat.
chld_
ld
sum
=
avIQ1spt
avIQ1sub
avIQ2spt
avIQ2sub
IQ1_
spt
IQ1_
sub
IQ2_
spt
IQ2_
sub
b70_
1spt
b70_
1sub
b70_
2spt
b70_
2sub
sv701spt
sv702spt
sv701sub
sv702sub
c70_
1spt
c70_
2spt
c70_
1sub
c70_
2sub
spt1_
20
spt2_
20
sub1_
20
sub2_
20
red201sp
red202sp
red201sb
red202sb
popspt
popsub;
title3
'
Benefits
($
2001)';
title4
'
Ingestion
Rate:
17.46
(
rec),
50.14
(
sub)';
quit;

data
rundat.
chld_
tbl
(
keep=
gender
categ
type
exppop
case1
case2
benlow1
benlow2
benmid1
benmid2
benhigh1
benhigh2);
185
185
set
rundat.
chld_
ld;

length
gender
$
50
categ
$
50
type
$
50;

array
IQ[
8]
IQ1_
spt
avIQ1spt
IQ2_
spt
avIQ2spt
IQ1_
sub
avIQ1sub
IQ2_
sub
avIQ2sub;
array
RD[
8]
b70_
1spt
c70_
1spt
b70_
2spt
c70_
2spt
b70_
1sub
c70_
1sub
b70_
2sub
c70_
2sub;
array
PB[
8]
spt1_
20
red201sp
spt2_
20
red202sp
sub1_
20
red201sb
sub2_
20
red202sb;

gender
=
"
Children";

if
_
n_
=
1
then
do;
do
i
=
1
to
6;
if
i
=
1
then
do;
categ
=
"
Avoided
IQ
Loss";
type
=
"
Sport";
case1
=
IQ[
2];
case2
=
IQ[
4];
benlow1
=
IQ[
1];
benlow2
=
IQ[
3];
benmid1
=
benlow1;
benmid2
=
benlow2;
benhigh1
=
benlow1;
benhigh2
=
benlow2;
output;
end;
if
i
=
2
then
do;
categ
=
"
Avoided
IQ
Loss";
type
=
"
Sub";
case1
=
IQ[
6];
case2
=
IQ[
8];
benlow1
=
IQ[
5];
benlow2
=
IQ[
7];
benmid1
=
benlow1;
benmid2
=
benlow2;
benhigh1
=
benlow1;
benhigh2
=
benlow2;
output;
end;
if
i
=
3
then
do;
categ
=
"
Reduced
IQ
<
70";
type
=
"
Sport";
case1
=
RD[
2];
case2
=
RD[
4];
benlow1
=
RD[
1];
benlow2
=
RD[
3];
benmid1
=
benlow1;
benmid2
=
benlow2;
benhigh1
=
benlow1;
benhigh2
=
benlow2;
output;
end;
if
i
=
4
then
do;
categ
=
"
Reduced
IQ
<
70";
type
=
"
Sub";
case1
=
RD[
6];
case2
=
RD[
8];
benlow1
=
RD[
5];
benlow2
=
RD[
7];
benmid1
=
benlow1;
benmid2
=
benlow2;
benhigh1
=
benlow1;
benhigh2
=
benlow2;
output;
end;
if
i
=
5
then
do;
categ
=
"
Reduced
Pb
>
20";
type
=
"
Sport";
case1
=
PB[
2];
case2
=
PB[
4];
186
186
benlow1
=
PB[
1];
benlow2
=
PB[
3];
benmid1
=
benlow1;
benmid2
=
benlow2;
benhigh1
=
benlow1;
benhigh2
=
benlow2;
output;
end;
if
i
=
6
then
do;
categ
=
"
Reduced
Pb
>
20";
type
=
"
Sub";
case1
=
PB[
6];
case2
=
PB[
8];
benlow1
=
PB[
5];
benlow2
=
PB[
7];
benmid1
=
benlow1;
benmid2
=
benlow2;
benhigh1
=
benlow1;
benhigh2
=
benlow2;
output;
end;
end;
end;
run;

data
rundat.
chld_
all;
set
rundat.
neo_
tbl
rundat.
chld_
tbl;
run;

proc
summary
data=
rundat.
chld_
all;
var
benlow1
benmid1
benhigh1
benlow2
benmid2
benhigh2;
output
out
=
rundat.
chld_
tot
(
drop=
_
type_
_
freq_)
sum
=
benlow1
benmid1
benhigh1
benlow2
benmid2
benhigh2;
run;

/*****************************************************************************/
/*
Generate
data
set
for
export
to
Excel
*/
/*****************************************************************************/

data
exlchld
(
keep=
titlecol
col1­
col11
label="
Child
Lead
Benefits­
Unweighted");
set
rundat.
chld_
all
rundat.
chld_
tot;
length
titlecol
$
50
col1
­
col11
$
128;

if
_
n_
=
1
then
do;
titlecol
=
"
Table:
Child
Lead
Benefits,
Unweighted
Estimates";
output;
titlecol
=
&
thetitle;
output;
titlecol
=
"
";
output;
col4
=
"
Option
1";
col8
=
"
Option
2";
output;
col2
=
"
Category";
col3
=
"
Type";
col4
=
"
Reduced
Cases";
col5
=
"
Low";
col6
=
"
Mid";
col7
=
"
High";
col8
=
"
Reduced
Cases";
col9
=
"
Low";
col10
=
"
Mid";
col11
=
"
High";
output;
187
187
end;

if
_
n_
=
9
then
col1
=
"
Total";
else
col1
=
gender;

col2
=
trim(
categ);
col3
=
trim(
type);
col4
=
trim(
case1);
col5
=
trim(
benlow1);
col6
=
trim(
benmid1);
col7
=
trim(
benhigh1);
col8
=
trim(
case2);
col9
=
trim(
benlow2);
col10
=
trim(
benmid2);
col11
=
trim(
benhigh2);
output;
run;

/*****************************************************************************/
/*
Export
to
Excel
*/
/*****************************************************************************/

proc
export
data
=
exlchld
outfile
=
"&
tbl_
path\
Ohio
Child
Lead.
xls"
dbms=
excel2000
replace;
run;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
188
188
Program
Output
189
189
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Child
Lead
Related
Benefits
(
Sub
16)
10:
29
Friday,
November
29,
2002
Benefits
($
2001)
Ingestion
Rate:
17.46
(
rec),
50.14
(
sub)

The
MEANS
Procedure
Variable
Sum
                        
avIQ1spt
22.4754035
avIQ1sub
4.4843700
avIQ2spt
84.1069067
avIQ2sub
16.9590988
IQ1_
spt
211695.83
IQ1_
sub
42238.28
IQ2_
spt
792202.95
IQ2_
sub
159737.75
b70_
1spt
4530.57
b70_
1sub
814.2134707
b70_
2spt
16570.68
b70_
2sub
2845.30
sv701spt
0.0018329
sv702spt
0.0054442
sv701sub
0.0065726
sv702sub
0.0191398
c70_
1spt
0.0780971
c70_
2spt
0.2856423
c70_
1sub
0.0140353
c70_
2sub
0.0490468
spt1_
20
0
spt2_
20
1632.17
sub1_
20
40.8671823
sub2_
20
163.6446840
red201sp
0
red202sp
0.0990095
red201sb
0.0024791
red202sb
0.0099269
popspt
1140.51
popsub
56.9668000
                        
190
190
Contents
of
Ohio
Child
Lead.
xls
titlecol
col1
col2
col3
col4
col5
col6
col7
Table:
Child
Lead
Benefits,
Unweighted
Estimates
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)

Option
1
Category
Type
Reduced
Cases
Low
Mid
High
Children
Neo­
Natal
Mortality
Sport
0.016711
9244
$
41,779.81
$
108,627.51
$
227,282.17
Children
Neo­
Natal
Mortality
Sub
0.008225
5491
$
20,563.87
$
53,466.07
$
111,867.47
Children
Avoided
IQ
Loss
Sport
22.47540
35
$
211,695.83
$
211,695.83
$
211,695.83
Children
Avoided
IQ
Loss
Sub
4.48437
$
42,238.28
$
42,238.28
$
42,238.28
Children
Reduced
IQ
<
70
Sport
0.078097
1099
$
4,530.57
$
4,530.57
$
4,530.57
Children
Reduced
IQ
<
70
Sub
0.014035
2594
$
814.21
$
814.21
$
814.21
Children
Reduced
Pb
>
20
Sport
0.042430
1945
$
699.46
$
699.46
$
699.46
Children
Reduced
Pb
>
20
Sub
0.002479
0526
$
40.87
$
40.87
$
40.87
Total
.
$
322,362.90
$
422,112.80
$
599,168.86
191
191
Recreational
Benefits
192
192
"
Human
Health
AWQC
(
Sub
2).
sas"
The
number
of
human
health
based
AWQC
exceedences
for
each
RF1
reach
are
estimated
and
output
to
a
data
set.
See
Human
Health
Benefits
Cancer
from
Fish
Consumption
for
program
code
and
output.
193
193
"
Aquatic
Life
AWQC
(
Sub
3).
sas"
The
number
of
aquatic
life
based
AWQC
exceedences
for
each
RF1
reach
are
estimated
and
output
to
a
data
set.
194
194
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Aquatic
Life
AWQC
(
Sub
3).
sas
*/
/*
Author:
Stuart
Smith
*/
/*
Date:
unknown
*/
/*
Updated:
9/
24/
2002
*/
/*

*/
/*
(
1)
IDENTIFIES
MP&
M
DISCHARGE
REACHES
IN
WHICH
POLLUTANT
CONCENTRATIONS
*/
/*
EXCEED
THE
AWQC
VALUES
FOR
AQUATIC
LIFE;
*/
/*
(
2)
EXTRAPOLATES
THE
RESULTS
TO
THE
POPULATION
LEVEL
BY
USING
*/
/*
DIFFERENTIAL
WEIGHTING.
*/
/*
THE
TOTAL
NUMBER
OF
EXCEEDENCE
EVENTS
IS
THEN
ESTIMATED
BY
SUMMING
OVER
*/
/*
THE
RESULTS
FROM
THE
FIRST
AND
SECOND
RUN.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Output
from
Aquatic
Life
(
Sub
3)';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
DISCHARGE
EVENTS,
ASSOCIATED
LOADINGS
AND
WEIGHTS
HAVE
BEEN
CALCULATED
BY
*/
/*
ANOTHER
PROGRAM.
ALL
UNIT
CONVERSIONS
HAVE
OCCURRED.
SEE
"
Create
Datasets
*/
/*
(
Sub
1).
sas"
FOR
SPECIFIC
PROGRAM
INFORMATION.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
PULL
TOGETHER
THE
EVENTS
AND
CHEMICAL
SPECIFIC
PARAMETERS
*/
/*****************************************************************************/

data
rchs;
set
ohio.
fac_
info;
keep
reachnmb
segl
mnflo
svten
acute
chronic
dcp
wbtype
surface
drainage
volume;
run;

/*
Sort
by
unique
reach
number
and
keep
only
one*/
proc
sort
nodupkey
data=
rchs;
by
reachnmb;
quit;
195
195
/*
Sort
pollutant
characteristics
by
chemical
cas
no*/
Proc
sort
data
=
ohio.
chemdata;
by
casno;
quit;

Proc
sql;
create
table
stream
as
select
event_
ld.
reachnmb,
event_
ld.
casno,
evnt_
flo,
base,
treat1,
treat2,
event_
wt,
segl,
mnflo
as
mean_
flo,
svten
as
flo7q10,
acute
as
adf,
chronic
as
cdf,
dcp,
wbtype,
biodegre
as
decay,
surface,
drainage,
volume
from
rundat.
event_
ld,
ohio.
chemdata,
rchs
where
event_
ld.
casno
=
chemdata.
casno
and
event_
ld.
reachnmb
=
rchs.
reachnmb
order
by
reachnmb,
casno;
quit;

/*****************************************************************************/
/*
FRESHWATER
REACHES
­
CONCENTRATIONS
AND
AWQC
EXCEEDENCES
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Calculate
chemical
concentrations
in
lakes
*/
/*****************************************************************************/

data
Lake;
set
stream;
if
wbtype
=
'
lake';
if
decay;

keep
reachnmb
casno
base
treat1
treat2
adf
cdf
restime
decay
event_
wt;

/*
We
have
drainage
area
and
surface
area
information
*/
if
surface
^=
.
and
drainage
^=
.
then
do;
num
=
drainage;
/*
Drainage
area
in
sq.
miles
*/
denom
=
surface*
0.0015625;
/*
Convert
surface
area
from
acres
to
sq.
miles
*/
logdays
=
4.077
­
(
1.177*
log10(
num/
denom));
restime
=
10**
logdays;
time1
=
restime*
24;
/*
CONVERT
HYDRAULIC
TIME
FROM
DAYS
INTO
HOURS
*/
cnc_
aqcb
=
(
base/
evnt_
flo)/(
1+
time1*
decay);
cnc_
aqc1
=
(
treat1/
evnt_
flo)/(
1+
time1*
decay);
cnc_
aqc2
=
(
treat2/
evnt_
flo)/(
1+
time1*
decay);
good
=
1;
end;

/*
Missing
area
measure(
s),
do
end­
of­
pipe
value
*/
else
do;
cnc_
aqcb
=
(
base/
evnt_
flo);
cnc_
aqc1
=
(
treat1/
evnt_
flo);
cnc_
aqc2
=
(
treat2/
evnt_
flo);
end;

cnc_
aqab
=
cnc_
aqcb;
cnc_
aqa1
=
cnc_
aqc1;
cnc_
aqa2
=
cnc_
aqc2;
196
196
keep
reachnmb
casno
cnc_
aqcb
cnc_
aqc1
cnc_
aqc2
cnc_
aqab
cnc_
aqa1
cnc_
aqa2
event_
wt;
run;

/*
Great
Lakes
­
Lake
Erie
*/
data
BigLake;
set
stream;
if
wbtype
=
'
glake';

/*
TEMPORARY
FIX
­
Hard
code
CDF
to
10
for
lake
erie
reaches.
Those
that
have
a
cdf
(
all
equal
4.85)
are
changed
to
10.
All
others
remain
missing
for
now.

Stuart
Smith
07.16.02
(
evnt_
flo*
cdf)
changed
to
(
evnt_
flo*
10)
See
below.

*/

if
cdf
^=.
then
do;
/*
We
have
CDF,
so
use
this*/
cnc_
aqcb
=
base/(
evnt_
flo*
10);
cnc_
aqc1
=
treat1/(
evnt_
flo*
10);
cnc_
aqc2
=
treat2/(
evnt_
flo*
10);
end;
else
if
dcp^=.
then
do;
benchld=
10000*
907.2;
/*
benchmark
load
is
10000
per
year;
907.2
is
coversion*/
/*
factor
from
kg
to
ton
*/

cnc_
aqcb=((
base/
10**
9)*
365*
dcp)/
benchld;
cnc_
aqc1=((
treat1/
10**
9)*
365*
dcp)/
benchld;
cnc_
aqc2=((
treat2/
10**
9)*
365*
dcp)/
benchld;
end;
else
do;
cnc_
aqcb
=
.;
cnc_
aqc1
=
.;
cnc_
aqc2
=
.;
end;

cnc_
aqab
=
cnc_
aqcb;
cnc_
aqa1
=
cnc_
aqc1;
cnc_
aqa2
=
cnc_
aqc2;

if
cnc_
aqcb=.
then
delete;

keep
reachnmb
casno
cnc_
aqcb
cnc_
aqc1
cnc_
aqc2
cnc_
aqab
cnc_
aqa1
cnc_
aqa2
event_
wt;
run;

/*****************************************************************************/
/*
Combine
small
and
large
lakes
*/
/*****************************************************************************/
197
197
data
freshwat;
set
BigLake
Lake;
run;

proc
sort
data=
freshwat;
by
reachnmb
casno;
quit;

/*****************************************************************************/
/*
Pull
in
estimated
in­
stream
concentrations
using
mean
flow
*/
/*
These
values
are
calculated
by
the
decay
model
outside
of
this
analysis
*/
/*****************************************************************************/

data
brad;
set
rundat.
brdevnt2;

cnc_
aqcb
=
base;
cnc_
aqc1
=
treat1;
cnc_
aqc2
=
treat2;

cnc_
aqab
=
cnc_
aqcb;
cnc_
aqa1
=
cnc_
aqc1;
cnc_
aqa2
=
cnc_
aqc2;

if
cnc_
aqcb=.
then
delete;
event_
wt
=
weight;

keep
reachnmb
casno
cnc_
aqcb
cnc_
aqc1
cnc_
aqc2
cnc_
aqab
cnc_
aqa1
cnc_
aqa2
event_
wt;
run;

data
freshwat2;
merge
brad
freshwat;
by
reachnmb
casno;
run;

/*****************************************************************************/
/*
Compare
in­
stream
pollutant
concentrations
with
freshwater
AWQCs
for
*/
/*
aquatic
life.
*/
/*****************************************************************************/

proc
sql;
create
table
awqc1
as
select
reachnmb,
freshwat2.
casno,
chemical,
cnc_
aqcb,
cnc_
aqc1,
cnc_
aqc2,
cnc_
aqab,
cnc_
aqa1,
cnc_
aqa2,
faval__
i
as
faval,
fcval__
i
as
fcval,
event_
wt
from
freshwat2,
ohio.
chemdata
where
freshwat2.
casno
=
chemdata.
casno
order
by
reachnmb,
casno;
quit;

data
stream4;
198
198
set
awqc1;

if
cnc_
aqcb
>
fcval
and
fcval
>
0
then
chronicb
=
1;
if
cnc_
aqc1
>
fcval
and
fcval
>
0
then
chronic1
=
1;
if
cnc_
aqc2
>
fcval
and
fcval
>
0
then
chronic2
=
1;
if
cnc_
aqcb
>
faval
and
faval
>
0
then
acuteb
=
1;
if
cnc_
aqc1
>
faval
and
faval
>
0
then
acute1
=
1;
if
cnc_
aqc2
>
faval
and
faval
>
0
then
acute2
=
1;

keep
reachnmb
casno
chemical
chronicb
chronic1
chronic2
acuteb
acute1
acute2
event_
wt;
run;

data
allreach;
set
stream4;
run;

/*****************************************************************************/
/*
END
FRESHWATER
REACHES
*/
/*****************************************************************************/

proc
sql;

/*
Estimate
AWQCs
exceedance
by
chemicals
on
a
sample
and
national
basis*/
/*
adjustment
weight
variable
awt
replaced
with
1,
not
used
in
analysis
*/

create
table
chm_
awqc
as
select
chemical,
sum(
chronicb)
as
crb,
sum(
chronic1)
as
cr1,
sum(
chronic2)
as
cr2,
sum(
acuteb)
as
acb,
sum(
acute1)
as
ac1,
sum(
acute2)
as
ac2,
sum(
chronicb*
event_
wt*
1)
as
ntlbw,
sum(
chronic1*
event_
wt*
1)
as
ntl1w,
sum(
chronic2*
event_
wt*
1)
as
ntl2w,
sum(
acuteb*
event_
wt*
1)
as
ntlbo,
sum(
acute1*
event_
wt*
1)
as
ntl1o,
sum(
acute2*
event_
wt*
1)
as
ntl2o,
case
when
sum(
chronicb)
>=
1
then
1
else
0
end
as
chemcrb,
case
when
sum(
chronic1)
>=
1
then
1
else
0
end
as
chemcr1,
case
when
sum(
chronic2)
>=
1
then
1
else
0
end
as
chemcr2,
case
when
sum(
acuteb)
>=
1
then
1
else
0
end
as
chemacb,
case
when
sum(
acute1)
>=
1
then
1
else
0
end
as
chemac1,
case
when
sum(
acute2)
>=
1
then
1
else
0
end
as
chemac2
from
allreach
where
chronicb>
0
or
acuteb>
0
group
by
chemical
order
by
chemical;

/*
Estimate
aquatic
life
AWQC
Exceedences
by
option/
reach
*/

create
table
aq_
life2
as
select
allreach.
reachnmb,
sum(
chronicb)
as
test_
cb,
sum(
chronic1)
as
test_
c1,
sum(
chronic2)
as
test_
c2,
sum
(
acuteb)
as
test_
ab,
sum(
acute1)
as
test_
a1,
sum
(
acute2)
as
test_
a2,
sum(
chronicb*
event_
wt*
1)
as
ntlb1,
199
199
sum(
chronic1*
event_
wt*
1)
as
ntnl11,
sum(
chronic2*
event_
wt*
1)
as
ntnl21,
sum(
acuteb
*
event_
wt*
1)
as
ntlb2,
sum(
acute1*
event_
wt*
1)
as
ntnl12,
sum(
acute2*
event_
wt*
1)
as
ntnl22,
case
when
sum(
chronicb)
>=
1
then
1
else
0
end
as
rchcrb,
case
when
sum(
chronic1)
>=
1
then
1
else
0
end
as
rchcr1,
case
when
sum(
chronic2)
>=
1
then
1
else
0
end
as
rchcr2,
case
when
sum(
acuteb)
>=
1
then
1
else
0
end
as
rchacb,
case
when
sum(
acute1)
>=
1
then
1
else
0
end
as
rchac1,
case
when
sum(
acute2)
>=
1
then
1
else
0
end
as
rchac2,
sum(
event_
wt)
as
reachwt
from
allreach
where
chronicb>
0
or
acuteb>
0
group
by
reachnmb
order
by
reachnmb;

create
table
rch1
as
select
sum(
distinct
event_
wt)
as
wght1,
reachnmb,
chemical
from
allreach
where
chronicb
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
chrnb
as
select
max(
wght1)
as
chrnc_
b,
reachnmb
from
rch1
group
by
reachnmb
order
by
reachnmb;

create
table
rch2
as
select
sum(
distinct
event_
wt)
as
wght2,
reachnmb,
chemical
from
allreach
where
acuteb
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
actb
as
select
max(
wght2)
as
acutr_
b,
reachnmb
from
rch2
group
by
reachnmb
order
by
reachnmb;

create
table
rch3
as
select
sum(
distinct
event_
wt)
as
wght3,
reachnmb,
chemical
from
allreach
where
chronic1
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;
200
200
create
table
chrn1
as
select
max(
wght3)
as
chrnc_
1,
reachnmb
from
rch3
group
by
reachnmb
order
by
reachnmb;

create
table
rch4
as
select
sum(
distinct
event_
wt)
as
wght4,
reachnmb,
chemical
from
allreach
where
acute1
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
act1
as
select
max(
wght4)
as
acutr_
1,
reachnmb
from
rch4
group
by
reachnmb
order
by
reachnmb;

create
table
rch5
as
select
sum(
distinct
event_
wt)
as
wght5,
reachnmb,
chemical
from
allreach
where
chronic2
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
chrn2
as
select
max(
wght5)
as
chrnc_
2,
reachnmb
from
rch5
group
by
reachnmb
order
by
reachnmb;

create
table
rch6
as
select
sum(
distinct
event_
wt)
as
wght6,
reachnmb,
chemical
from
allreach
where
acute2
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
act2
as
select
max(
wght6)
as
acutr_
2,
reachnmb
from
rch6
group
by
reachnmb
order
by
reachnmb;

create
table
rch7
as
select
sum(
distinct
event_
wt)
as
wght7,
reachnmb,
chemical
from
allreach
201
201
where
chronicb
>
0
or
acuteb
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
multi_
b
as
select
max(
wght7)
as
multi_
b,
reachnmb
from
rch7
group
by
reachnmb
order
by
reachnmb;

create
table
rch8
as
select
sum(
distinct
event_
wt)
as
wght8,
reachnmb,
chemical
from
allreach
where
chronic1
>
0
or
acute1
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
multi_
1
as
select
max(
wght8)
as
multi_
1,
reachnmb
from
rch8
group
by
reachnmb
order
by
reachnmb;

create
table
rch9
as
select
sum(
distinct
event_
wt)
as
wght9,
reachnmb,
chemical
from
allreach
where
chronic2
>
0
or
acute2
>
0
group
by
reachnmb,
chemical
order
by
reachnmb,
chemical;

create
table
multi_
2
as
select
max(
wght9)
as
multi_
2,
reachnmb
from
rch9
group
by
reachnmb
order
by
reachnmb;
quit;

data
rchwts;
merge
chrnb
actb
chrn1
act1
chrn2
act2
multi_
b
multi_
1
multi_
2;
by
reachnmb;

if
chrnc_
b=.
then
chrnc_
b=
0;
if
chrnc_
1=.
then
chrnc_
1=
0;
if
chrnc_
2=.
then
chrnc_
2=
0;
if
acutr_
b=.
then
acutr_
b=
0;
if
acutr_
1=.
then
acutr_
1=
0;
if
acutr_
2=.
then
acutr_
2=
0;
if
multi_
b=.
then
multi_
b=
0;
if
multi_
1=.
then
multi_
1=
0;
if
multi_
2=.
then
multi_
2=
0;
202
202
run;

quit;

/*
Save
the
affected
reaches
for
the
recreational
benefits
program*/

data
rundat.
rec_
al;
set
allreach;
if
chronicb
>
0
or
acuteb
>
0;

drop
reaches;
run;

proc
means
sum
data=
aq_
life2;
var
ntlb1
ntnl11
ntnl21
ntlb2
ntnl12
ntnl22
rchcrb
rchcr1
rchcr2
rchacb
rchac1
rchac2;
label
reachnmb
='
Reach
ID'
ntlb1
=
'
Chronic
AWQC
Exeedences
(
BL)'
ntnl11
=
'
Chronic
AWQC
Exeedences
(
Opt
1)'
ntnl21
=
'
Chronic
AWQC
Exeedences
(
Opt
2)'
ntlb2
=
'
Acute
AWQC
Exeedences
(
Bl)'
ntnl12
=
'
Acute
AWQC
Exeedences
(
Opt
1)'
ntnl22
=
'
Acute
AWQC
Exeedences
(
Opt
2)'
rchcrb
=
'
Number
of
Chronic
reaches
(
BL)'
rchcr1
=
'
Number
of
Chronic
reaches
(
Opt
1)'
rchcr2
=
'
Number
of
Chronic
reaches
(
Opt
2)'
rchacb
=
'
Number
of
Acute
reaches
(
BL)'
rchac1
=
'
Number
of
Acute
reaches
(
Opt
1)'
rchac2
=
'
Number
of
Acute
reaches
(
Opt
2)';

title3
'
Aquatic
Life
AWQC
Exceedences
by
Option';

proc
means
sum
data=
chm_
awqc;
var
ntlbw
ntl1w
ntl2w
ntlbo
ntl1o
ntl2o
chemcrb
chemcr1
chemcr2
chemacb
chemac1
chemac2;
label
ntlbw
=
'
Chronic
AWQC
Exeedences
(
BL)'
ntl1w
=
'
Chronic
AWQC
Exeedences
(
Opt
1)'
ntl2w
=
'
Chronic
AWQC
Exeedences
(
Opt
2)'
ntlbo
=
'
Acute
AWQC
Exeedences
(
Bl)'
ntl1o
=
'
Acute
AWQC
Exeedences
(
Opt
1)'
ntl2o
=
'
Acute
AWQC
Exeedences
(
Opt
2)'
chemcrb
=
'
Number
of
Chronic
pol.
(
BL)'
chemcr1
=
'
Number
of
Chronic
pol.
(
Opt
1)'
chemcr2
=
'
Number
of
Chronic
pol.
(
Opt
2)'
chemacb
=
'
Number
of
Acute
pol.
(
BL)'
chemac1
=
'
Number
of
Acute
pol.
(
Opt
1)'
chemac2
=
'
Number
of
Acute
pol.
(
Opt
2)';

title3
'
AWQC
Exceedances
by
Pollutant/
Option';

proc
means
sum
data=
rchwts;
203
203
var
chrnc_
b
chrnc_
1
chrnc_
2
acutr_
b
acutr_
1
acutr_
2
multi_
b
multi_
1
multi_
2;
label
chrnc_
b
=
'#
of
Reaches
Exceeding
Chronic
AWQC
(
Bl)
'
chrnc_
1
=
'#
of
Reaches
Exceeding
Chronic
AWQC
(
Opt
1)'
chrnc_
2
=
'#
of
Reaches
Exceeding
Chronic
AWQC
(
Opt
2)'
acutr_
b
=
'#
of
Reaches
Exceeding
Acute
AWQC
(
Bl)'
acutr_
1
=
'#
of
Reaches
Exceeding
Acute
AWQC
(
Opt
1)'
acutr_
2
=
'#
of
Reaches
Exceeding
Acute
AWQC
(
Opt
2)'
multi_
b
=
'
Either
(
BL)'
multi_
1
=
'
Either
(
Opt
1)'
multi_
2
=
'
Either
(
Opt
2)';
title3
'
Reaches
Exceeding
AWQC
Limits
for
Aquatic
Life';
run;

proc
sql;
create
table
preme
as
select
reachnmb,
event_
wt,
sum(
chronicb)
as
testb1,
sum(
chronic1)
as
test1_
1,
sum(
chronic2)
as
test2_
1,
sum(
acuteb)
as
testb2,
sum(
acute1)
as
test1_
2,
sum(
acute2)
as
test2_
2
from
allreach
group
by
reachnmb,
event_
wt
order
by
reachnmb,
event_
wt;
quit;

data
reduc;
set
preme;
if
testb1=.
then
testb1=
0;
if
test1_
1=.
then
test1_
1=
0;
if
test2_
1=.
then
test2_
1=
0;
if
testb2=.
then
testb2=
0;
if
test1_
2=.
then
test1_
2=
0;
if
test2_
2=.
then
test2_
2=
0;

if
testb1
>=
1
and
test1_
1
=
0
then
elim1_
1
=
1;
else
elim1_
1=
0;
if
testb1
>=
1
and
test2_
1
=
0
then
elim2_
1
=
1;
else
elim2_
1=
0;
if
testb2
>=
1
and
test1_
2
=
0
then
elim1_
2
=
1;
else
elim1_
2=
0;
if
testb2
>=
1
and
test2_
2
=
0
then
elim2_
2
=
1;
else
elim2_
2=
0;

if
testb1
>=
1
and
test1_
1
<
testb1
and
elim1_
1
=
0
then
red1_
1
=
1;
else
red1_
1=
0;
if
testb1
>=
1
and
test2_
1
<
testb1
and
elim2_
1
=
0
then
red2_
1
=
1;
else
red2_
1=
0;
if
testb2
>=
1
and
test1_
2
<
testb2
and
elim1_
2
=
0
then
red1_
2
=
1;
else
red1_
2=
0;
if
testb2
>=
1
and
test2_
2
<
testb2
and
elim2_
2
=
0
then
red2_
2
=
1;
else
red2_
2=
0;

if
elim1_
1=
1
or
elim1_
2=
1
then
elim1
=
1;
else
elim1
=
0;
if
elim2_
1=
1
or
elim2_
2=
1
then
elim2
=
1;
else
elim2
=
0;
if
red1_
1
=
1
or
red1_
2
=
1
then
reduc1
=
1;
else
reduc1
=
0;
if
red2_
1
=
1
or
red2_
2
=
1
then
reduc2
=
1;
else
reduc2
=
0;
run;
204
204
proc
means
sum
data=
reduc;
weight
event_
wt;
var
elim1_
1
elim2_
1
elim1_
2
elim2_
2
red1_
1
red2_
1
red1_
2
red2_
2
reduc1
reduc2;
label
elim1_
1
=
'
Elim.
Chronic
(
Opt1)'
elim2_
1
=
'
Elim.
Chronic
(
Opt2)'
elim1_
2
=
'
Elim.
Acute
(
Opt1)'
elim2_
2
=
'
Elim.
Acute
(
Opt2)'
red1_
1
=
'
Redu.
Chronic
(
Opt1)'
red2_
1
=
'
Redu.
Chronic
(
Opt2)'
red1_
2
=
'
Redu.
Acute
(
Opt1)'
red2_
2
=
'
Redu.
Acute
(
Opt2)'
reduc1
=
'
Total
Reaches
Reducing
(
Opt1)'
reduc2
=
'
Total
Reaches
Reducing
(
Opt2)';
title3
'
AWQC
Eliminations
and
Reductions';
title4
'
Number
of
Ohio
Reaches';
quit;

proc
print
data=
aq_
life2;
quit;
title3
'
Exceedences
by
Reach';
proc
print
data=
chm_
awqc;
title3
'
Exceedences
by
Chemical';
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
205
205
Program
Output
206
206
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Output
from
Aquatic
Life
(
Sub
3)
10:
29
Friday,
November
29,
2002
Aquatic
Life
AWQC
Exceedences
by
Option
The
MEANS
Procedure
Variable
Label
Sum
                                                             
ntlb1
Chronic
AWQC
Exeedences
(
BL)
52.0000000
ntnl11
Chronic
AWQC
Exeedences
(
Opt
1)
45.0000000
ntnl21
Chronic
AWQC
Exeedences
(
Opt
2)
13.0000000
ntlb2
Acute
AWQC
Exeedences
(
Bl)
20.0000000
ntnl12
Acute
AWQC
Exeedences
(
Opt
1)
18.0000000
ntnl22
Acute
AWQC
Exeedences
(
Opt
2)
11.0000000
rchcrb
Number
of
Chronic
reaches
(
BL)
21.0000000
rchcr1
Number
of
Chronic
reaches
(
Opt
1)
21.0000000
rchcr2
Number
of
Chronic
reaches
(
Opt
2)
13.0000000
rchacb
Number
of
Acute
reaches
(
BL)
15.0000000
rchac1
Number
of
Acute
reaches
(
Opt
1)
15.0000000
rchac2
Number
of
Acute
reaches
(
Opt
2)
11.0000000
                                                             
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Output
from
Aquatic
Life
(
Sub
3)
10:
29
Friday,
November
29,
2002
AWQC
Exceedances
by
Pollutant/
Option
The
MEANS
Procedure
Variable
Label
Sum
                                                           
ntlbw
Chronic
AWQC
Exeedences
(
BL)
52.0000000
ntl1w
Chronic
AWQC
Exeedences
(
Opt
1)
45.0000000
ntl2w
Chronic
AWQC
Exeedences
(
Opt
2)
13.0000000
ntlbo
Acute
AWQC
Exeedences
(
Bl)
20.0000000
ntl1o
Acute
AWQC
Exeedences
(
Opt
1)
18.0000000
ntl2o
Acute
AWQC
Exeedences
(
Opt
2)
11.0000000
chemcrb
Number
of
Chronic
pol.
(
BL)
15.0000000
chemcr1
Number
of
Chronic
pol.
(
Opt
1)
8.0000000
chemcr2
Number
of
Chronic
pol.
(
Opt
2)
1.0000000
chemacb
Number
of
Acute
pol.
(
BL)
7.0000000
chemac1
Number
of
Acute
pol.
(
Opt
1)
5.0000000
chemac2
Number
of
Acute
pol.
(
Opt
2)
1.0000000
                                                           
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Output
from
Aquatic
Life
(
Sub
3)
10:
29
Friday,
November
29,
2002
Reaches
Exceeding
AWQC
Limits
for
Aquatic
Life
The
MEANS
Procedure
Variable
Label
Sum
                                                                       
chrnc_
b
#
of
Reaches
Exceeding
Chronic
AWQC
(
Bl)
21.0000000
chrnc_
1
#
of
Reaches
Exceeding
Chronic
AWQC
(
Opt
1)
21.0000000
chrnc_
2
#
of
Reaches
Exceeding
Chronic
AWQC
(
Opt
2)
13.0000000
acutr_
b
#
of
Reaches
Exceeding
Acute
AWQC
(
Bl)
15.0000000
acutr_
1
#
of
Reaches
Exceeding
Acute
AWQC
(
Opt
1)
15.0000000
acutr_
2
#
of
Reaches
Exceeding
Acute
AWQC
(
Opt
2)
11.0000000
multi_
b
Either
(
BL)
21.0000000
multi_
1
Either
(
Opt
1)
21.0000000
multi_
2
Either
(
Opt
2)
13.0000000
                                                                       
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Output
from
Aquatic
Life
(
Sub
3)
10:
29
Friday,
November
29,
2002
AWQC
Eliminations
and
Reductions
Number
of
Ohio
Reaches
The
MEANS
Procedure
Variable
Label
Sum
                                                         
elim1_
1
Elim.
Chronic
(
Opt1)
0
207
207
elim2_
1
Elim.
Chronic
(
Opt2)
8.0000000
elim1_
2
Elim.
Acute
(
Opt1)
0
elim2_
2
Elim.
Acute
(
Opt2)
4.0000000
red1_
1
Redu.
Chronic
(
Opt1)
1.0000000
red2_
1
Redu.
Chronic
(
Opt2)
7.0000000
red1_
2
Redu.
Acute
(
Opt1)
1.0000000
red2_
2
Redu.
Acute
(
Opt2)
0
reduc1
Total
Reaches
Reducing
(
Opt1)
1.0000000
reduc2
Total
Reaches
Reducing
(
Opt2)
7.0000000
                                                         
MPM
Ohio
CS
Benefits
(
Opt1=
Final
No
GMs,
Opt2=
none)
29NOV02
Output
from
Aquatic
Life
(
Sub
3)
10:
29
Friday,
November
29,
2002
Exceedences
by
Chemical
C
H
c
c
c
c
c
c
E
h
h
h
h
h
h
M
n
n
n
n
n
n
e
e
e
e
e
e
I
t
t
t
t
t
t
m
m
m
m
m
m
O
C
c
c
c
a
a
a
l
l
l
l
l
l
c
c
c
a
a
a
b
A
r
r
r
c
c
c
b
1
2
b
1
2
r
r
r
c
c
c
s
L
b
1
2
b
1
2
w
w
w
o
o
o
b
1
2
b
1
2
1
Aluminum
2
2
.
1
1
.
2
2
.
1
1
.
1
1
0
1
1
0
2
Aniline
1
.
.
.
.
.
1
.
.
.
.
.
1
0
0
0
0
0
3
Anthracene
1
.
.
1
.
.
1
.
.
1
.
.
1
0
0
1
0
0
4
Cadmium
1
.
.
1
.
.
1
.
.
1
.
.
1
0
0
1
0
0
5
Carbon
disulfide
1
.
.
.
.
.
1
.
.
.
.
.
1
0
0
0
0
0
6
Copper
15
15
13
13
13
11
15
15
13
13
13
11
1
1
1
1
1
1
7
Cyanide
2
2
.
2
2
.
2
2
.
2
2
.
1
1
0
1
1
0
8
Iron
1
.
.
.
.
.
1
.
.
.
.
.
1
0
0
0
0
0
9
Lead
10
10
.
1
1
.
10
10
.
1
1
.
1
1
0
1
1
0
10
Selenium
1
.
.
.
.
.
1
.
.
.
.
.
1
0
0
0
0
0
11
Silver
1
1
.
.
.
.
1
1
.
.
.
.
1
1
0
0
0
0
12
Sulfide
9
9
.
.
.
.
9
9
.
.
.
.
1
1
0
0
0
0
13
Tin
5
5
.
.
.
.
5
5
.
.
.
.
1
1
0
0
0
0
14
Vanadium
1
.
.
.
.
.
1
.
.
.
.
.
1
0
0
0
0
0
15
Zinc
1
1
.
1
1
.
1
1
.
1
1
.
1
1
0
1
1
0
208
208
"
TKN
from
event
loadings.
sas"
Create
a
dataset
of
TKN
only
loadings
from
the
MP&
M
facilities
in
Ohio.
209
209
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
TKN
from
event
loadings.
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
08/
24/
2000
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
This
program
pulls
data
from
the
generation
of
loadings
based
on
the
*/
/*
method
used
in
the
National
Analysis.
This
is
used
only
for
lakes,
bays,
*/
/*
and
oceans
which
are
not
modeled
by
the
decay
model.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

libname
ohio
v6
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
static";
libname
rundat
v6
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
Final
(
No
GMs)";

/*****************************************************************************/
/*
Pull
in
the
data
set
and
generate
concentrations
*/
/*****************************************************************************/

proc
sql;

create
table
prftkn
as
select
reachnmb,
(
base/
evnt_
flo)
as
tkn_
b,(
treat1/
evnt_
flo)
as
tkn_
1,
(
treat2/
evnt_
flo)
as
tkn_
2
from
rundat.
event_
ld
where
casno
=
"
C021";

create
table
prftkn2
as
select
reachnmb,
sum(
tkn_
b)
as
tknb,
sum(
tkn_
1)
as
tkn1,
sum(
tkn_
2)
as
tkn2
from
prftkn
group
by
reachnmb
order
by
reachnmb;
quit;

data
both;
set
prftkn2;
by
reachnmb;

if
tknb=.
then
tknb=
0;
if
tkn1=.
then
tkn1=
0;
210
210
if
tkn2=.
then
tkn2=
0;

tknb
=
tknb*
0.001;
tkn1
=
tkn1*
0.001;
tkn2
=
tkn2*
0.001;
keep
reachnmb
tknb
tkn1
tkn2;
run;

/*****************************************************************************/
/*
Save
the
output
data
set
for
incorporation
in
the
RUM
*/
/*****************************************************************************/

data
rundat.
mpmtkn;
set
both;
run;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
211
211
"
Pull
out
TKN
only.
sas"
Create
a
dataset
of
TKN
only
loadings
from
the
Water
Quality
Model.
212
212
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Pull
out
TKN
only.
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
08/
23/
2000
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
Pull
out
the
concentrations
from
the
decay
model
output
for
TKN
only.
*/
/*
This
is
used
for
the
RUM
model
of
Ohio
to
estimate
recreational
beenfits
*/
/*
associated
with
the
regulation.
*/
/*

*/
/*
The
chemical
cas
number
(
casno)
for
TKN
is
"
C021"
*/
/*****************************************************************************/

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

libname
ohio
v6
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
Static";
libname
rundat
v6
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
Final
(
No
GMs)";

/*****************************************************************************/
/*
Pull
in
the
concentration
file
and
keep
only
the
TKN
data.
*/
/*
The
low
flow
estimates
are
used
as
the
TKN
affects
aquatic
life
and
the
*/
/*
overall
quality
of
the
reach.
*/
/*****************************************************************************/

proc
sql;

create
table
prefs
as
select
onreach
as
reachnmb,
casno,
sum(
baseconc)
as
base,
sum(
t1conc)
as
treat1,
sum(
t2conc)
as
treat2,
avg(
weight)
as
weight
from
rundat.
fnllow
where
casno
=
"
C021"
group
by
onreach,
casno
order
by
reachnmb,
casno;
quit;

/*****************************************************************************/
/*
Save
the
TKN
data
for
merging
into
the
data
for
the
RUM
*/
/*****************************************************************************/
213
213
data
rundat.
brdtkn;
set
prefs;
run;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
214
214
"
Merge
TKN
for
Ohio
Reaches.
sas"
Merge
the
TKN
loadings
from
the
final
option
and
apply
percentage
changes
to
the
underlying
TKN
values
at
the
RF1
reaches
in
Ohio.
215
215
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Alt
Merge
TKN
for
Ohio
Reaches.
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
08/
24/
2000
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
This
program
merges
the
TKN
loadings
for
the
baseline
and
three
options
*/
/*
into
the
RUM
dataset.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

libname
ohio
v6
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
static";
libname
rundat
v6
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
Final
(
No
GMs)";
libname
rum
v6
"
H:\
ENVR\
Smithse\
Rum3\
Data\
Water
Quality";

/*****************************************************************************/
/*
Pull
in
the
decay
model
TKN
concentrations
and
rename
variables
*/
/*****************************************************************************/

data
brad2;
set
rundat.
brdtkn;

tknb
=
base;
tkn1
=
treat1;
tkn2
=
treat2;

keep
reachnmb
tknb
tkn1
tkn2;
run;

/*****************************************************************************/
/*
Merge
Decay
model
and
MPM
model
data
*/
/*****************************************************************************/

data
bigm;
merge
brad2
rundat.
mpmtkn;
by
reachnmb;

rf1num
=
reachnmb;

tknb
=
tknb/
1000;
216
216
tkn1
=
tkn1/
1000;
tkn2
=
tkn2/
1000;

pct1
=
(
tknb­
tkn1)/
tknb;
pct2
=
(
tknb­
tkn2)/
tknb;

keep
rf1num
tknb
tkn1
tkn2
pct1
pct2;
run;

/*****************************************************************************/
/*
Map
into
the
RUM
reach
dataset
*/
/*****************************************************************************/

data
oldwq;
set
rum.
rch_
info;
pct1=
0;
pct2=
0;
run;

proc
sort;
by
rf1num;
quit;

data
full;
merge
oldwq
bigm;
by
rf1num;

if
tknb=.
then
tknb=
0;
if
tkn1=.
then
tkn1=
0;
if
tkn2=.
then
tkn2=
0;

if
rf1id=.
then
delete;
run;

data
full2;
set
full;

tkna1
=
tkn1;
tkna2
=
tkn2;

/*
if
tkn
>
0
then
do;
temp
=
tknb;
tknb
=
tkn;
if
(
temp
­
tkn1)
>
tkn
then
tkn1=
0;
else
tkn1
=
tkn1
­
(
temp­
tkn1);
if
(
temp
­
tkn2)
>
tkn
then
tkn2=
0;
else
tkn2
=
tkn2
­
(
temp­
tkn2);
end;*/

/*
if
tknb
<
max(
tkn1,
tkn2)
then
tknb
=
max(
tkn1,
tkn2);*/

if
pct1=.
then
pct1=
0;
if
pct2=.
then
pct2=
0;

tkn1
=
tkn*(
1­
pct1);
tkn2
=
tkn*(
1­
pct2);
217
217
tknb
=
tkn;

if
tkn1
<
0
then
tkn1=
0;
if
tkn2
<
0
then
tkn2=
0;
run;

/*****************************************************************************/
/*
Save
the
RUM
data
set
with
the
updated
TKN
data
for
the
regulation
*/
/*****************************************************************************/

data
rum.
rch_
info;
set
full2;
run;

/*****************************************************************************/
/*
Get
Average
percent
reduction
in
TKN
for
lakes
and
rivers
*/
/*****************************************************************************/

data
avg;
set
full2;

if
pct1=
0
then
delete;

pct1
=
pct1*
100;
pct2
=
pct2*
100;

keep
pct1
pct2
river;
run;

proc
sort
data=
avg;
by
river;
quit;
proc
means
data=
avg(
keep
=
river
pct1
pct2);
by
river;
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
218
218
Program
Output
219
219
The
SAS
System
16:
00
Friday,
November
29,
2002
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
The
site
is
a
river
(=
1)=
0
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

The
MEANS
Procedure
Variable
N
Mean
Std
Dev
Minimum
Maximum
                                                                              
PCT1
10
0.5455653
1.7252093
5.4879261E­
9
5.4555971
PCT2
10
10.4782671
31.4698952
0.0012838
100.0000000
                                                                              
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
The
site
is
a
river
(=
1)=
1
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Variable
N
Mean
Std
Dev
Minimum
Maximum
                                                                              
PCT1
12
0.4499977
1.0662934
1.7377192E­
9
3.6784921
PCT2
12
59.7102059
49.8018532
0.7565155
100.0000000
                                                                              
220
220
"
Alt
Merge
AWQC
Exc
for
Ohio
Reaches.
sas"
Merge
in
the
baseline
and
changes
in
AWQC
exceedences.
221
221
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Merge
AWQC
Exc
for
Ohio
Reaches.
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith
*/
/*
Date:
08/
23/
2000
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
This
program
merges
the
AWQC
exceedences
for
the
baseline
and
two
*/
/*
options
into
on
set
for
matching
to
the
RUM
dataset.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

libname
ohio
v6
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
static";
libname
rundat
v6
"
H:\
ENVR\
Smithse\
mpm_
ohio\
Input
Data\
Final
(
No
GMs)";
libname
rum
v6
"
H:\
ENVR\
Smithse\
Rum3\
Data\
Water
Quality";

/*****************************************************************************/
/*
Sum
the
exceedences
across
chemicals
for
each
reach
*/
/*****************************************************************************/

proc
sql;

create
table
pref
as
select
reachnmb,
sum(
chronicb)
as
chb,
sum(
chronic1)
as
ch1,
sum(
chronic2)
as
ch2,
sum(
acuteb)
as
acb,
sum(
acute1)
as
ac1,
sum(
acute2)
as
ac2
from
rundat.
rec_
al
group
by
reachnmb
order
by
reachnmb;

create
table
prefh
as
select
reachnmb,
sum(
orgh2o_
b)
as
h2ob,
sum(
orgh2ot1)
as
h2o1,
sum(
orgh2ot2)
as
h2o2,
sum(
org_
b)
as
orgb,
sum(
org_
t1)
as
org1,
sum(
org_
t2)
as
org2
from
rundat.
rec_
hh
group
by
reachnmb
order
by
reachnmb;
quit;

/*****************************************************************************/
/*
Determine
the
baseline
and
policy
exceedences
*/
/*****************************************************************************/
222
222
data
pref2;
merge
pref
prefh;
by
reachnmb;

if
chb=.
then
chb=
0;
if
ch1=.
then
ch1=
0;
if
ch2=.
then
ch2=
0;
if
acb=.
then
acb=
0;
if
ac1=.
then
ac1=
0;
if
ac2=.
then
ac2=
0;
if
h2ob=.
then
h2ob=
0;
if
h2o1=.
then
h2o1=
0;
if
h2o2=.
then
h2o2=
0;
if
orgb=.
then
orgb=
0;
if
org1=.
then
org1=
0;
if
org2=.
then
org2=
0;

/****************************************************************************/
/*
If
the
number
of
baseline
chronic
and
acute
eceedences
plus
the
number
of*/
/*
human
health
h20
and
org
only
is
greater
than
1
*/
/*
then
set
the
baseline
awqc
variable
to
1
(
yes,
there
are
exceedences
*/
/****************************************************************************/

if
(
h2ob
+
orgb
+
chb
+
acb)
>
0
then
awqc_
ex
=
1;
else
awqc_
ex
=
0;

/****************************************************************************/
/*
Under
the
policy
scenarios,
some
but
not
all
of
the
exceedences
may
be
*/
/*
may
be
removed.
The
awqc
variable
is
thus
generated
as
1
minus
the
ratio
*/
/*
of
the
removed
exceedences
to
the
baseline
exceedences.
If
all
are
*/
/*
removed,
then
the
policy
awqc
is
0
(
no
eceedences),
otherwise
it
is
1
if
*/
/*
none
are
removed
or
some
fraction
if
some
of
the
exceedences
are
removed.*/
/****************************************************************************/

awqcalt1
=
1
­(((
h2ob+
orgb+
chb+
acb)­(
h2o1+
org1+
ch1+
ac1))/(
h2ob+
orgb+
chb+
acb));
awqcalt2
=
1
­(((
h2ob+
orgb+
chb+
acb)­(
h2o2+
org2+
ch2+
ac2))/(
h2ob+
orgb+
chb+
acb));

keep
reachnmb
awqc_
ex
awqcalt1
awqcalt2;
run;

proc
print
data=
pref2;
quit;

/*****************************************************************************/
/*
Rename
a
variable
*/
/*****************************************************************************/

data
both;
set
pref2;
rf1num
=
reachnmb;
drop
reachnmb;
run;
223
223
/*****************************************************************************/
/*
Map
into
the
RUM
reach
dataset
*/
/*****************************************************************************/

data
oldwq;
set
rum.
rch_
info;
drop
awqc_
ex
awqcalt1
awqcalt2;
run;

proc
sort;
by
rf1num;
quit;

data
full;
merge
oldwq
both;
by
rf1num;

if
awqc_
ex
=
.
then
awqc_
ex=
0;
if
awqcalt1=.
then
awqcalt1=
0;
if
awqcalt2
=.
then
awqcalt2=
0;
if
rf1id=.
then
delete;
run;

proc
freq
data=
full(
keep
=
awqc_
ex
awqcalt1
awqcalt2);
quit;

data
rum.
rch_
info;
set
full;
if
rf1id
=
.
then
delete;
run;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
224
224
Program
Output
225
225
The
SAS
System
16:
00
Friday,
November
29,
2002
The
FREQ
Procedure
Cumulative
Cumulative
awqc_
ex
Frequency
Percent
Frequency
Percent
                                                            
0
1908
97.65
1908
97.65
1
46
2.35
1954
100.00
Cumulative
Cumulative
awqcalt1
Frequency
Percent
Frequency
Percent
                                                             
0
1908
97.65
1908
97.65
0.5
3
0.15
1911
97.80
1
43
2.20
1954
100.00
Cumulative
Cumulative
awqcalt2
Frequency
Percent
Frequency
Percent
                                                             
0
1941
99.33
1941
99.33
0.4
5
0.26
1946
99.59
0.5
3
0.15
1949
99.74
1
5
0.26
1954
100.00
226
226
Recreational
Fishing
227
227
"
Fishing
Welfare.
sas"
Estimate
the
per
trip
and
seasonal
welfare
gains
from
fishing
due
to
changes
in
TKN
and
AWQC
exceedences
from
the
final
option.
228
228
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Fishing
Welfare.
sas
*/
/*
Author:
Abt
Associates
Inc.,
Stuart
Smith
*/
/*
Date:
unknown
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
This
program
estimates
the
per
trip
and
seasonal
welfare
for
fishing.
*/
/*****************************************************************************/

libname
lori
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Distance
Matrix';
/*
Distance
Matrix
*/
libname
library
'
H:\
ENVR\
Smithse\
Rum3\
Data\
lib';
/*
Format
Codes
*/
libname
demogr
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Respondents';
/*
Respondent
Data
*/
libname
reach
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Water
Quality';
/*
Reach
Attributes
Data
*/
libname
rand
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Random
Draws\
Models
3_
17_
02';
/*
Random
Data
Folder
*/

/*
Setup
some
macro
variables
*/
%
let
activity=
fisher;
%
let
finalSet=
fish_
trp;
%
let
polawqc=
awqcalt1;
%
let
poltkn
=
tkn1;
%
let
pollbl
=
Final
(
No
GMs);

/*
Site
attributes
and
water
quality
variables
*/

data
attr;
set
reach.
rch_
info;

/*
Get
index
for
distance
data
*/

dsta=
input(
put(
rf1id,
rch_
fmt.),
4.);
if
dsta=
9999
then
put
'
bad
observation';

if
tkn1=
0
then
tkn1=
tknb;
if
tkn2=
0
then
tkn2=
tknb;

/*
For
rivers
and
great
lakes
use
log
of
reach
length,
for
lakes
calculate
the
log
of
the
lake's
circumference
*/

if
river=
1
or
glake=
1
then
do;
if
rch_
len
^=
0
then
rchsze=
log(
rch_
len);
else
rch_
len
=
0;
end;
229
229
else
do;
/*
small
lakes
*/
pi
=
3.141592654;
area
=
exp(
ln_
acre)*
0.0015625;
/*
convert
log
of
acres
to
square
miles
*/
rad
=
sqrt(
area/
pi);
circ
=
2*
rad*
pi;
rchsze=
log(
circ);
end;

/*
Fish
Abundance
Measure
*/
/*
Standardized
Fish300m
generated
for
all
sites
in
Ohio
*/

if
fish300m=.
then
do;
if
river=
1
then
fish300m
=
625.28;
if
glake=
1
then
fish300m
=
259.99;
if
river=
0
and
glake=
0
then
fish300m
=
314.22;
end;
fish100m
=
fish300m/
3;
fish1m
=
fish300m/
300;

/*
Fish
Abundance
Measure
*/
/*
fill
in
with
average
by
waterbody
type
*/

if
wght300m
=.
then
do;
if
river=
1
then
wght300m
=
6.519;
if
glake=
1
then
wght300m
=
5.021;
if
river=
0
and
glake=
0
then
wght300m
=
9.173;
end;

/*
Convert
wght300m
from
kg
to
lbs
using
1kg
=
2.20462
lbs
*/

wgt_
300m
=
wght300m*
2.20462;

sqrwght
=
sqrt(
wgt_
300m);

if
iwb2=.
then
do;
if
river=
1
then
iwb2=
7.75;
if
glake=
1
then
iwb2=
7.46;
if
river=
0
and
glake=
0
then
iwb2=
7.28;
end;

keep
dsta
river
glake
ramp
rchsze
tkn
awqc_
ex
sqrwght
tkn1
awqcalt1
awqcalt2
tkn2
tknb;
run;

/*
Open
the
demographic
data
file
and
get
chosen
site
id#
*/
data
initial;
set
demogr.
fullset2;

if
&
activity
=
0
then
delete;

zipid=
input(
put(
home,
zip_
fmt.),
3.0);
if
zipid
=
999
then
put
'
ZIPID
MISMATCH!!!
Respnum
=
'
respnum;
if
zipid
=
999
then
delete;
230
230
array
ds{*}
_
1­_
1954;

set
lori.
matrix4
point=
zipid;

ivsumgl=
0;
ivsumriv=
0;
ivsumlake=
0;
ivpolgl=
0;
ivpolriv=
0;

do
i=
1
to
1954;
set
attr
point=
i;

/*
Create
Cost
of
trip
variables
*/
/*
Trip
cost,
applies
opportunity
cost
only
to
those
who
would
have
worked
*/
if
unempl=
1
or
home_
mk=
1
or
retired=
1
then
apply=
0;
else
apply=
1;
trpcost
=
0.29*
ds(
dsta)*
2
+
(
wage*(
ds(
dsta)/
40))*
2*
apply;

/*
Time
cost
only
applies
if
income
not
lost
*/
if
apply=
1
then
timcost=
0;
else
timcost=
(
ds(
dsta)/
40)*
2;

dist
=
ds(
dsta);

if
glake=
1
and
dist
<=
250
then
do;

iv_
gl
=
exp((­
0.0443*
trpcost
­
1.4743*
timcost
+
0.8777*
ramp
+
0.9083*
rchsze
­
0.5845*
tknb
­
0.5730*
awqc_
ex
+
1.411)/
0.8112);
ivpol_
gl
=
exp((­
0.0443*
trpcost
­
1.4743*
timcost
+
0.8777*
ramp
+
0.9083*
rchsze
­
0.5845*&
poltkn
­
0.5730*&
polawqc
+
1.411)/
0.8112);
ivsumgl=
ivsumgl+
iv_
gl;
ivpolgl=
ivpolgl+
ivpol_
gl;
end;
if
river
=
1
and
dist
<=
120
then
do;

iv_
riv
=
exp((­
0.0443*
trpcost
­
1.4743*
timcost
+
0.8777*
ramp
+
0.1706*
rchsze
+
0.0678*
sqrwght
­
0.5845*
tknb
­
0.5730*
awqc_
ex
+
4.445)/
0.5910);
ivpol_
riv
=
exp((­
0.0443*
trpcost
­
1.4743*
timcost
+
0.8777*
ramp
+
0.1706*
rchsze
+
0.0678*
sqrwght
­
0.5845*&
poltkn
­
0.5730*&
polawqc
+
4.445)/
0.5910);
ivsumriv=
ivsumriv+
iv_
riv;
ivpolriv=
ivpolriv+
ivpol_
riv;
end;
if
river
=
0
and
glake
=
0
and
dist
<=
120
then
do;

iv_
lake
=
exp((­
0.0443*
trpcost
­
1.4743*
timcost
+
0.8777*
ramp
+
0.0497*
rchsze
+
2.128)/
0.4287);
ivsumlake=
ivsumlake+
iv_
lake;
end;
end;

sumgl
=
0.8112*
log(
ivsumgl);
sumriv
=
0.5910*
log(
ivsumriv);
sumlake
=
0.4287*
log(
ivsumlake);
polgl
=
0.8112*
log(
ivpolgl);
polriv
=
0.5910*
log(
ivpolriv);
231
231
ivbase=
log(
exp(
sumgl)
+
exp(
sumriv)
+
exp(
sumlake));
ivpol=
log(
exp(
polgl)
+
exp(
polriv)
+
exp(
sumlake));

welf
=
(
ivpol­
ivbase)/
0.0443;
swelf
=
((
ivpol­
ivbase)*
numvis)/
0.0443;

seasbase
=
(
ivbase*
numvis)/
0.0443;
seaspol
=
(
ivpol*
numvis)/
0.0443;
diff
=
seaspol
­
seasbase;
pctchng
=
(
swelf/
seasbase)*
100;
run;

title
"
Fishing
Welfare
Estimates
­
Per
Trip
&
pollbl";
proc
means
data=
initial;
var
ivbase
ivpol
welf
swelf
seasbase
seaspol
diff
pctchng;
quit;
proc
means
median
data=
initial;
var
ivbase
ivpol
welf
swelf
seasbase
seaspol
diff
pctchng;
quit;

data
calctrp;
set
initial;

if
kids6
>
0
then
yngkids=
1;
else
yngkids=
0;
if
kid7_
15
>
0
then
oldkids=
1;
else
oldkids=
0;

base
=
exp(
0.82*
ivbase
­
1.08*
nohs
­
0.40*
college
­
1.44*
black
­
0.044*
age
+
2.22*
male
­
0.95*
yngkids
+
1.11*
oldkids
­
5.74);

policy
=
exp(
0.82*
ivpol
­
1.08*
nohs
­
0.40*
college
­
1.44*
black
­
0.044*
age
+
2.22*
male
­
0.95*
yngkids
+
1.11*
oldkids
­
5.74);

addnl
=
policy­
base;
newtot
=
numvis
+
addnl;

/*
Calculate
seasonal
welfare
lower
and
upper
bounds
*/
swelf_
l
=
((
ivpol
­
ivbase)*
numvis)/
0.0443;
swelf_
u
=
((
ivpol
­
ivbase)*
newtot)/
0.0443;

/*
Calculate
percentage
changes
in
value
*/
baselow
=
(
ivbase*
numvis)/
0.0443;
basepol
=
(
ivpol*
numvis)/
0.0443;
difflow
=
basepol
­
baselow;

basehgh
=
(
ivbase*
newtot)/
0.0443;
basepol2
=
(
ivpol*
newtot)/
0.0443;
diffhgh
=
basepol2
­
basehgh;

pctlow
=
(
swelf_
l/
baselow)*
100;
pctup
=
(
swelf_
u/
baselow)*
100;

pcttrp
=
(
addnl/
numvis)*
100;
run;
232
232
title
"
Fishing
Welfare
Estimates
­
Trip
Model
&
pollbl";
proc
means
data=
calctrp;
var
swelf_
l
swelf_
u
pctlow
pctup
baselow
difflow
basehgh
diffhgh
base
policy
addnl
numvis
newtot
pcttrp;
quit;
proc
means
median
data=
calctrp;
var
swelf_
l
swelf_
u
pctlow
pctup
baselow
difflow
basehgh
diffhgh
base
policy
addnl
numvis
newtot
pcttrp;
quit;
233
233
Program
Output
234
234
Fishing
Welfare
Estimates
­
Per
Trip
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
N
Mean
Std
Dev
Minimum
Maximum
                                                                              
ivbase
86
6.2150192
0.7602027
1.1094289
7.3437733
ivpol
86
6.2156447
0.7600058
1.1094289
7.3437737
welf
86
0.0141186
0.0250541
0
0.1076722
swelf
86
0.1358075
0.5157617
0
4.3068884
seasbase
86
1834.21
3368.34
100.4964632
23509.87
seaspol
86
1834.35
3368.40
100.5066913
23509.87
diff
86
0.1358075
0.5157617
0
4.3068884
pctchng
86
0.0105494
0.0193419
0
0.0897115
                                                                              
Fishing
Welfare
Estimates
­
Per
Trip
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Median
                        
ivbase
6.3047226
ivpol
6.3054005
welf
0.000260232
swelf
0.0023772
seasbase
727.1145113
seaspol
727.4374403
diff
0.0023772
pctchng
0.000162657
                        
Fishing
Welfare
Estimates
­
Trip
Model
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Label
N
Mean
Std
Dev
Minimum
Maximum
                                                                                                                         
swelf_
l
86
0.1358075
0.5157617
0
4.3068884
swelf_
u
86
0.1358199
0.5157785
0
4.3069712
pctlow
86
0.0105494
0.0193419
0
0.0897115
pctup
86
0.0105520
0.0193461
0
0.0897169
baselow
86
1834.21
3368.34
100.4964632
23509.87
difflow
86
0.1358075
0.5157617
0
4.3068884
basehgh
86
1834.25
3368.33
100.5083433
23509.87
diffhgh
86
0.1358199
0.5157785
0
4.3069712
base
86
0.9395103
1.2655552
0.000261711
5.3349520
policy
86
0.9397699
1.2656312
0.000261711
5.3349674
addnl
86
0.000259662
0.000638966
0
0.0036203
NUMVIS
Number
of
trips
in
last
season
(
weight)
86
12.7441860
21.7754238
1.0000000
150.0000000
newtot
86
12.7444457
21.7753777
1.0000000
150.0000001
pcttrp
86
0.0088276
0.0390217
0
0.3496795
                                                                                                                         
Fishing
Welfare
Estimates
­
Trip
Model
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Label
Median
                                                                   
swelf_
l
0.0023772
swelf_
u
0.0023772
pctlow
0.000162657
pctup
0.000162657
baselow
727.1145113
difflow
0.0023772
basehgh
727.1364122
diffhgh
0.0023772
base
0.4845746
235
235
policy
0.4845757
addnl
5.5012202E­
6
NUMVIS
Number
of
trips
in
last
season
(
weight)
6.0000000
newtot
6.0000039
pcttrp
0.000072255
                                                                   
236
236
Recreational
Boating
237
237
"
Boating
Welfare.
sas"
Estimate
the
per
trip
and
seasonal
welfare
gains
from
boating
due
to
changes
in
TKN
and
AWQC
exceedences
from
the
final
option.
238
238
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Boating
Welfare.
sas
*/
/*
Author:
Abt
Associates
Inc.,
Stuart
Smith
*/
/*
Date:
unknown
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
This
program
estimates
the
per
trip
and
seasonal
welfare
for
boating.
*/
/*****************************************************************************/

libname
lori
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Distance
Matrix';
/*
Distance
Matrix
*/
libname
library
'
H:\
ENVR\
Smithse\
Rum3\
Data\
lib';
/*
Format
Codes
*/
libname
demogr
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Respondents';
/*
Respondent
Data
*/
libname
reach
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Water
Quality';
/*
Reach
Attributes
Data
*/
libname
rand
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Random
Draws\
Models
3_
17_
02';
/*
Random
Data
Folder
*/

/*
Setup
some
macro
variables
*/
%
let
activity=
boater;
%
let
polawqc=
awqcalt1;
%
let
poltkn
=
tkn1;
%
let
pollbl
=
Final
(
No
GMs);

/*
Site
attributes
and
water
quality
variables
*/

data
attr;
set
reach.
rch_
info;

/*
Get
index
for
distance
data
*/

dsta=
input(
put(
rf1id,
rch_
fmt.),
4.);
if
dsta=
9999
then
put
'
bad
observation';

if
tkn=
0
or
tkn=.
then
tkn=
0.719;
if
tkn1=
0
then
tkn1=
tknb;
if
tkn2=
0
then
tkn2=
tknb;

/*
For
rivers
and
great
lakes
use
log
of
reach
length,
for
lakes
calculate
the
log
of
the
lake's
circumference
*/

if
river=
1
or
glake=
1
then
do;
if
rch_
len
^=
0
then
rchsze=
log(
rch_
len);
else
rch_
len
=
0;
end;
239
239
else
do;
/*
small
lakes
*/
pi
=
3.141592654;
area
=
exp(
ln_
acre)*
0.0015625;
/*
convert
log
of
acres
to
square
miles
*/
rad
=
sqrt(
area/
pi);
circ
=
2*
rad*
pi;
rchsze=
log(
circ);
end;

/*
Fish
Abundance
Measure
*/
/*
Standardized
Fish300m
generated
for
all
sites
in
Ohio
*/

if
fish300m=.
then
do;
if
river=
1
then
fish300m
=
625.28;
if
glake=
1
then
fish300m
=
259.99;
if
river=
0
and
glake=
0
then
fish300m
=
314.22;
end;
fish100m
=
fish300m/
3;
fish1m
=
fish300m/
300;

/*
Fish
Abundance
Measure
*/
/*
fill
in
with
average
by
waterbody
type
*/

if
wght300m
=.
then
do;
if
river=
1
then
wght300m
=
6.519;
if
glake=
1
then
wght300m
=
5.021;
if
river=
0
and
glake=
0
then
wght300m
=
9.173;
end;

/*
Convert
wght300m
from
kg
to
lbs
using
1kg
=
2.20462
lbs
*/

wgt_
300m
=
wght300m*
2.20462;

sqrwght
=
sqrt(
wgt_
300m);

if
iwb2=.
then
do;
if
river=
1
then
iwb2=
7.75;
if
glake=
1
then
iwb2=
7.46;
if
river=
0
and
glake=
0
then
iwb2=
7.28;
end;

if
ramp=
1
or
boatrent=
1
or
dock=
1
or
sailbt=
1
then
boatable=
1;
else
boatable=
0;

keep
dsta
river
glake
ramp
rchsze
tkn
awqc_
ex
sqrwght
tkn1
awqcalt1
awqcalt2
tkn2
tknb
boatable;
run;

/*
Open
the
demographic
data
file
and
get
chosen
site
id#
*/
data
initial;
set
demogr.
fullset2;

if
&
activity
=
0
then
delete;
240
240
zipid=
input(
put(
home,
zip_
fmt.),
3.0);
if
zipid
=
999
then
put
'
ZIPID
MISMATCH!!!
Respnum
=
'
respnum;
if
zipid
=
999
then
delete;

array
ds{*}
_
1­_
1954;

set
lori.
matrix4
point=
zipid;

ivsumgl=
0;
ivsumriv=
0;
ivpolgl=
0;
ivpolriv=
0;

do
i=
1
to
1954;
set
attr
point=
i;

/*
Create
Cost
of
trip
variables
*/
/*
Trip
cost,
applies
opportunity
cost
only
to
those
who
would
have
worked
*/
if
unempl=
1
or
home_
mk=
1
or
retired=
1
then
apply=
0;
else
apply=
1;
trpcost
=
0.29*
ds(
dsta)*
2
+
(
wage*(
ds(
dsta)/
40))*
2*
apply;

/*
Time
cost
only
applies
if
income
not
lost
*/
if
apply=
1
then
timcost=
0;
else
timcost=
(
ds(
dsta)/
40)*
2;

dist
=
ds(
dsta);

if
glake=
1
and
boatable=
1
and
dist
<=
250
then
do;

iv_
gl
=
exp((­
0.0443*
trpcost
­
0.362*
timcost
+
0.502*
rchsze
­
0.130*
sqrwght
­
1.187*
tknb
­
0.172*
awqc_
ex
+
1.17)/
0.296);
ivpol_
gl
=
exp((­
0.0443*
trpcost
­
0.362*
timcost
+
0.502*
rchsze
­
0.130*
sqrwght
­
1.187*&
poltkn
­
0.172*&
polawqc
+
1.17)/
0.296);
ivsumgl=
ivsumgl+
iv_
gl;
ivpolgl=
ivpolgl+
ivpol_
gl;
end;
if
glake
=
0
and
boatable=
1
and
dist
<=
120
then
do;

iv_
riv
=
exp((­
0.0443*
trpcost
­
0.362*
timcost
+
0.502*
rchsze
­
0.017*
sqrwght
­
1.187*
tknb
­
0.172*
awqc_
ex
+
3.183)/
0.088);
ivpol_
riv
=
exp((­
0.0443*
trpcost
­
0.362*
timcost
+
0.502*
rchsze
­
0.017*
sqrwght
­
1.187*&
poltkn
­
0.172*&
polawqc
+
3.183)/
0.088);
ivsumriv=
ivsumriv+
iv_
riv;
ivpolriv=
ivpolriv+
ivpol_
riv;
end;
end;

sumgl
=
0.296*
log(
ivsumgl);
sumriv
=
0.088*
log(
ivsumriv);
polgl
=
0.296*
log(
ivpolgl);
polriv
=
0.088*
log(
ivpolriv);

ivbase=
log(
exp(
sumgl)
+
exp(
sumriv));
ivpol=
log(
exp(
polgl)
+
exp(
polriv));
241
241
welf
=
(
ivpol­
ivbase)/
0.0443;
swelf
=
((
ivpol­
ivbase)*
numvis)/
0.0443;

seasbase
=
(
ivbase*
numvis)/
0.0443;
seaspol
=
(
ivpol*
numvis)/
0.0443;
diff
=
seaspol
­
seasbase;
pctchng
=
(
swelf/
seasbase)*
100;
run;

title
"
Boating
Welfare
Estimates
­
Per
Trip
&
pollbl";
proc
means
data=
initial;
var
ivbase
ivpol
welf
swelf
seasbase
seaspol
diff
pctchng;
quit;
proc
means
median
data=
initial;
var
ivbase
ivpol
welf
swelf
seasbase
seaspol
diff
pctchng;
quit;

data
calctrp;
set
initial;

if
kids6
>
0
then
yngkids=
1;
else
yngkids=
0;
if
kid7_
15
>
0
then
oldkids=
1;
else
oldkids=
0;

base
=
exp(
0.12*
ivbase
+
1.29*
nohs
­
0.19*
college
­
3.74*
black
­
0.067*
age
+
1.22*
male
+
1.51*
yngkids
­
1.67*
oldkids
+
3.82*
own_
boat
+
0.20);

policy
=
exp(
0.12*
ivpol
+
1.29*
nohs
­
0.19*
college
­
3.74*
black
­
0.067*
age
+
1.22*
male
+
1.51*
yngkids
­
1.67*
oldkids
+
3.82*
own_
boat
+
0.20);

/*
Calculate
the
difference
in
the
number
of
trips
These
trips
are
attributable
to
fishing
as
only
its
IV
changes
*/

addnl
=
policy­
base;
newtot
=
numvis
+
addnl;

/*
Calculate
seasonal
welfare
upper
and
lower
bounds
*/
swelf_
l
=
((
ivpol­
ivbase)*
numvis)/
0.0443;
swelf_
u
=
((
ivpol­
ivbase)*
newtot)/
0.0443;

/*
Calculate
the
percentage
change
in
value
*/
baselow
=
(
ivbase*
numvis)/
0.0443;
basepol
=
(
ivpol*
numvis)/
0.0443;
difflow
=
basepol­
baselow;

basehgh
=
(
ivbase*
newtot)/
0.0443;
basepol2
=
(
ivpol*
newtot)/
0.0443;
diffhgh
=
basepol2­
basehgh;

pctlow
=
(
swelf_
l/
baselow)*
100;
pctup
=
(
swelf_
u/
baselow)*
100;

pcttrp
=
(
addnl/
numvis)*
100;
run;
242
242
title
"
Boating
Welfare
Estimates
­
Trip
Model
&
pollbl";
proc
means
data=
calctrp;
var
swelf_
l
swelf_
u
pctlow
pctup
baselow
difflow
basehgh
diffhgh
base
policy
addnl
numvis
newtot
pcttrp;
quit;

proc
means
median
data=
calctrp;
var
swelf_
l
swelf_
u
pctlow
pctup
baselow
difflow
basehgh
diffhgh
base
policy
addnl
numvis
newtot
pcttrp;
quit;
243
243
Program
Output
244
244
Boating
Welfare
Estimates
­
Per
Trip
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
N
Mean
Std
Dev
Minimum
Maximum
                                                                              
ivbase
80
3.8084374
0.5953241
1.8882403
4.7822165
ivpol
80
3.8084404
0.5953207
1.8882403
4.7822165
welf
80
0.000069324
0.000478735
0
0.0042390
swelf
80
0.000212761
0.0011753
0
0.0096159
seasbase
80
537.5443544
756.7323036
42.6239345
4125.01
seaspol
80
537.5445671
756.7323629
42.6239345
4125.01
diff
80
0.000212761
0.0011753
0
0.0096159
pctchng
80
0.000098219
0.000662781
0
0.0058401
                                                                              
Boating
Welfare
Estimates
­
Per
Trip
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Median
                        
ivbase
3.9608499
ivpol
3.9608503
welf
7.799129E­
12
swelf
4.474976E­
11
seasbase
196.9035885
seaspol
196.9035901
diff
4.479261E­
11
pctchng
8.333096E­
12
                        
Boating
Welfare
Estimates
­
Trip
Model
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Label
N
Mean
Std
Dev
Minimum
Maximum
                                                                                                                         
swelf_
l
80
0.000212761
0.0011753
0
0.0096159
swelf_
u
80
0.000212762
0.0011753
0
0.0096159
pctlow
80
0.000098219
0.000662781
0
0.0058401
pctup
80
0.000098220
0.000662793
0
0.0058402
baselow
80
537.5443544
756.7323036
42.6239345
4125.01
difflow
80
0.000212761
0.0011753
0
0.0096159
basehgh
80
537.5444573
756.7323033
42.6239345
4125.01
diffhgh
80
0.000212762
0.0011753
0
0.0096159
base
80
13.8359183
43.1743339
0.0314483
357.9988782
policy
80
13.8359195
43.1743369
0.0314483
357.9989063
addnl
80
1.2653717E­
6
5.0682513E­
6
0
0.000029040
NUMVIS
Number
of
trips
in
last
season
(
weight)
81
6.2345679
8.0284986
1.0000000
40.0000000
newtot
80
6.0625013
7.9274300
1.0000000
40.0000000
pcttrp
80
0.000048252
0.000238882
0
0.0018782
                                                                                                                         
Boating
Welfare
Estimates
­
Trip
Model
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Label
Median
                                                                   
swelf_
l
4.474976E­
11
swelf_
u
4.474976E­
11
pctlow
8.333096E­
12
pctup
8.333096E­
12
baselow
196.9035885
difflow
4.479261E­
11
basehgh
196.9035889
diffhgh
4.467893E­
11
base
1.2420408
245
245
policy
1.2420408
addnl
1.434824E­
13
NUMVIS
Number
of
trips
in
last
season
(
weight)
3.0000000
newtot
2.5000025
pcttrp
8.942846E­
12
                                                                   
246
246
Near­
water
Recreation
(
Viewing)
247
247
"
Viewing
Welfare.
sas"
Estimate
the
per
trip
and
seasonal
welfare
gains
from
viewing
due
to
changes
in
TKN
and
AWQC
exceedences
from
the
final
option.
248
248
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Viewing
Welfare.
sas
*/
/*
Author:
Abt
Associates
Inc.,
Stuart
Smith
*/
/*
Date:
unknown
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
This
program
estimates
the
per
trip
and
seasonal
welfare
for
viewing.
*/
/*****************************************************************************/

libname
lori
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Distance
Matrix';
/*
Distance
Matrix
*/
libname
library
'
H:\
ENVR\
Smithse\
Rum3\
Data\
lib';
/*
Format
Codes
*/
libname
demogr
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Respondents';
/*
Respondent
Data
*/
libname
reach
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Water
Quality';
/*
Reach
Attributes
Data
*/
libname
rand
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Random
Draws\
Models
3_
17_
02';
/*
Random
Data
Folder
*/

/*
Setup
some
macro
variables
*/
%
let
activity=
viewer;
%
let
poltkn
=
tkn1;
%
let
pollbl
=
Final
(
No
GMs);

/*
Site
attributes
and
water
quality
variables
*/

data
attr;
set
reach.
rch_
info;

/*
Get
index
for
distance
data
*/

dsta=
input(
put(
rf1id,
rch_
fmt.),
4.);
if
dsta=
9999
then
put
'
bad
observation';

if
tkn=
0
or
tkn=.
then
tkn=
0.719;
if
tkn1=
0
then
tkn1=
tknb;
if
tkn2=
0
then
tkn2=
tknb;

/*
For
rivers
and
great
lakes
use
log
of
reach
length,
for
lakes
calculate
the
log
of
the
lake's
circumference
*/

if
river=
1
or
glake=
1
then
do;
if
rch_
len
^=
0
then
rchsze=
log(
rch_
len);
else
rch_
len
=
0;
end;
else
do;
/*
small
lakes
*/
pi
=
3.141592654;
area
=
exp(
ln_
acre)*
0.0015625;
/*
convert
log
of
acres
to
square
miles
*/
rad
=
sqrt(
area/
pi);
circ
=
2*
rad*
pi;
rchsze=
log(
circ);
end;

/*
Fish
Abundance
Measure
*/
/*
Standardized
Fish300m
generated
for
all
sites
in
Ohio
*/

if
fish300m=.
then
do;
if
river=
1
then
fish300m
=
625.28;
if
glake=
1
then
fish300m
=
259.99;
if
river=
0
and
glake=
0
then
fish300m
=
314.22;
end;
fish100m
=
fish300m/
3;
fish1m
=
fish300m/
300;

/*
Fish
Abundance
Measure
*/
249
249
/*
fill
in
with
average
by
waterbody
type
*/

if
wght300m
=.
then
do;
if
river=
1
then
wght300m
=
6.519;
if
glake=
1
then
wght300m
=
5.021;
if
river=
0
and
glake=
0
then
wght300m
=
9.173;
end;

/*
Convert
wght300m
from
kg
to
lbs
using
1kg
=
2.20462
lbs
*/

wgt_
300m
=
wght300m*
2.20462;

sqrwght
=
sqrt(
wgt_
300m);

if
iwb2=.
then
do;
if
river=
1
then
iwb2=
7.75;
if
glake=
1
then
iwb2=
7.46;
if
river=
0
and
glake=
0
then
iwb2=
7.28;
end;

if
river=
0
and
glake=
0
then
lake=
1;
else
lake=
0;

keep
dsta
river
glake
lake
rchsze
ln_
lndac
park
tkn1
tknb
tkn2;
run;

/*
Open
the
demographic
data
file
and
get
chosen
site
id#
*/
data
initial;
set
demogr.
fullset2;

if
&
activity
=
0
then
delete;

zipid=
input(
put(
home,
zip_
fmt.),
3.0);
if
zipid
=
999
then
put
'
ZIPID
MISMATCH!!!
Respnum
=
'
respnum;
if
zipid
=
999
then
delete;

array
ds{*}
_
1­_
1954;

set
lori.
matrix4
point=
zipid;

ivsum=
0;
ivpoly=
0;

do
i=
1
to
1954;
set
attr
point=
i;

/*
Create
Cost
of
trip
variables
*/
/*
Trip
cost,
applies
opportunity
cost
only
to
those
who
would
have
worked
*/
if
unempl=
1
or
home_
mk=
1
or
retired=
1
then
apply=
0;
else
apply=
1;
trpcost
=
0.29*
ds(
dsta)*
2
+
(
wage*(
ds(
dsta)/
40))*
2*
apply;

/*
Time
cost
only
applies
if
income
not
lost
*/
if
apply=
1
then
timcost=
0;
else
timcost=
(
ds(
dsta)/
40)*
2;

dist
=
ds(
dsta);

if
dist
<=
120
then
do;

iv_
sum
=
exp(­
0.0443*
trpcost
­
0.719*
timcost
­
0.273*
rchsze
+
0.162*
ln_
lndac
+
0.787*
park
+
0.665*
glake*
rchsze
­
0.261*
river*
rchsze
­
0.429*
lake*
rchsze
­
0.711*
tknb);
iv_
pol
=
exp(­
0.0443*
trpcost
­
0.719*
timcost
­
0.273*
rchsze
+
0.162*
ln_
lndac
+
0.787*
park
+
0.665*
glake*
rchsze
­
0.261*
river*
rchsze
­
0.429*
lake*
rchsze
­
0.711*&
poltkn);
ivsum=
ivsum+
iv_
sum;
ivpoly=
ivpoly+
iv_
pol;
end;
end;

ivbase=
log(
ivsum);
ivpol=
log(
ivpoly);

welf
=
(
ivpol­
ivbase)/
0.0443;
swelf
=
((
ivpol­
ivbase)*
numvis)/
0.0443;
250
250
seasbase
=
(
ivbase*
numvis)/
0.0443;
seaspol
=
(
ivpol*
numvis)/
0.0443;
diff
=
seaspol
­
seasbase;
pctchng
=
(
swelf/
seasbase)*
100;
run;

title
"
Viewing
Welfare
Estimates
­
Per
Trip
&
pollbl";
proc
means
data=
initial;
var
ivbase
ivpol
welf
swelf
seasbase
seaspol
diff
pctchng;
quit;
proc
means
median
data=
initial;
var
ivbase
ivpol
welf
swelf
seasbase
seaspol
diff
pctchng;
quit;

data
calctrp;
set
initial;

if
kids6
>
0
then
yngkids=
1;
else
yngkids=
0;
if
kid7_
15
>
0
then
oldkids=
1;
else
oldkids=
0;

base
=
exp(
0.47*
ivbase
+
0.099*
nohs
+
1.22*
college
­
1.16*
black
­
0.055*
age
+
0.91*
male
­
0.17*
yngkids
+
0.8*
oldkids
­
1.98);

policy
=
exp(
0.47*
ivpol
+
0.099*
nohs
+
1.22*
college
­
1.16*
black
­
0.055*
age
+
0.91*
male
­
0.17*
yngkids
+
0.8*
oldkids
­
1.98);

/*
Calculate
the
difference
in
the
number
of
trips
These
trips
are
attributable
to
fishing
as
only
its
IV
changes
*/

addnl
=
policy­
base;
newtot
=
numvis
+
addnl;

/*
Calculate
seasonal
welfare
upper
and
lower
bounds
*/
swelf_
l
=
((
ivpol­
ivbase)*
numvis)/
0.0443;
swelf_
u
=
((
ivpol­
ivbase)*
newtot)/
0.0443;

/*
Calculate
the
percentage
change
in
value
*/
baselow
=
(
ivbase*
numvis)/
0.0443;
basepol
=
(
ivpol*
numvis)/
0.0443;
difflow
=
basepol­
baselow;

basehgh
=
(
ivbase*
newtot)/
0.0443;
basepol2
=
(
ivpol*
newtot)/
0.0443;
diffhgh
=
basepol2­
basehgh;

pctlow
=
(
swelf_
l/
baselow)*
100;
pctup
=
(
swelf_
u/
baselow)*
100;

pcttrp
=
(
addnl/
numvis)*
100;
run;

title
"
Viewing
Welfare
Estimates
­
Trip
Model
&
pollbl";
proc
means
data=
calctrp;
var
swelf_
l
swelf_
u
pctlow
pctup
baselow
difflow
basehgh
diffhgh
base
policy
addnl
numvis
newtot
pcttrp;
quit;
proc
means
median
data=
calctrp;
var
swelf_
l
swelf_
u
pctlow
pctup
baselow
difflow
basehgh
diffhgh
base
policy
addnl
numvis
newtot
pcttrp;
quit;
251
251
Program
Output
252
252
Viewing
Welfare
Estimates
­
Per
Trip
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
N
Mean
Std
Dev
Minimum
Maximum
                                                                              
ivbase
87
2.4772760
1.6049957
­
7.4137864
4.4668404
ivpol
87
2.4777044
1.6049761
­
7.4137864
4.4668405
welf
87
0.0096698
0.0184138
0
0.0975195
swelf
87
0.0925649
0.2819847
0
1.5205279
seasbase
87
519.3094454
1198.32
­
2510.31
6450.29
seaspol
87
519.4020103
1198.46
­
2510.31
6450.34
diff
87
0.0925649
0.2819847
0
1.5205279
pctchng
87
0.0212306
0.0510988
­
0.000436886
0.2623980
                                                                              
Viewing
Welfare
Estimates
­
Per
Trip
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Median
                        
ivbase
2.9157925
ivpol
2.9158150
welf
0.000279622
swelf
0.0010928
seasbase
157.3137271
seaspol
157.3137515
diff
0.0010928
pctchng
0.000292431
                        
Viewing
Welfare
Estimates
­
Trip
Model
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Label
N
Mean
Std
Dev
Minimum
Maximum
                                                                                                                         
swelf_
l
87
0.0925649
0.2819847
0
1.5205279
swelf_
u
87
0.0925689
0.2819969
0
1.5205284
pctlow
87
0.0212306
0.0510988
­
0.000436886
0.2623980
pctup
87
0.0212329
0.0511067
­
0.000436886
0.2624272
baselow
87
519.3094454
1198.32
­
2510.31
6450.29
difflow
87
0.0925649
0.2819847
0
1.5205279
basehgh
87
519.3131523
1198.33
­
2510.31
6450.29
diffhgh
87
0.0925689
0.2819969
0
1.5205284
base
87
0.2628710
0.2836338
0.0013341
1.1445943
policy
87
0.2629380
0.2837273
0.0013341
1.1447587
addnl
87
0.000066985
0.000244531
0
0.0019616
NUMVIS
Number
of
trips
in
last
season
(
weight)
87
9.2298851
17.4427310
1.0000000
100.0000000
newtot
87
9.2299520
17.4427442
1.0000000
100.0000300
pcttrp
87
0.0017279
0.0063032
0
0.0542968
                                                                                                                         
Viewing
Welfare
Estimates
­
Trip
Model
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Label
Median
                                                                   
swelf_
l
0.0010928
swelf_
u
0.0010928
pctlow
0.000292431
pctup
0.000292432
baselow
157.3137271
difflow
0.0010928
basehgh
157.3137281
diffhgh
0.0010928
base
0.1405805
253
253
policy
0.1405807
addnl
1.9578361E­
6
NUMVIS
Number
of
trips
in
last
season
(
weight)
3.0000000
newtot
3.0000020
pcttrp
0.000030029
                                                                   
254
254
Recreational
Swimming
255
255
"
Swimming
Welfare.
sas"
Estimate
the
per
trip
and
seasonal
welfare
gains
from
swimming
due
to
changes
in
TKN
and
AWQC
exceedences
from
the
final
option.
256
256
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Swimming
Welfare.
sas
*/
/*
Author:
Abt
Associates
Inc.,
Stuart
Smith
*/
/*
Date:
unknown
*/
/*
Updated:
11/
25/
2002
*/
/*

*/
/*
This
program
estimates
the
per
trip
and
seasonal
welfare
for
swimming.
*/
/*****************************************************************************/

libname
lori
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Distance
Matrix';
/*
Distance
Matrix
*/
libname
library
'
H:\
ENVR\
Smithse\
Rum3\
Data\
lib';
/*
Format
Codes
*/
libname
demogr
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Respondents';
/*
Respondent
Data
*/
libname
reach
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Water
Quality';
/*
Reach
Attributes
Data
*/
libname
rand
'
H:\
ENVR\
Smithse\
Rum3\
Data\
Random
Draws\
Models
3_
17_
02';
/*
Random
Data
Folder
*/

/*
Setup
some
macro
variables
*/
%
let
activity=
swimer;
%
let
poltkn
=
tkn1;
%
let
pollbl
=
Final
(
No
GMs);

/*
Site
attributes
and
water
quality
variables
*/

data
attr;
set
reach.
rch_
info;

/*
Get
index
for
distance
data
*/

dsta=
input(
put(
rf1id,
rch_
fmt.),
4.);
if
dsta=
9999
then
put
'
bad
observation';

if
tkn=
0
or
tkn=.
then
tkn=
0.719;
if
tkn1=
0
then
tkn1=
tknb;
if
tkn2=
0
then
tkn2=
tknb;

/*
For
rivers
and
great
lakes
use
log
of
reach
length,
for
lakes
calculate
the
log
of
the
lake's
circumference
*/

if
river=
1
or
glake=
1
then
do;
if
rch_
len
^=
0
then
rchsze=
log(
rch_
len);
else
rch_
len
=
0;
end;
else
do;
/*
small
lakes
*/
257
257
pi
=
3.141592654;
area
=
exp(
ln_
acre)*
0.0015625;
/*
convert
log
of
acres
to
square
miles
*/
rad
=
sqrt(
area/
pi);
circ
=
2*
rad*
pi;
rchsze=
log(
circ);
end;

/*
Fish
Abundance
Measure
*/
/*
Standardized
Fish300m
generated
for
all
sites
in
Ohio
*/

if
fish300m=.
then
do;
if
river=
1
then
fish300m
=
625.28;
if
glake=
1
then
fish300m
=
259.99;
if
river=
0
and
glake=
0
then
fish300m
=
314.22;
end;
fish100m
=
fish300m/
3;
fish1m
=
fish300m/
300;

/*
Fish
Abundance
Measure
*/
/*
fill
in
with
average
by
waterbody
type
*/

if
wght300m
=.
then
do;
if
river=
1
then
wght300m
=
6.519;
if
glake=
1
then
wght300m
=
5.021;
if
river=
0
and
glake=
0
then
wght300m
=
9.173;
end;

/*
Convert
wght300m
from
kg
to
lbs
using
1kg
=
2.20462
lbs
*/

wgt_
300m
=
wght300m*
2.20462;

sqrwght
=
sqrt(
wgt_
300m);

if
iwb2=.
then
do;
if
river=
1
then
iwb2=
7.75;
if
glake=
1
then
iwb2=
7.46;
if
river=
0
and
glake=
0
then
iwb2=
7.28;
end;

keep
dsta
river
glake
rchsze
ln_
lndac
park
beach
tkn
awqc_
ex
tkn1
awqcalt1
awqcalt2
tkn2
tknb;
run;

/*
Open
the
demographic
data
file
and
get
chosen
site
id#
*/
data
initial;
set
demogr.
fullset2;

if
&
activity
=
0
then
delete;

zipid=
input(
put(
home,
zip_
fmt.),
3.0);
if
zipid
=
999
then
put
'
ZIPID
MISMATCH!!!
Respnum
=
'
respnum;
if
zipid
=
999
then
delete;
258
258
array
ds{*}
_
1­_
1954;

set
lori.
matrix4
point=
zipid;

ivsumgl=
0;
ivsumriv=
0;
ivpolgl=
0;
ivpolriv=
0;

do
i=
1
to
1954;
set
attr
point=
i;

/*
Create
Cost
of
trip
variables
*/
/*
Trip
cost,
applies
opportunity
cost
only
to
those
who
would
have
worked
*/
if
unempl=
1
or
home_
mk=
1
or
retired=
1
then
apply=
0;
else
apply=
1;
trpcost
=
0.29*
ds(
dsta)*
2
+
(
wage*(
ds(
dsta)/
40))*
2*
apply;

/*
Time
cost
only
applies
if
income
not
lost
*/
if
apply=
1
then
timcost=
0;
else
timcost=
(
ds(
dsta)/
40)*
2;

dist
=
ds(
dsta);

if
glake=
1
and
dist
<=
250
then
do;

iv_
gl
=
exp((­
0.0443*
trpcost
­
0.436*
timcost
­
0.273*
rchsze
+
0.05*
ln_
lndac
+
0.753*
park
+
0.491*
beach
­
0.66*
tknb
+
2.209)/
0.73);
ivpol_
gl
=
exp((­
0.0443*
trpcost
­
0.436*
timcost
­
0.273*
rchsze
+
0.05*
ln_
lndac
+
0.753*
park
+
0.491*
beach
­
0.66*&
poltkn
+
2.209)/
0.73);
ivsumgl=
ivsumgl+
iv_
gl;
ivpolgl=
ivpolgl+
ivpol_
gl;
end;
if
glake
=
0
and
dist
<=
120
then
do;

iv_
riv
=
exp((­
0.0443*
trpcost
­
0.436*
timcost
­
0.273*
rchsze
+
0.05*
ln_
lndac
+
0.753*
park
+
0.491*
beach
­
0.66*
tknb
+
5.337)/
0.275);
ivpol_
riv
=
exp((­
0.0443*
trpcost
­
0.436*
timcost
­
0.273*
rchsze
+
0.05*
ln_
lndac
+
0.753*
park
+
0.491*
beach
­
0.66*&
poltkn
+
5.337)/
0.275);
ivsumriv=
ivsumriv+
iv_
riv;
ivpolriv=
ivpolriv+
ivpol_
riv;
end;
end;

sumgl
=
0.73*
log(
ivsumgl);
sumriv
=
0.275*
log(
ivsumriv);
polgl
=
0.73*
log(
ivpolgl);
polriv
=
0.275*
log(
ivpolriv);

ivbase=
log(
exp(
sumgl)
+
exp(
sumriv));
ivpol=
log(
exp(
polgl)
+
exp(
polriv));

welf
=
(
ivpol­
ivbase)/
0.0443;
swelf
=
((
ivpol­
ivbase)*
numvis)/
0.0443;

seasbase
=
(
ivbase*
numvis)/
0.0443;
259
259
seaspol
=
(
ivpol*
numvis)/
0.0443;
diff
=
seaspol
­
seasbase;
pctchng
=
(
swelf/
seasbase)*
100;
run;

title
"
Swimming
Welfare
Estimates
­
Per
Trip
&
pollbl";
proc
means
data=
initial;
var
ivbase
ivpol
welf
swelf
seasbase
seaspol
diff
pctchng;
quit;
proc
means
median
data=
initial;
var
ivbase
ivpol
welf
swelf
seasbase
seaspol
diff
pctchng;
quit;

data
calctrp;
set
initial;

if
kids6
>
0
then
yngkids=
1;
else
yngkids=
0;
if
kid7_
15
>
0
then
oldkids=
1;
else
oldkids=
0;

base
=
exp(
0.72*
ivbase
­
0.92*
nohs
+
0.52*
college
­
4.07*
black
­
0.062*
age
+
1.15*
male
+
0.35*
yngkids
+
0.40*
oldkids
­
0.1);

policy
=
exp(
0.72*
ivpol
­
0.92*
nohs
+
0.52*
college
­
4.07*
black
­
0.062*
age
+
1.15*
male
+
0.35*
yngkids
+
0.40*
oldkids
­
0.1);

/*
Calculate
the
difference
in
the
number
of
trips
These
trips
are
attributable
to
fishing
as
only
its
IV
changes
*/

addnl
=
policy­
base;
newtot
=
numvis
+
addnl;

/*
Calculate
seasonal
welfare
upper
and
lower
bounds
*/
swelf_
l
=
((
ivpol­
ivbase)*
numvis)/
0.0443;
swelf_
u
=
((
ivpol­
ivbase)*
newtot)/
0.0443;

/*
Calculate
the
percentage
change
in
value
*/
baselow
=
(
ivbase*
numvis)/
0.0443;
basepol
=
(
ivpol*
numvis)/
0.0443;
difflow
=
basepol­
baselow;

basehgh
=
(
ivbase*
newtot)/
0.0443;
basepol2
=
(
ivpol*
newtot)/
0.0443;
diffhgh
=
basepol2­
basehgh;

pctlow
=
(
swelf_
l/
baselow)*
100;
pctup
=
(
swelf_
u/
baselow)*
100;

pcttrp
=
(
addnl/
numvis)*
100;
run;

title
"
Swimming
Welfare
Estimates
­
Trip
Model
&
pollbl";
proc
means
data=
calctrp;
var
swelf_
l
swelf_
u
pctlow
pctup
baselow
difflow
basehgh
diffhgh
base
policy
addnl
numvis
260
260
newtot
pcttrp;
quit;
proc
means
median
data=
calctrp;
var
swelf_
l
swelf_
u
pctlow
pctup
baselow
difflow
basehgh
diffhgh
base
policy
addnl
numvis
newtot
pcttrp;
quit;
261
261
Program
Output
262
262
Swimming
Welfare
Estimates
­
Per
Trip
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
N
Mean
Std
Dev
Minimum
Maximum
                                                                              
ivbase
89
5.2564235
0.7123871
1.4129690
6.2304429
ivpol
89
5.2564589
0.7123725
1.4129690
6.2304429
welf
89
0.000798197
0.0023402
0
0.0172929
swelf
89
0.0133027
0.0920167
0
0.8646430
seasbase
89
1057.24
1606.18
31.8954619
7032.10
seaspol
89
1057.25
1606.21
31.8954619
7032.10
diff
89
0.0133027
0.0920167
0
0.8646430
pctchng
89
0.000718663
0.0022195
0
0.0169797
                                                                              
Swimming
Welfare
Estimates
­
Per
Trip
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Median
                        
ivbase
5.4176160
ivpol
5.4176160
welf
5.0983735E­
6
swelf
0.000025803
seasbase
484.7085749
seaspol
484.7085750
diff
0.000025803
pctchng
4.0252586E­
6
                        
Swimming
Welfare
Estimates
­
Trip
Model
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Label
N
Mean
Std
Dev
Minimum
Maximum
                                                                                                                         
swelf_
l
89
0.0133027
0.0920167
0
0.8646430
swelf_
u
89
0.0133056
0.0920344
0
0.8648100
pctlow
89
0.000718663
0.0022195
0
0.0169797
pctup
89
0.000719042
0.0022204
0
0.0169830
baselow
89
1057.24
1606.18
31.8954619
7032.10
difflow
89
0.0133027
0.0920167
0
0.8646430
basehgh
89
1057.28
1606.20
31.8954619
7032.10
diffhgh
89
0.0133056
0.0920344
0
0.8648100
base
89
16.0022429
15.7058327
0.0337538
78.7615631
policy
89
16.0026286
15.7059845
0.0337538
78.7615631
addnl
89
0.000385711
0.0012275
0
0.0096574
NUMVIS
Number
of
trips
in
last
season
(
weight)
89
8.8089888
12.9981436
1.0000000
50.0000000
newtot
89
8.8093745
12.9983918
1.0000000
50.0096574
pcttrp
89
0.0120735
0.0334390
0
0.1666841
                                                                                                                         
Swimming
Welfare
Estimates
­
Trip
Model
Final
(
No
GMs)
16:
05
Friday,
November
29,
2002
The
MEANS
Procedure
Variable
Label
Median
                                                                   
swelf_
l
0.000025803
swelf_
u
0.000025803
pctlow
4.0252586E­
6
pctup
4.0252614E­
6
baselow
484.7085749
difflow
0.000025803
basehgh
484.7085779
diffhgh
0.000025803
base
10.1554415
263
263
policy
10.1554416
addnl
2.1211409E­
6
NUMVIS
Number
of
trips
in
last
season
(
weight)
4.0000000
newtot
4.0000009
pcttrp
0.000036369
                                                                   
264
264
POTW
Benefits
265
265
POTW
Inhibitions
from
Ohio
MP&
M
Facilities
266
266
"
Create
POTW_
IN
Datasets.
sas"
Generates
a
data
set
of
pollutant
loading
events
and
their
corresponding
weights
for
each
RF1
reach
receiving
MP&
M
discharges.
A
special
set
of
event
loadings
discharged
to
POTWs
by
Ohio
MP&
M
indirect
dischargers
is
created
without
employing
the
POTW
removal
rates.
267
267
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Create
POTW_
IN
Datasets.
sas
*/
/*
Author:
Stuart
Smith
*/
/*
Date:
08/
16/
2000
*/
/*
Updated:
7/
25/
2002
*/
/*

*/
/*
Merges
facility
data
and
loadings
among
many
sets
and
generates
a
data
*/
/*
set
of
discharges
to
POTW
facilities
from
indirect
dischargers.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Merge
the
facility
data
with
it's
loadings
*/
/*****************************************************************************/

proc
sql;
/*
screeners
*/
create
table
scrn
as
select
fac_
info.
siteid,
potw_
npd
as
npdes,
discharg,
reachnmb,
fac_
info.
source,
segl,
mnflo,
svten,
acute,
chronic,
dcp,
wbtype,
surface,
drainage,
potwflow,
casnum
as
casno,
loads0,
case
when
opt2
=
1
then
0
else
loads2
end
as
loads2,
case
when
opt5
=
1
then
0
else
loads5
end
as
loads5
from
ohio.
fac_
info,
rundat.
scrload,
rundat.
ohioclos
where
fac_
info.
siteid
=
scrload.
siteid
and
fac_
info.
source
=
'
screener'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1;

/*
mpm
facilities
*/
create
table
mpm
as
select
fac_
info.
siteid,
potw_
npd
as
npdes,
reachnmb,
discharg,
fac_
info.
source,
segl,
mnflo,
svten,
acute,
chronic,
dcp,
wbtype,
surface,
drainage,
potwflow,
casnum
as
casno,
loads0,
case
when
opt2
=
1
then
0
else
loads2
end
as
loads2,
case
when
opt5
=
1
then
0
else
loads5
end
as
loads5
from
ohio.
fac_
info,
rundat.
mpmload,
rundat.
ohioclos
where
fac_
info.
siteid
=
mpmload.
siteid
and
fac_
info.
source
=
'
mpm'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1;

/*
random
assigns
linked
to
mpm
data
*/
268
268
create
table
rand_
pcs
as
select
fac_
info.
siteid,
siteref,
potw_
npd
as
npdes,
reachnmb,
discharg,
fac_
info.
source,
segl,
mnflo,
svten,
acute,
chronic,
dcp,
wbtype,
surface,
drainage,
potwflow,
casnum
as
casno,
loads0,
case
when
opt2
=
1
then
0
else
loads2
end
as
loads2,
case
when
opt5
=
1
then
0
else
loads5
end
as
loads5
from
ohio.
fac_
info,
rundat.
scrload,
rundat.
ohioclos
where
fac_
info.
siteref
=
scrload.
siteid
and
fac_
info.
source
=
'
random'
and
fac_
info.
siteid
=
ohioclos.
siteid
and
base
=
1;

quit;

/*****************************************************************************/
/*
Combine
the
indirects
from
all
areas
*/
/*****************************************************************************/

data
indir;
set
scrn
mpm
rand_
pcs;

if
discharg
^=
'
indirect'
then
delete;
if
npdes
=
'
'
then
delete;

/*
Fill
in
missing
direct
discharger
flow
with
the
average
used
in
the
*/
/*
National
Anlysis
*/

/*
This
value
is
171.404
million
gallons
per
year
*/
if
potwflow=
0
or
potwflow
=
.
then
potwflow
=
171.404;

/*
Convert
from
millions
of
gallons
per
year
to
liters
per
day
*/
/*
365
days
per
year,
1000000,
3.875
liters
per
gallon
*/
poflow
=
(
potwflow/
365)
*
10**
6
*
3.875;
run;

proc
datasets
library=
work;
delete
rand_
pcs;
quit;

/*****************************************************************************/
/*
Process
indirects
*/
/*****************************************************************************/

proc
sql;

create
table
rundat.
potw_
in
as
select
siteid,
casno,
loads0
as
base,
loads5
as
treat1,
loads2
as
treat2,
discharg
as
sitedest,
1
as
weights,
reachnmb,
poflow,
npdes,
segl,
mnflo,
svten,
acute,
chronic,
dcp,
wbtype,
surface,
drainage
from
indir;
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
269
269
/*****************************************************************************/
270
270
"
POTW
Inhibitions
(
Sub
9).
sas"
Using
the
set
of
loadings
discharged
to
POTWs
by
Ohio
MP&
M
facilities,
POTW
specific
pollutant
discharge
events
are
calculated.
These
pollutants
concentrations
are
then
compared
with
POTW
inhibition
values
and
exceedences
are
determined.
271
271
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
POTW
Inhibitions
(
Sub
9).
sas
*/
/*
Author:
Abt
Associates
Inc;
Stuart
Smith,
based
on
INH_
FNL.
sas
by
*/
/*
Elena
Besedin,
Rob
Sartain
*/
/*
Date:
04/
21/
2000
*/
/*
Updated:
8/
23/
2002
*/
/*

*/
/*
1.
Calculates
MP&
M
pollutant
concentrations
in
influent
flow
to
the
*/
/*
POTWs
associated
with
the
MP&
M
sample
facilities;
*/
/*
2.
Compares
the
estimated
pollutant
concentrations
with
the
inhibition
*/
/*
values;
*/
/*
3.
Identifies
POTWs
in
which
pollutant
concentrations
exceed
inhibition
*/
/*
values;
*/
/*
4.
Calculates
the
total
number
of
exceedence
events;
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
POTW
Inhibitions
(
Sub
9)';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Get
indirect
discharge
loads
*/
/*****************************************************************************/

proc
sql;
create
table
potw
as
select
potw_
in.
npdes,
casno,
base,
treat1,
treat2,
poflow,
potw_
in.
weights,
potw_
in.
siteid,
size
from
rundat.
potw_
in,
ohio.
facsize
where
potw_
in.
siteid
=
facsize.
siteid
order
by
npdes,
casno;
quit;

/*
Make
sure
to
get
the
potw
flow
for
each
unique
npdes*/
data
evntflo1;
set
potw;
run;
272
272
proc
sort
data=
evntflo1;
by
npdes
siteid;
quit;

data
evntflo2;
set
evntflo1;
by
npdes
siteid;

if
not
first.
npdes
then
delete;

flow
=
poflow;
keep
npdes
flow;
run;

/*
Pull
in
the
npdes
flow*/

proc
sql;
create
table
potw1
as
select
potw.
npdes,
casno,
weights,
flow
as
potflow,
base,
treat1,
treat2,
siteid,
size,
0
as
old_
wght
from
potw,
evntflo2
where
potw.
npdes
=
evntflo2.
npdes
and
potw.
npdes
^=
'
'
and
casno
^=
'
'
order
by
npdes,
casno,
size,
weights;
quit;

/*
Keep
a
copy
of
initial
set
to
then
drop
observations
from
as
the
*/
/*
event
building
loops
*/
data
starter;
set
potw1;
run;

/*
MACRO
­
This
macro
creates
a
set
of
events
to
each
potw
for
each
chemical
*/
/*
based
on
the
facility
weight.
Loadings
are
summed
by
potw
by
chemical
and
*/
/*
by
mp&
m
facility
size.
Then
(
if
there
was
a
previous
build)
the
weight
*/
/*
is
adjusted
by
the
previous
weight
and
an
output
set
is
appended
to
the
*/
/*
previous
build
output
set.
Finally,
the
facilities
with
the
current
weight*/
/*
are
removed
from
the
starter
data
set
and
the
build
loop
will
be
run
again*/

%
macro
buildloop(
first=);
proc
sql;
/*
Sum
by
npdes,
casno,
and
mp&
m
facility
size.
Count
the
number
of
mp&
m
*/
/*
facilities
by
size
included
in
the
summed
loadings.
*/
create
table
summed
as
select
npdes,
casno,
size,
sum(
base)
as
base,
sum(
treat1)
as
treat1,
sum(
treat2)
as
treat2,
min(
potflow)
as
potflow,
count(
1)
as
facs
from
starter
group
by
npdes,
casno,
size
order
by
npdes,
casno,
size;

/*
Grab
the
smallest
weight
of
any
of
the
facilities
discharging
to
the
*/
/*
potw.
This
is
the
current
facility
weight.
Also
keep
the
weight
used
on
*/
/*
the
previous
build
loop.
*/
create
table
wght
as
select
npdes,
min(
weights)
as
weights,
min(
old_
wght)
as
old_
wght
from
starter
group
by
npdes;
273
273
/*
Grab
the
loadings
for
this
event
and
calculate
the
weight
of
the
event
*/
/*
Subtract
the
previous
build
weight
to
account
for
only
the
remaining
*/
/*
portion
of
the
differning
weights.
*/

create
table
outit
as
select
summed.*,(
weights
­
old_
wght)
as
weights
from
summed
left
join
wght
on
summed.
npdes
=
wght.
npdes;

/*
Rebuild
the
starter
set
by
dropping
the
facilities
with
the
current
*/
/*
weight.
*/
create
table
starter
as
select
starter.
npdes,
casno,
starter.
weights,
potflow,
base,
treat1,
treat2,
siteid,
size,
wght.
weights
as
old_
wght
from
starter
left
join
wght
on
starter.
npdes
=
wght.
npdes
where
starter.
weights
^=
wght.
weights;
quit;

/*
If
this
is
the
initial
build
loop,
create
the
output
data
set
*/
%
IF
&
first
=
1
%
THEN
%
DO;
data
outset;
set
outit;
run;
%
END;

/*
If
this
is
a
subsequent
build
loop,
append
to
the
output
data
set
*/
%
IF
&
first
=
0
%
THEN
%
DO;
data
outset;
set
outset
outit;
run;
%
END;
%
mend
buildloop;

/*
Determine
the
number
of
loops
required
to
build
all
the
needed
events.
*/
/*
The
number
of
loops
is
equal
to
the
maximum
number
of
different
weights
*/
/*
for
facilities
discharging
to
a
single
potw.
If
there
are
5
facilities
*/
/*
with
different
weights
discharging
to
a
potw
and
this
is
the
maximum
*/
/*
number
of
different
weights
to
any
potw,
then
the
loop
must
be
run
5
times*/
/*
to
account
for
all
the
differential
weights.
Potws
with
fewer
different
*/
/*
weights
will
drop
out
when
their
maximum
has
been
reached
(
i.
e.
they
will
*/
/*
no
longer
appear
in
the
starter
data
set.
*/
proc
sql
noprint;
/*
Get
the
number
of
distinct
weights
across
facilities
for
a
given
potw
*/
create
table
maxw
as
select
distinct
npdes,
count(
distinct
weights)
as
numwghts
from
starter
group
by
npdes;

/*
Get
the
maximum
number
of
different
weights
among
the
potws
*/
create
table
maxwg
as
274
274
select
max(
numwghts)
as
maxnum
from
maxw;

/*
Save
the
maximum
number
of
weights
in
a
macro
variable.
This
is
the
*/
/*
number
of
build
loopd
needed
to
exhaust
the
data.
*/
select
maxnum
into
:
max_
loop
from
maxwg;
quit;

/*
Run
the
initial
build
loop
*/
%
buildloop(
first=
1);

/*
Use
a
temporary
data
set
of
1
observation
to
allow
for
the
looping
of
*/
/*
of
the
build
events.
*/
data
_
temp;
set
maxwg;

/*
We
did
one
loop
already,
so
subtract
it
from
the
total
needed
*/
stopit
=
&
max_
loop
­
1;

/*
Call
the
macro
for
each
of
the
remaining
loops
needed
*/
do
i
=
1
to
stopit;
call
execute('%
buildloop(
first=
0)');
end;
run;

/*
Save
the
output
data
set
as
the
event
file
for
use
in
the
remainder
of
*/
/*
this
program
and
in
the
sludge
benefits
program
(
Sub
10).
*/
data
rundat.
potwevnt;
set
outset;

rename
potflow
=
evnt_
flo
weights
=
event_
wt;
run;

/*****************************************************************************/
/*
Calculate
influent
concentrations
*/
/*****************************************************************************/

proc
sql;
create
table
potw2
as
select
npdes,
casno,
(
base)/
evnt_
flo
as
concb,
(
treat1)/
evnt_
flo
as
conct1,
(
treat2)/
evnt_
flo
as
conct2,
event_
wt
from
rundat.
potwevnt
order
by
casno,
npdes,
event_
wt;
quit;

/*****************************************************************************/
/*
Get
Inhibition
Values
*/
/*****************************************************************************/

data
limits;
275
275
set
ohio.
chemdata;
if
inhibit;
keep
casno
inhibit;
run;

proc
sort;
by
casno;
quit;

/*****************************************************************************/
/*
Compare
influent
concentrations
with
inhibition
criteria
*/
/*****************************************************************************/

data
inhibit;
merge
potw2
limits;
by
casno;
if
inhibit;

keep
npdes
casno
inhibit
concb
conct1
conct2
event_
wt;

if
concb
<
inhibit
then
testb=
0;
else
testb=
1;
if
conct1
<
inhibit
then
testn1=
0;
else
testn1=
1;
if
conct2
<
inhibit
then
testn2=
0;
else
testn2=
1;

keep
npdes
casno
testb
testn1
testn2
event_
wt;
run;

proc
sort
data=
inhibit;
by
npdes
casno
event_
wt;
quit;

/*****************************************************************************/
/*
Proc
SQL
calculates:
*/
/*

*/
/*
1.
Total
number
exceedence
events
by
pollutant;
*/
/*
2.
Number
of
exceedence
events
per
POTW/
option;
*/
/*
3.
Total
Number
of
affected
POTWs
*/
/*****************************************************************************/

proc
sql;

/*****************************************************************************/
/*
Total
number
exceedence
events
by
pollutant
*/
/*****************************************************************************/

create
table
inhbn0
as
select
inhibit.
casno,
min(
chemical)
as
chemname,
sum(
testb)
as
occurb,
sum(
testn1)
as
occurn1,
sum(
testn2)
as
occurn2
from
inhibit,
ohio.
chemdata
where
testb>
0
and
inhibit.
casno=
chemdata.
casno
group
by
inhibit.
casno
order
by
inhibit.
casno;
276
276
/*****************************************************************************/
/*
Total
number
of
exceedence
events
by
POTW/
option
*/
/*****************************************************************************/

create
table
inhbn1
as
select
npdes,
sum(
testb)
as
excurb,
sum(
testn1)
as
excurn1,
sum(
testn2)
as
excurn2,
event_
wt,
case
when
sum(
testb)>
0
then
1
else
0
end
as
potwb,
case
when
sum(
testn1)>
0
then
1
else
0
end
as
potwn1,
case
when
sum(
testn2)>
0
then
1
else
0
end
as
potwn2
from
inhibit
where
testb>
0
group
by
npdes,
event_
wt
order
by
npdes,
event_
wt;

/*****************************************************************************/
/*
Total
Number
of
Exceedence
Events
by
Chemical
*/
/*****************************************************************************/

create
table
inh_
ntl
as
select
chemical,
sum(
testb*
event_
wt)
as
chemb,
sum(
testn1*
event_
wt)
as
chemn1,
sum(
testn2*
event_
wt)
as
chemn2
from
inhibit,
ohio.
chemdata
where
testb>
0
and
inhibit.
casno=
chemdata.
casno
group
by
chemical
order
by
chemical;

/*****************************************************************************/
/*
Total
Number
of
Exceedence
Events
*/
/*****************************************************************************/

create
table
inh_
ntl2
as
select
sum(
excurb*
event_
wt)
label='
Number
of
Exceedence
Events
(
Baseline)',
sum(
potwb*
event_
wt)
label='
Number
of
Affected
POTWs
(
Baseline)',
sum
(
excurn1*
event_
wt)
label='
Number
of
Exceedence
Events
(
Opt
1)',
sum(
potwn1*
event_
wt)
label='
Number
of
Affected
POTWs
(
Opt
1)',
sum
(
excurn2*
event_
wt)
label='
Number
of
Exceedence
Events
(
Opt
2)',
sum(
potwn2*
event_
wt)
label='
Number
of
Affected
POTWs
(
Opt
2)'
from
inhbn1;
quit;

proc
print
data=
inh_
ntl2
label
;

title3
'
Total
Number
of
POTWs
Affected
by
Inhibition
Problems
caused
by';
title4
'
MP&
M
discharges
in
Ohio.';

proc
print
data=
inh_
ntl;
label
chemb
='
Number
of
Exceedence
Events
(
Baseline)'
chemn1
='
Number
of
Exceedence
Events
(
Opt
1)'
chemn2
='
Number
of
Exceedence
Events
(
Opt
2)';
title3
'
Total
number
of
exceedence
events
caused
by
MP&
M';
277
277
title4
'
discharges
by
chemical
in
Ohio';

proc
print
data=
inhbn0;
label
occurb
='
Number
of
Exceedence
Events
(
Baseline)'
occurn1
='
Number
of
Exceedence
Events
(
Opt
1)'
occurn2
='
Number
of
Exceedence
Events
(
Opt
2)';
title3
'
Total
number
of
excedence
events
caused
MP&
M
discharges';
title4
'
by
chemical
in
Ohio';

data
reduc;
set
inhbn1;

if
excurn1
<
excurb
and
excurn1
>
0
then
red1
=
1;
else
red1
=
0;
if
excurn2
<
excurb
and
excurn2
>
0
then
red2
=
1;
else
red2
=
0;
run;

proc
means
sum
data=
reduc;
weight
event_
wt;
var
red1
red2;
label
red1
=
'#
POTWs
with
red.
poll.
inhibit.(
Opt1)'
red2
=
'#
POTWs
with
red.
poll.
inhibit.(
Opt2)';
title3
'
POTWS
with
Reduced
Inhibitions';
title4
'
Ohio';
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
278
278
Program
Output
No
output
was
produced
for
the
Final
Rule
as
Indirect
Dischargers
to
POTWs
are
not
regulated
under
the
Final
Rule.
Thus,
no
changes
in
POTW
inhibitions
resulted.
279
279
Sludge
Benefits
280
280
"
POTW
Inhibitions
(
Sub
9).
sas"
Using
the
set
of
loadings
discharged
to
POTWs
by
MP&
M
facilities,
POTW
specific
pollutant
events
are
calculated
The
data
set
of
these
events
is
outputed.
See
POTW
Inhibitions
from
Ohio
MP&
M
Facilities
for
program
code.
281
281
"
Sldg
MP&
M
Based
(
Sub
10).
sas"
Using
the
data
set
of
POTW
pollutants
events,
MP&
M
pollutant
concentrations
in
sewage
sludge
are
estimated.
These
concentrations
are
compared
with
use/
disposal
criteria
for
given
disposal
practices.
Shifts
in
POTW
disposal
practices
from
reduced
MP&
M
loadings
are
determined
and
monetized.
282
282
/*****************************************************************************/
/*
PROGRAM
DOCUMENTATION
*/
/*****************************************************************************/
/*
Program:
Sldg
MP&
M
Based
(
Sub
10)
02
5.96
sludge
generation
factor.
sas
*/
/*
Author:
Abt
Associates,
Inc.
Stuart
Smith,
Elena
Besedin,
Rob
Sartain
*/
/*
(
based
on
sldg.
sas
for
the
IL
project.)
*/
/*
Date:
unknown
*/
/*
Updated:
07/
26/
2002
*/
/*

*/
/*
1.
Calculates
MP&
M
pollutant
concentrations
in
the
sewage
sludge
*/
/*
generated
by
POTWs
associated
with
the
MP&
M
sample
facilities;
*/
/*
2.
Compares
the
estimated
sludge
pollutant
concentrations
with
the
*/
/*
the
sewage
sludge
use/
disposal
criteria;
*/
/*
3.
Identifies
POTWs
in
which
pollutant
concentrations
exceed
*/
/*
sewage
sludge
use/
disposal
criteria
for
a
given
use/
disposal
practice;*/
/*
4.
Estimates
shifts
in
sewage
sludge
use/
disposal
practices
due
to
*/
/*
the
reduced
MP&
M
discharges.
*/
/*****************************************************************************/

/*****************************************************************************/
/*
SET
TITLE
FOR
SUBROUTINE
*/
/*****************************************************************************/

title2
'
Sludge
MP&
M
Based
(
Sub
10)';

/*****************************************************************************/
/*
BEGIN
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Separate
potws
by
flow
volume
*/
/*
*/
/*
STRATUM
=
1;
small
size
(
daily
flow
rate
from
2
to
10
mg/
day)
*/
/*
STRATUM
=
2;
medium
size
(
daily
flow
rate
from
10
to
50
mg/
day)
*/
/*
STRATUM
=
3;
large
size
(
daily
flow
rate
>
50
mg/
day)
*/
/*
*/
/*
convert
the
event
flow
in
L/
day
to
MG/
day
*/
/*
dayflow
=
(
evnt_
flo*
0.2641721)/
1000000;
*/
/*
/*
if
dayflow
<
10
then
strat=
1;
*/
/*
if
dayflow
>=
10
and
dayflow
<
50
then
strat=
2;
*/
/*
if
dayflow
>=
50
then
strat=
3;
*/
/*****************************************************************************/

/*****************************************************************************/
/*
Bring
in
the
potw
event
loadings
file
and
generate
stratums
*/
283
283
/*****************************************************************************/

proc
sql;

create
table
potw_
0
as
select
npdes,
casno,
base
as
ldb,
treat1
as
ldt1,
treat2
as
ldt2,
event_
wt
as
smplwt,
evnt_
flo
as
potwflow,
facs,
size
as
facsze,
case
when
((
evnt_
flo*
0.2641721)/
1000000)
<
10
then
1
when
((
evnt_
flo*
0.2641721)/
1000000)
>=
50
then
3
else
2
end
as
stratum
from
rundat.
potwevnt
order
by
npdes,
casno,
smplwt;

/*****************************************************************************/
/*
Calculate
Influent
Concentrations
and
obatin
sludge
criterion
*/
/*****************************************************************************/

create
table
potw_
t
as
select
npdes,
stratum,
casno,
facs,(
ldb/
potwflow)
as
concb,(
ldt1/
potwflow)
as
conc1,(
ldt2/
potwflow)
as
conc2,
la_
h,
la_
l,
sludcrit,
surfdis,
smplwt,
twf_
remr.
name,
potw_
rem
as
potwrem,
facsze
as
size
from
potw_
0,
ohio.
sldg_
cri,
ohio.
twf_
remr
where
potw_
0.
casno
=
sldg_
cri.
casnum
and
potw_
0.
casno
=
twf_
remr.
cas
and
potw_
rem
is
not
missing
order
by
npdes,
casno,
smplwt;
quit;

/*****************************************************************************/
/*
Calculate
Sludge
Concentrations,
sewage
sludge
generation
factor
is
5.96
*/
/*****************************************************************************/

data
conc_
sl;
set
potw_
t;

/*
Calculate
the
total
concentrations
*/
if
stratum
=
1
then
do;
if
size
=
'
s'
then
avgfac
=
33.31;
/*
Avg
#
small
MP&
Ms
disch.
to
strat
1*/
if
size
=
'
m'
then
avgfac
=
2.48;
/*
Avg
#
medium
MP&
Ms
disch.
to
strat
1*/
if
size
=
'
l'
then
avgfac
=
1.24;
/*
Avg
#
large
MP&
Ms
disch.
to
strat
1*/

if
casno
=
'
7439921'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Lead*/
if
casno
=
'
7440382'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Arse*/
if
casno
=
'
7440020'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Nick*/
if
casno
=
'
7440439'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Cadm*/
if
casno
=
'
7440508'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Copp*/
if
casno
=
'
7440666'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Zinc*/
if
casno
=
'
7782492'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Seln*/
if
casno
=
'
7439976'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Merc*/

/*
Calculate
loadings
from
non­
MP&
M
facilities.
These
loadings
don't
change*/
284
284
/*
under
the
post­
complaince
scenario.
*/

cnc1
=
(
conc1*
avgfac)/
facs;
cnc2
=
(
conc2*
avgfac)/
facs;
end;
if
stratum
=
2
then
do;
if
size
=
'
s'
then
avgfac
=
105.97;
/*
Avg
#
small
MP&
Ms
disch.
to
strat
2*/
if
size
=
'
m'
then
avgfac
=
9.14;
/*
Avg
#
medium
MP&
Ms
disch.
to
strat
2*/
if
size
=
'
l'
then
avgfac
=
2.90;
/*
Avg
#
large
MP&
Ms
disch.
to
strat
2*/

if
casno
=
'
7439921'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Lead*/
if
casno
=
'
7440382'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Arse*/
if
casno
=
'
7440020'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Nick*/
if
casno
=
'
7440439'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Cadm*/
if
casno
=
'
7440508'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Copp*/
if
casno
=
'
7440666'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Zinc*/
if
casno
=
'
7782492'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Seln*/
if
casno
=
'
7439976'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Merc*/

/*
Calculate
loadings
from
non­
MP&
M
facilities.
These
loadings
don't
change*/
/*
under
the
post­
complaince
scenario.
*/

cnc1
=
(
conc1*
avgfac)/
facs;
cnc2
=
(
conc2*
avgfac)/
facs;
end;
if
stratum
=
3
then
do;
if
size
=
'
s'
then
avgfac
=
269.63;
/*
Avg
#
small
MP&
Ms
disch.
to
strat
3*/
if
size
=
'
m'
then
avgfac
=
85.18;
/*
Avg
#
medium
MP&
Ms
disch.
to
strat
3*/
if
size
=
'
l'
then
avgfac
=
16.29;
/*
Avg
#
large
MP&
Ms
disch.
to
strat
3*/

if
casno
=
'
7439921'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Lead*/
if
casno
=
'
7440382'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Arse*/
if
casno
=
'
7440020'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Nick*/
if
casno
=
'
7440439'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Cadm*/
if
casno
=
'
7440508'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Copp*/
if
casno
=
'
7440666'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Zinc*/
if
casno
=
'
7782492'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Seln*/
if
casno
=
'
7439976'
then
cncb=(
avgfac*
concb)/(
facs);
/*
Merc*/

/*
Calculate
loadings
from
non­
MP&
M
facilities.
These
loadings
don't
change*/
/*
under
the
post­
complaince
scenario.
*/

cnc1
=
(
conc1*
avgfac)/
facs;
cnc2
=
(
conc2*
avgfac)/
facs;
end;
run;

/*****************************************************************************/
/*
Sum
up
the
loadings
across
chemicals
and
POTWs
*/
/*****************************************************************************/

/*****************************************************************************/
285
285
/*
Separate
POTWS
by
size
*/
/*****************************************************************************/

proc
sql;

create
table
small
as
select
distinct
npdes,
1
as
small
from
conc_
sl
where
size='
s'
order
by
npdes;

create
table
med
as
select
distinct
npdes,
1
as
med
from
conc_
sl
where
size='
m'
order
by
npdes;

create
table
large
as
select
distinct
npdes,
1
as
large
from
conc_
sl
where
size='
l'
order
by
npdes;

/*****************************************************************************/
/*
Sum
over
checmicals
and
POTWs
*/
/*****************************************************************************/

create
table
bypotw
as
select
npdes,
casno,
min(
stratum)
as
stratum,
sum(
cncb)
as
bas,
sum(
cnc1)
as
treat1,
sum(
cnc2)
as
treat2,
avg(
la_
h)
as
la_
h,
avg(
la_
l)
as
la_
l,
avg(
sludcrit)
as
sludcrit,
avg(
surfdis)
as
surfdis,
smplwt,
avg(
potwrem)
as
potwrem,
min(
name)
as
name
from
conc_
sl
group
by
npdes,
casno,
smplwt
order
by
npdes,
casno,
smplwt;
quit;

/*****************************************************************************/
/*
Merge
sums
and
sizes
*/
/*****************************************************************************/

data
concsl2;
merge
bypotw
small
med
large;
by
npdes;

if
small=.
then
small
=
0;
if
med=.
then
med
=
0;
if
large=.
then
large
=
0;

array
sm{*}
sm1
­
sm8;
array
md{*}
md1
­
md8;
286
286
array
lg{*}
lg1
­
lg8;

/*****************************************************************************/
/*
Percentage
of
chemical
coming
from
MP&
M
facilities
based
on
National
Sludge*/
/*
Survey
of
POTWS
*/
/*****************************************************************************/

sm1=
0.138;
sm2=
0.074;
sm3=
0.251;
sm4=
0.161;
sm5=
0.189;
sm6=
0.202;
sm7=
0.072;
sm8=
0.079;

md1=
0.198;
md2=
0.140;
md3=
0.244;
md4=
0.234;
md5=
0.216;
md6=
0.160;
md7=
0.085;
md8=
0.208;

lg1=
0.103;
lg2=
0.070;
lg3=
0.158;
lg4=
0.128;
lg5=
0.109;
lg6=
0.082;
lg7=
0.033;
lg8=
0.060;

/*****************************************************************************/
/*
Calculate
the
amount
of
sludge
coming
from
Non­
MP&
M
facilities
*/
/*****************************************************************************/

if
casno
=
'
7439921'
then
other=
bas/(
sm1*
small
+
md1*
med
+
lg1*
large);/*
Lead*/
if
casno
=
'
7440382'
then
other=
bas/(
sm2*
small
+
md2*
med
+
lg2*
large);/*
Arse*/
if
casno
=
'
7440020'
then
other=
bas/(
sm3*
small
+
md3*
med
+
lg3*
large);/*
Nick*/
if
casno
=
'
7440439'
then
other=
bas/(
sm4*
small
+
md4*
med
+
lg4*
large);/*
Cadm*/
if
casno
=
'
7440508'
then
other=
bas/(
sm5*
small
+
md5*
med
+
lg5*
large);/*
Copp*/
if
casno
=
'
7440666'
then
other=
bas/(
sm6*
small
+
md6*
med
+
lg6*
large);/*
Zinc*/
if
casno
=
'
7782492'
then
other=
bas/(
sm7*
small
+
md7*
med
+
lg7*
large);/*
Seln*/
if
casno
=
'
7439976'
then
other=
bas/(
sm8*
small
+
md8*
med
+
lg8*
large);/*
Merc*/

/*
Total
concentration
is
the
sum
of
MP&
M
loadings
and
loadings
*/
/*
from
Non­
MP&
M
facilities
*/

cncb
=
bas
+
other;
cnc1
=
treat1
+
other;
cnc2
=
treat2
+
other;

/*
Apply
sludge
generation
factor
and
account
for
removal
percentage
*/
/*
generation
factor
is
5.96
*/

sludgeb
=
cncb
*
(
potwrem/
100)
*
5.96;
sludge1
=
cnc1
*
(
potwrem/
100)
*
5.96;
sludge2
=
cnc2
*
(
potwrem/
100)
*
5.96;

/*
Calculate
Pre
and
Post
Compliance
Concentrations
*/

base
=
sludgeb;
post1
=
sludge1;
post2
=
sludge2;

run;

/*****************************************************************************/
287
287
/*
Compare
Calculated
Sludge
Concentrations
With
the
Sludge
Disposal
Criteria*/
/*****************************************************************************/

data
sludge1;
set
concsl2;

/*
Compare
to
limites
for
land­
applied
high
(
la_
h)
*/
if
base
<
la_
h
then
critb_
h
=
0;
else
critb_
h
=
1;
if
post1
<
la_
h
then
crit1_
h
=
0;
else
crit1_
h
=
1;
if
post2
<
la_
h
then
crit2_
h
=
0;
else
crit2_
h
=
1;

/*
Compare
to
limites
for
land­
applied
low
(
la_
l)
*/
if
base
<
la_
l
then
critb_
l
=
0;
else
critb_
l
=
1;
if
post1
<
la_
l
then
crit1_
l
=
0;
else
crit1_
l
=
1;
if
post2
<
la_
l
then
crit2_
l
=
0;
else
crit2_
l
=
1;

/*
Assume
those
not
qualified
for
la_
l
use
mix
disposal
*/
if
critb_
l
=
1
then
critb_
m
=
1;
else
critb_
m
=
0;
if
crit1_
l
=
1
then
crit1_
m
=
1;
else
crit1_
m
=
0;
if
crit2_
l
=
1
then
crit2_
m
=
1;
else
crit2_
m
=
0;

run;

/*****************************************************************************/
/*
Calculate
Sludge
Quantity
produced
by
the
POTWs
associated
with
MP&
M
*/
/*
facilities
in
millions
of
dry
metric
tons
(
DMT)
*/
/*****************************************************************************/

proc
sql;
create
table
sldg_
wht
as
select
npdes,((
poflow*
0.2641721*
365)/
1000000)*
0.6363
as
sl_
wght
from
rundat.
potw_
in
where
npdes
^=
'
'
and
npdes
^=
'
Not
Found'
order
by
npdes;
quit;

/*
Keep
one
observation
per
unique
NPDES
*/
proc
sort
nodupkey
data=
sldg_
wht;
by
npdes;
quit;

/*****************************************************************************/
/*
Estimate
Number
of
Exceedence
Events
*/
/*
by
Stratum/
Chemicals
on
a
Sample
Basis
*/
/*****************************************************************************/

proc
sql;

create
table
sldg_
1
as
select
stratum,
casno,
min(
name)
as
polltnt,
sum(
critb_
h)
as
occ_
bh,
sum(
crit1_
h)
as
occ_
1h,
sum(
crit2_
h)
as
occ_
2h,
sum(
critb_
l)
as
occ_
bl,
sum(
crit1_
l)
as
occ_
1l,
sum(
crit2_
l)
as
occ_
2l,
sum
(
critb_
m)
as
occ_
bm,
sum(
crit1_
m)
as
occ_
1m,
sum(
crit2_
m)
as
occ_
2m,
sum(
sl_
wght)
as
weight,
288
288
case
when
sum(
crit1_
h)>
0
then
sum(
sl_
wght)
else
0
end
as
weight1,
case
when
sum(
crit2_
h)>
0
then
sum(
sl_
wght)
else
0
end
as
weight2
from
sludge1,
sldg_
wht
where
critb_
h>
0
and
sludge1.
npdes
=
sldg_
wht.
npdes
group
by
stratum,
casno
order
by
stratum,
casno;

create
table
chem_
nat
as
select
stratum,
casno,
min(
name)
as
polltnt,
sum(
critb_
h*
smplwt)
as
occ_
bh,
sum(
crit1_
h*
smplwt)
as
occ_
1h,
sum(
crit2_
h*
smplwt)
as
occ_
2h,
sum(
critb_
l*
smplwt)
as
occ_
bl,
sum(
crit1_
l*
smplwt)
as
occ_
1l,
sum(
crit2_
l*
smplwt)
as
occ_
2l,
sum(
critb_
m*
smplwt)
as
occ_
bm,
sum(
crit1_
m*
smplwt)
as
occ_
1m,
sum(
crit2_
m*
smplwt)
as
occ_
2m,
sum(
sl_
wght*
smplwt)
as
weight,
case
when
sum(
crit1_
h)>
0
then
sum(
sl_
wght*
smplwt)
else
0
end
as
weight1,
case
when
sum(
crit2_
h)>
0
then
sum(
sl_
wght*
smplwt)
else
0
end
as
weight2
from
sludge1,
sldg_
wht
where
critb_
h>
0
and
sludge1.
npdes
=
sldg_
wht.
npdes
group
by
stratum,
casno
order
by
stratum,
casno;

/*****************************************************************************/
/*
Estimate
Number
of
Exceedence
Events
by
POTW/
Option
*/
/*****************************************************************************/

create
table
sldg_
2
as
select
sludge1.
npdes,
stratum,
sum(
critb_
h)
as
hla_
b,
sum(
crit1_
h)
as
hla_
1,
sum(
crit2_
h)
as
hla_
2,
sum(
critb_
l)
as
lla_
b,
sum(
crit1_
l)
as
lla_
1,
sum(
crit2_
l)
as
lla_
2,
sum(
critb_
m)
as
mixb,
sum(
crit1_
m)
as
mix1,
sum(
crit2_
m)
as
mix2,
smplwt,
case
when
sum(
critb_
h)>
0
then
avg(
sl_
wght)
else
0
end
as
weight,
case
when
sum(
crit1_
h)>
0
then
avg(
sl_
wght)
else
0
end
as
weight1,
case
when
sum(
crit2_
h)>
0
then
avg(
sl_
wght)
289
289
else
0
end
as
weight2,
case
when
sum(
critb_
h)>
0
then
1
else
0
end
as
potw_
hb,
case
when
sum(
crit1_
h)
>
0
then
1
else
0
end
as
potw_
h1,
case
when
sum(
crit2_
h)
>
0
then
1
else
0
end
as
potw_
h2,
case
when
sum(
critb_
l)>
0
then
1
else
0
end
as
potw_
lb,
case
when
sum(
crit1_
l)>
0
then
1
else
0
end
as
potw_
l1,
case
when
sum(
crit2_
l)>
0
then
1
else
0
end
as
potw_
l2,
case
when
sum
(
critb_
m)>
0
then
1
else
0
end
as
potw_
mb,
case
when
sum(
crit1_
m)>
0
then
1
else
0
end
as
potw_
m1,
case
when
sum(
crit2_
m)>
0
then
1
else
0
end
as
potw_
m2
from
sludge1,
sldg_
wht
where
critb_
h>
0
and
sludge1.
npdes
=
sldg_
wht.
npdes
group
by
stratum,
sludge1.
npdes,
smplwt
order
by
stratum,
npdes,
smplwt;
quit;

data
sludge2;
set
sldg_
2;
proc
sort
nodupkey;
by
stratum
npdes
smplwt;
quit;

proc
sql;

/*****************************************************************************/
/*
Estimate
the
Total
Number
of
Exceedence
Events
*/
/*
by
Sewage
Sludge
Disposal
Practice/
Option
*/
290
290
/*****************************************************************************/

create
table
ntl_
slg1
as
select
stratum,
sum(
hla_
b*
smplwt)
as
ex_
bh,
sum(
hla_
1*
smplwt)
as
ex_
1h,
sum(
hla_
2*
smplwt)
as
ex_
2h,
sum(
lla_
b*
smplwt)
as
ex_
bl,
sum(
lla_
1*
smplwt)
as
ex_
1l,
sum(
lla_
2*
smplwt)
as
ex_
2l,
sum(
mixb*
smplwt)
as
ex_
bm,
sum(
mix1*
smplwt)
as
ex_
1m,
sum(
mix2*
smplwt)
as
ex_
2m,
sum(
weight*
smplwt)
as
t_
wght,
sum(
weight1*
smplwt)
as
t_
1wght,
sum(
weight2*
smplwt)
as
t_
2wght
from
sludge2
where
hla_
b>
0
group
by
stratum
order
by
stratum;

/*****************************************************************************/
/*
Estimate
the
Total
Number
of
POTWs
That
Don't
Meet
a
Given
Sludge
*/
/*
Disposal
Standard
*/
/*****************************************************************************/

create
table
ntl_
slg2
as
select
stratum,
sum(
potw_
hb*
smplwt)
as
ex_
bh,
sum(
potw_
h1*
smplwt)
as
ex_
1h,
sum(
potw_
h2*
smplwt)
as
ex_
2h,
sum(
potw_
lb*
smplwt)
as
ex_
bl,
sum(
potw_
l1*
smplwt)
as
ex_
1l,
sum(
potw_
l2*
smplwt)
as
ex_
2l,
sum(
potw_
mb*
smplwt)
as
ex_
bm,
sum(
potw_
m1*
smplwt)
as
ex_
1m,
sum(
potw_
m2*
smplwt)
as
ex_
2m,
sum(
weight*
smplwt)
as
t_
wght,
sum(
weight1*
smplwt)
as
t_
1wght,
sum(
weight2*
smplwt)
as
t_
2wght
from
sludge2
where
hla_
b>
0
group
by
stratum
order
by
stratum;
quit;

/*****************************************************************************/
/*
Indentify
Shifts
in
Sludge
Use/
Disposal
Practices
from
*/
/*
Land
Application
Low
to
Land
Application
High
on
a
Sample
Basis
*/
/*****************************************************************************/

proc
sql;

create
table
shifts1
as
select
stratum,
npdes,
weight,
count(
distinct
npdes)
as
upgrade,
smplwt,
case
when
hla_
1=
0
then
'
lla_
llh'
when
hla_
1>
0
and
lla_
1=
0
then
'
nswitch'
else
'
downgrd'
end
as
switch1,
case
when
hla_
2=
0
then
'
lla_
llh'
when
hla_
2>
0
and
lla_
2=
0
then
'
nswitch'
291
291
else
'
downgrd'
end
as
switch2
from
sludge2
where
hla_
b
>
0
and
lla_
b
=
0
order
by
stratum,
npdes,
smplwt;
quit;

data
shift11;
set
shifts1;
proc
sort;
by
stratum
npdes
switch1
switch2;
quit;

/*****************************************************************************/
/*
Indentify
Shifts
in
the
Sewage
Sludge
Disposal
Practices
from
mix
*/
/*
to
(
1)
Land
Application
High;
*/
/*
(
2)
Land
Application
Low
;
*/
/*****************************************************************************/

proc
sql;
create
table
shifts3
as
select
stratum,
npdes,
weight,
count(
distinct
npdes)
as
upgrade,
smplwt,
case
when
hla_
1=
0
then
'
mix_
llh'
when
hla_
1>
0
and
lla_
1=
0
then
'
mix_
lla'
else
'
nswitch'
end
as
switch1,
case
when
hla_
2=
0
then
'
mix_
llh'
when
hla_
2>
0
and
lla_
2=
0
then
'
mix_
lla'
else
'
nswitch'
end
as
switch2
from
sludge2
where
mixb>
0
order
by
stratum,
npdes,
smplwt;
quit;

data
shift13;
set
shifts3;
proc
sort;
by
stratum
npdes
switch1
switch2;
quit;

/*****************************************************************************/
/*
Calculate
Savings
From
Shifts
in
Sewage
Sludge
Disposal
Practices
*/
/*
Note
that
Savings
From
the
Reduced
Record
Keeping
is
Estimated
Separetly
*/
/*****************************************************************************/

data
savings;
set
shift11
shift13;
if
npdes
ne
'
';

keep
stratum
npdes
switch1
switch2
weight
smplwt;
run;

/*****************************************************************************/
/*
Estimate
Cost
Savings
from
Shifts
to
Less
Costly
*/
/*
Sewage
Sludge
Disposal
Practices
on
a
Sample
Basis
*/
292
292
/*
*/
/*
The
amount
newly
qualified
(
weight)
sludge
must
be
adjusted
since
not
*/
/*
all
can
be
land
applied.
48%
of
the
benefiting
sludge
can
be
land
applied*/
/*
Of
the
remaining
52%
of
the
sludge,
12%
can
be
bagged
and
sold,
which
is
*/
/*
6.2%
of
the
total
newly
qualified.
*/
/*

*/
/*
So,
the
benefiting
sludge
is
really
the
48%
that
can
be
land
applied
*/
/*
AND
the
6.2%
which
is
bagged
and
sold.
*/
/*

*/
/*
Thus,
54.2%
of
the
total
newly
qualified
sludge
for
land
application
is
*/
/*
used
in
the
cost
savings
estimates.
*/
/*****************************************************************************/

proc
sql;

create
table
svngs
as
select
stratum,
npdes,
switch1,
switch2,
weight,
smplwt,
case
when
switch1='
lla_
llh'
then
weight*
0.684
when
switch1='
mix_
llh'
then
0.542*
weight*
0.76*
0.34*
103.816
+
0.542*
weight*
0.76*
0.66*
100.436
+
0.542*
weight*
0.24*
0.34*
95.915
+
0.542*
weight*
0.24*
0.66*
69.961
when
switch1='
mix_
lla'
then
0.542*
weight*
0.34*
103.816
+

0.542*
weight*
0.66*
100.436
when
switch1='
nswitch'
then
0
else
0
end
as
savel1,
case
when
switch2='
lla_
llh'
then
weight*
0.684
when
switch2='
mix_
llh'
then
0.542*
weight*
0.76*
0.34*
103.816
+
0.542*
weight*
0.76*
0.66*
100.436
+
0.542*
weight*
0.24*
0.34*
95.915
+
0.542*
weight*
0.24*
0.66*
69.961
when
switch2='
mix_
lla'
then
0.542*
weight*
0.34*
103.816
+

0.542*
weight*
0.66*
100.436
when
switch2='
nswitch'
then
0
else
0
end
as
savel2,
case
when
switch1='
lla_
llh'
then
weight*
1.362
when
switch1='
mix_
llh'
then
0.542*
weight*
0.76*
0.34*
103.816
+
0.542*
weight*
0.76*
0.66*
100.436
+
0.542*
weight*
0.24*
0.34*
95.915
+
0.542*
weight*
0.24*
0.66*
69.961
293
293
when
switch1='
mix_
lla'
then
0.542*
weight*
0.34*
103.816
+

0.542*
weight*
0.66*
100.436
when
switch1='
nswitch'
then
0
else
0
end
as
saveh1,
case
when
switch2='
lla_
llh'
then
weight*
1.362
when
switch2='
mix_
llh'
then
0.542*
weight*
0.76*
0.34*
103.816
+
0.542*
weight*
0.76*
0.66*
100.436
+
0.542*
weight*
0.24*
0.34*
95.915
+
0.542*
weight*
0.24*
0.66*
69.961
when
switch2='
mix_
lla'
then
0.542*
weight*
0.34*
103.816
+
0.542*
weight*
0.66*
100.436
when
switch2='
nswitch'
then
0
else
0
end
as
saveh2
from
savings
order
by
stratum,
npdes,
switch1,
switch2;
quit;

/*****************************************************************************/
/*
Estimate
Cost
Savings
from
Shifts
to
Less
Costly
*/
/*
Sewage
Sludge
Disposal
Practices
on
a
National
Basis
*/
/*****************************************************************************/

proc
sql;
create
table
ntlshft1
as
select
stratum,
switch1,
sum(
smplwt)
as
potwntl,
sum(
weight*
smplwt)
as
totwght,
sum(
savel1*
smplwt)
as
lowsave1,
sum(
saveh1*
smplwt)
as
hghsave1
from
svngs
group
by
stratum,
switch1
order
by
stratum,
switch1;

create
table
ntlshft2
as
select
stratum,
switch2,
sum(
smplwt)
as
potwntl,
sum(
weight*
smplwt)
as
totwght,
sum(
savel2*
smplwt)
as
lowsave2,
sum(
saveh2*
smplwt)
as
hghsave2
from
svngs
group
by
stratum,
switch2
order
by
stratum,
switch2;
quit;

proc
print
data=
sldg_
1;
label
occ_
bh=
'
Execeedence
of
LA­
High
Value
(
Baseline)'
occ_
1h=
'
Execeedence
of
LA­
High
Value
(
Option
1)'
occ_
2h=
'
Execeedence
of
LA­
High
Value
(
Option
2)'
occ_
bl=
'
Execeedence
of
LA­
Low
Value
(
Baseline)'
occ_
1l=
'
Execeedence
of
LA­
Low
Value
(
Option
1)'
occ_
2l=
'
Execeedence
of
LA­
Low
Value
(
Option
2)'
occ_
bs=
'
Execeedence
of
Surf.
Disp.
Value
(
Baseline)'
occ_
1s=
'
Execeedence
of
Surf.
Disp.
Value
(
Option
1)'
occ_
2s=
'
Execeedence
of
Surf.
Disp.
Value
(
Option
2)'
294
294
weight
=
'
Sludge
Quantity
DMT
(
Baseline)'
weight1
=
'
Sludge
Quantity
DMT
(
Option
1)'
weight2
=
'
Sludge
Quantity
DMT
(
Option
2)';
title3
'
Sewage
Sludge
Contamination
Problems
Caused
by
';
title4
'
MP&
M
dischages
by
Pollutant
(
Sample)';
quit;

proc
print
data=
chem_
nat;
label
occ_
bh=
'
Execeedence
of
LA­
High
Value
(
Baseline)'
occ_
1h=
'
Execeedence
of
LA­
High
Value
(
Option
1)'
occ_
2h=
'
Execeedence
of
LA­
High
Value
(
Option
2)'
occ_
bl=
'
Execeedence
of
LA­
Low
Value
(
Baseline)'
occ_
1l=
'
Execeedence
of
LA­
Low
Value
(
Option
1)'
occ_
2l=
'
Execeedence
of
LA­
Low
Value
(
Option
2)'
occ_
bs=
'
Execeedence
of
Surf.
Disp.
Value
(
Baseline)'
occ_
1s=
'
Execeedence
of
Surf.
Disp.
Value
(
Option
1)'
occ_
2s=
'
Execeedence
of
Surf.
Disp.
Value
(
Option
2)'
weight
=
'
Sludge
Quantity
DMT
(
Baseline)'
weight1
=
'
Sludge
Quantity
DMT
(
Option
1)'
weight2
=
'
Sludge
Quantity
DMT
(
Option
2)';
title3
'
Sewage
Sludge
Contamination
Problems
Caused
by
';
title4
'
MP&
M
dischages
by
Pollutant
(
National)';
quit;

proc
means
sum
data=
sldg_
2;
var
hla_
b
hla_
1
hla_
2
lla_
b
lla_
1
lla_
2
mixb
mix1
mix2
weight
weight1
weight2
potw_
hb
potw_
h1
potw_
h2
potw_
lb
potw_
l1
potw_
l2
potw_
mb
potw_
m1
potw_
m2;
label
hla_
b='
Execeedences
of
LA­
High
Value
(
BL)'
hla_
1='
Execeedences
of
LA­
High
Value
(
Opt1)'
hla_
2='
Execeedences
of
LA­
High
Value
(
Opt2)'
lla_
b=
'
Execeedences
of
LA­
Low
Value
(
BL)'
lla_
1=
'
Execeedences
of
LA­
Low
Value
(
Opt1)'
lla_
2=
'
Execeedences
of
LA­
Low
Value
(
Opt2)'
mixb=
'
Execeedences
of
Mix
Value
(
BL)'
mix1=
'
Execeedences
of
Mix
Value
(
Opt1)'
mix2=
'
Execeedences
of
Mix
Value
(
Opt2)'
weight
=
'
Sludge
Quantity
DMT
(
Baseline)'
weight1
=
'
Sludge
Quantity
DMT
(
Option
1)'
weight2
=
'
Sludge
Quantity
DMT
(
Option
2)'
potw_
hb
=
'
Number
of
POTW
exceeding
LA­
High
(
BL)'
potw_
h1
=
'
Number
of
POTW
exceeding
LA­
High
(
Opt1)'
potw_
h2
=
'
Number
of
POTW
exceeding
LA­
High
(
Opt2)'
potw_
lb
=
'
Number
of
POTW
exceeding
LA­
Low
(
Bl)'
potw_
l1
=
'
Number
of
POTW
exceeding
LA­
Low
(
Opt1)'
potw_
l2
=
'
Number
of
POTW
exceeding
LA­
Low
(
Opt2)'
potw_
mb
=
'
Number
of
POTW
exceeding
Mix
(
Bl)'
potw_
m1
=
'
Number
of
POTW
exceeding
Mix
(
Opt1)'
potw_
m2
=
'
Number
of
POTW
exceeding
Mix
(
Opt2)';

title3
'
Total
Number
of
Exceedances
by
Disposal
Method/
Stratum
on
(
Sample)';
quit;
295
295
proc
means
sum
data=
svngs;
var
weight
savel1
saveh1
savel2
saveh2;
label
switch1='
Shift
Category
Opt
1'
switch2='
Shift
Category
Opt
2'
weight
=
'
Sudge
DMT
Newly
Qualified
for
a
Practice'
savel1
=
'
Low
Cost
Savings
Estimates
Opt
1'
saveh1
=
'
High
Cost
Savings
Estimates
Opt
1'
savel2
=
'
Low
Cost
Savings
Estimates
Opt
2'
saveh2
=
'
High
Cost
Savings
Estimates
Opt
2';
title3
'
Cost
Savings
Resulting
from
Shifts
to
Less
Costly';
title4
'
Sewage
Sludge
Disposal
Practices
on
a
Sample
Basis';
quit;

proc
means
sum
data=
ntl_
slg2;
var
ex_
bh
ex_
1h
ex_
2h
ex_
bl
ex_
1l
ex_
2l
ex_
bm
ex_
1m
ex_
2m
t_
wght
t_
1wght
t_
2wght;
label
ex_
bh
='
Execeedences
of
LA­
High
Value
(
BL)'
ex_
1h='
Execeedences
of
LA­
High
Value
(
Opt1)'
ex_
2h='
Execeedences
of
LA­
High
Value
(
Opt2)'
ex_
bl=
'
Execeedences
of
LA­
Low
Value
(
BL)'
ex_
1l=
'
Execeedences
of
LA­
Low
Value
(
Opt1)'
ex_
2l=
'
Execeedences
of
LA­
Low
Value
(
Opt2)'
ex_
bm=
'
Execeedences
of
Mix
Value(
BL)'
ex_
1m=
'
Execeedences
of
Mix
Value
(
Opt1)'
ex_
2m=
'
Execeedences
of
Mix
Value
(
Opt2)'
t_
wght
=
'
Sludge
Quantity
DMT
(
BL)'
t_
1wght
=
'
Sludge
Quantity
DMT
(
Opt1)'
t_
2wght
=
'
Sludge
Quantity
DMT
(
Opt2)';
title3
'
Total
Number
of
POTWs
exceeding
a
Sludge
Disposal
Method(
National)';
quit;

proc
print
data=
ntlshft1;
sum
lowsave1
hghsave1;
label
switch1='
Shift
Category'
potwntl=
'
Number
of
Upgrading
POTWs'
totwght
=
'
Sludge
(
DMT)
Newly
Qualified
for
a
Practice'
Lowsave1
=
'
Low
Cost
Savings
Estimates'
Hghsave1
=
'
High
Cost
Savings
Estimates';

title3
'
Cost
Savings
Resulting
From
Shifts
to
Less
Costly';
title4
'
Sludge
Disposal
Practices
on
a
National
Basis';
title5
'
Option
1';
quit;

proc
print
data=
ntlshft2;
sum
lowsave2
hghsave2;
label
switch2='
Shift
Category'
potwntl=
'
Number
of
Upgrading
POTWs'
totwght
=
'
Sludge
(
DMT)
Newly
Qualified
for
a
Practice'
Lowsave2
=
'
Low
Cost
Savings
Estimates'
Hghsave2
=
'
High
Cost
Savings
Estimates';

title3
'
Cost
Savings
Resulting
From
Shifts
to
Less
Costly';
296
296
title4
'
Sludge
Disposal
Practices
on
a
National
Basis';
title5
'
Option
2';
quit;

/*****************************************************************************/
/*
END
MAIN
PROGRAM
CODE
*/
/*****************************************************************************/
297
297
Program
Output
No
output
was
produced
for
the
Final
Rule
as
Indirect
Dischargers
to
POTWs
are
not
regulated
under
the
Final
Rule.
Thus,
no
changes
in
POTW
sludge
practices
resulted.