framingham 0.1.20130712221655 → 0.1.20130719170918
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +11 -1
- data/framingham.gemspec +1 -1
- data/framingham.rb +11 -2
- data/framingham/diabetes.rb +76 -0
- data/framingham/heartdisease.rb +4 -9
- data/framingham/tests/diabetes_tests.rb +16 -0
- data/framingham/{heartdisease_tests.rb → tests/heartdisease_tests.rb} +0 -0
- metadata +6 -3
data/Rakefile
CHANGED
@@ -9,7 +9,17 @@ task :deploy do
|
|
9
9
|
sh "gem push framingham.gem"
|
10
10
|
end
|
11
11
|
|
12
|
+
task :upgrade do
|
13
|
+
Rake::Task[:build].execute
|
14
|
+
Rake::Task[:test].execute
|
15
|
+
begin
|
16
|
+
sh "gem uninstall framingham && gem install ./framingham.gem"
|
17
|
+
rescue => exception
|
18
|
+
abort "\033[31merror: did you not sudo? \033[0m"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
12
22
|
Rake::TestTask.new { |_|
|
13
|
-
_.test_files = FileList['framingham
|
23
|
+
_.test_files = FileList['framingham/tests/*.rb']
|
14
24
|
_.verbose = true
|
15
25
|
}
|
data/framingham.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new{ |_|
|
|
22
22
|
_.homepage = "https://github.com/3poundhealth/framingham#framingham"
|
23
23
|
_.summary = "Gem to implement Framingham Heart Study calculators"
|
24
24
|
_.license = "MIT"
|
25
|
-
_.files = `git ls-files`.split($/)
|
25
|
+
_.files = `git ls-files`.split($/).push("framingham/version.rb")
|
26
26
|
_.executables = _.files.grep(%r{^/}) { |f| File.basename(f) }
|
27
27
|
_.test_files = _.files.grep(%r{^(test|spec|features)/})
|
28
28
|
_.require_path = "."
|
data/framingham.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
|
-
|
3
|
-
load 'framingham/heartdisease.rb'
|
2
|
+
require './framingham/version'
|
4
3
|
|
5
4
|
module Framingham extend self
|
6
5
|
|
@@ -10,11 +9,21 @@ end
|
|
10
9
|
|
11
10
|
protected
|
12
11
|
|
12
|
+
$, = ", " #default join
|
13
|
+
|
14
|
+
GENDERS = [
|
15
|
+
:male,
|
16
|
+
:female
|
17
|
+
] unless defined? GENDERS
|
18
|
+
|
13
19
|
def to_i value
|
14
20
|
(value.eql? true or value.to_s == "true" or (
|
15
21
|
value.to_f != 0 if value.respond_to? 'to_f'
|
16
22
|
)) ? 1 : 0
|
17
23
|
end
|
18
24
|
|
25
|
+
load './framingham/heartdisease.rb'
|
26
|
+
load './framingham/diabetes.rb'
|
27
|
+
|
19
28
|
end
|
20
29
|
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Framingham::Diabetes extend Framingham, self
|
2
|
+
include Framingham
|
3
|
+
|
4
|
+
def eval options = {}
|
5
|
+
begin
|
6
|
+
#initialize
|
7
|
+
options = NORMAL.merge options
|
8
|
+
@age = options[:age].to_f
|
9
|
+
@blood_pressure = options[:blood_pressure].to_f
|
10
|
+
@body_mass_index = options[:body_mass_index].to_f
|
11
|
+
@diabetes_relative = options[:diabetes_relative].to_s.to_sym
|
12
|
+
@fasting_glucose = options[:fasting_glucose].to_f
|
13
|
+
@gender = options[:gender].to_sym
|
14
|
+
@hdl = options[:hdl].to_f
|
15
|
+
@triglyceride = options[:triglyceride].to_f
|
16
|
+
#validate
|
17
|
+
raise ERRORS[:gender] unless GENDERS.include? @gender
|
18
|
+
rescue => exception
|
19
|
+
abort "\033[31merror: " + exception.message + "\033[0m"
|
20
|
+
else
|
21
|
+
#calculate
|
22
|
+
=begin debug stuff
|
23
|
+
puts options.to_s
|
24
|
+
puts "50-65: " + (50...65).include?(@age).to_s
|
25
|
+
puts "65+: " + (@age >= 65).to_s
|
26
|
+
puts "blood_pressure >130: " + (@blood_pressure > 130).to_s
|
27
|
+
puts "bmi 25-30: " + (25...30).include?(@body_mass_index).to_s
|
28
|
+
puts "bmi >=30: " + (@body_mass_index >= 30).to_s
|
29
|
+
puts "diabetes_relative: " + @diabetes_relative.eql?(:true).to_s
|
30
|
+
puts "fasting_glucose: " + (100..126).include?(@fasting_glucose).to_s
|
31
|
+
puts "gender: " + @gender.to_s
|
32
|
+
puts "hdl: " + (@gender.eql?(:female) and @hdl < 50 or @hdl < 40).to_s
|
33
|
+
puts "triglyceride >= 150: " + (@triglyceride >= 150).to_s
|
34
|
+
=end
|
35
|
+
risk_factor = BETA_ZERO[@gender]
|
36
|
+
risk_factor += 0.018 if (50...65).include? @age
|
37
|
+
risk_factor += 0.081 if @age >= 65
|
38
|
+
risk_factor -= 0.565 if @diabetes_relative.eql? :true
|
39
|
+
risk_factor -= 0.301 if (25...30).include? @body_mass_index
|
40
|
+
risk_factor -= 0.920 if @body_mass_index >= 30
|
41
|
+
risk_factor -= 0.498 if @blood_pressure > 130
|
42
|
+
risk_factor -= 0.944 if @gender.eql? :female and @hdl < 50 or @hdl < 40
|
43
|
+
risk_factor -= 0.575 if @triglyceride >= 150
|
44
|
+
risk_factor -= 1.980 if (100..126).include? @fasting_glucose
|
45
|
+
1 / (1 + Math.exp(risk_factor))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def help
|
50
|
+
"Evaluate 8 year diabetes risk"
|
51
|
+
end
|
52
|
+
|
53
|
+
protected
|
54
|
+
|
55
|
+
NORMAL = { #default options
|
56
|
+
age: 30,
|
57
|
+
blood_pressure: 125,
|
58
|
+
body_mass_index: 22.5,
|
59
|
+
diabetes_relative: false,
|
60
|
+
fasting_glucose: 85,
|
61
|
+
gender: :female,
|
62
|
+
hdl: 60,
|
63
|
+
triglyceride: 130
|
64
|
+
} unless defined? NORMAL
|
65
|
+
|
66
|
+
ERRORS = {
|
67
|
+
gender: "invalid gender, options: " + GENDERS.join
|
68
|
+
} unless defined? ERRORS
|
69
|
+
|
70
|
+
BETA_ZERO = {
|
71
|
+
male: 5.517 + 0.010,
|
72
|
+
female: 5.517
|
73
|
+
}
|
74
|
+
|
75
|
+
end
|
76
|
+
|
data/framingham/heartdisease.rb
CHANGED
@@ -9,9 +9,11 @@ def eval options = {}
|
|
9
9
|
@blood_pressure = options[:blood_pressure].to_f
|
10
10
|
@blood_pressure_treatment = options[:blood_pressure_treatment] ? :treated : :untreated
|
11
11
|
@body_mass_index = options[:body_mass_index].to_f
|
12
|
-
@gender = options[:gender]
|
12
|
+
@gender = options[:gender].to_sym
|
13
13
|
@diabetes = to_i options[:diabetes]
|
14
14
|
@smoker = to_i options[:smoker]
|
15
|
+
#validate
|
16
|
+
raise ERRORS[:gender] unless GENDERS.include? @gender
|
15
17
|
rescue => exception
|
16
18
|
abort "\033[31merror: " + exception.message + "\033[0m"
|
17
19
|
else
|
@@ -79,8 +81,6 @@ def internal_debug _ = {}
|
|
79
81
|
'%5.1f' % ((1000 * _[:optimal]).round / 10.0)
|
80
82
|
end
|
81
83
|
|
82
|
-
$, = ", " #default join
|
83
|
-
|
84
84
|
NORMAL = { #default options
|
85
85
|
age: 30,
|
86
86
|
blood_pressure: 125,
|
@@ -102,16 +102,11 @@ BLOOD_PRESSURE_RANGE = (90..200) unless defined? BLOOD_PRESSURE_RANGE
|
|
102
102
|
|
103
103
|
BMI_RANGE = (15..50) unless defined? BMI_RANGE
|
104
104
|
|
105
|
-
GENDERS = [
|
106
|
-
:male,
|
107
|
-
:female
|
108
|
-
] unless defined? GENDERS
|
109
|
-
|
110
105
|
ERRORS = {
|
111
106
|
age: "age must be in range: " + AGE_RANGE.to_s,
|
112
107
|
blood_pressure: "blood pressure must be in range: " + BLOOD_PRESSURE_RANGE.to_s,
|
113
108
|
bmi: "bmi must be in range: " + BMI_RANGE.to_s,
|
114
|
-
gender: "invalid gender, options: " + GENDERS.join
|
109
|
+
gender: "invalid gender, options: " + GENDERS.join
|
115
110
|
} unless defined? ERRORS
|
116
111
|
|
117
112
|
BETA_ZERO = {
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require './framingham'
|
3
|
+
|
4
|
+
class DiabetesTests < Test::Unit::TestCase
|
5
|
+
include Framingham::Diabetes
|
6
|
+
|
7
|
+
def yellow _
|
8
|
+
"\e[1;7;41;33mFailed:\e[1;3;40m " + _ + " \e[0m"
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_normal
|
12
|
+
assert_equal 0.004001804744896386, eval, (yellow "Normal test")
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: framingham
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.20130719170918
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-07-
|
12
|
+
date: 2013-07-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -57,8 +57,11 @@ files:
|
|
57
57
|
- bin/rake
|
58
58
|
- framingham.gemspec
|
59
59
|
- framingham.rb
|
60
|
+
- framingham/diabetes.rb
|
60
61
|
- framingham/heartdisease.rb
|
61
|
-
- framingham/
|
62
|
+
- framingham/tests/diabetes_tests.rb
|
63
|
+
- framingham/tests/heartdisease_tests.rb
|
64
|
+
- framingham/version.rb
|
62
65
|
homepage: https://github.com/3poundhealth/framingham#framingham
|
63
66
|
licenses:
|
64
67
|
- MIT
|