plot_statistics 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.0
1
+ 1.4.0
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'plot_statistics'
5
+ rescue LoadError
6
+ require 'rubygems'
7
+ gem 'plot_statistics'
8
+ require 'plot_statistics'
9
+ end
10
+
11
+ ARGV.each do |filename|
12
+ filename = "../High Aggregated Plot 1.txt"
13
+ file = File.new(filename)
14
+ lines = file.readlines
15
+ file.close
16
+
17
+ puts "Analyzing #{filename}"
18
+ printf "Importing Clams"
19
+ live_clams = []
20
+ dead_clams = []
21
+ lines.each do |line|
22
+ line = line.strip.split("\t")
23
+ next if line.empty?
24
+ x, y, number_eaten = line
25
+ (5 - number_eaten).times { printf "."; live_clams << PlotStatistics::Clam.new(:x => x, :y => y) }
26
+ number_eaten.to_i.times { printf "."; dead_clams << PlotStatistics::Clam.new(:x => x, :y => y) }
27
+ end.compact
28
+
29
+ puts "Running Ripley's K analysis of plot"
30
+ actual_plot = PlotStatistics::ClamPlot.new(live_clams, dead_clams).bivariate_analysis
31
+
32
+ puts "Running Monte Carlo Simulations of plot"
33
+ monte_carlo = PlotStatistics::MonteCarlo.new_bivariate(actual_plot).bivariate_analysis
34
+
35
+ output_filename = filename + '.ripleys_k.csv'
36
+ PlotStatistics::Output.new(:clam_plot => actual_plot, :monte_carlo => monte_carlo).to_bivariate_file(output_filename)
37
+
38
+ puts "Done™"
39
+ end
@@ -9,6 +9,7 @@ rescue LoadError
9
9
  end
10
10
 
11
11
  ARGV.each do |filename|
12
+ filename = "../Clam distributions/Cabbage/Cabbage_3.txt"
12
13
  file = File.new(filename)
13
14
  lines = file.readlines
14
15
  file.close
@@ -24,13 +25,13 @@ ARGV.each do |filename|
24
25
  end.compact
25
26
 
26
27
  puts "Running Ripley's K analysis of plot"
27
- actual_plot = PlotStatistics::ClamPlot.new(clams)
28
+ actual_plot = PlotStatistics::ClamPlot.new(clams).univariate_analysis
28
29
 
29
30
  puts "Running Monte Carlo Simulations of plot"
30
- monte_carlo = PlotStatistics::MonteCarlo.new(actual_plot.number_of_clams)
31
+ monte_carlo = PlotStatistics::MonteCarlo.new_univariate(actual_plot.number_of_clams).univariate_analysis
31
32
 
32
33
  output_filename = filename + '.ripleys_k.csv'
33
- PlotStatistics::Output.new(:clam_plot => actual_plot, :monte_carlo => monte_carlo).write_to_file(output_filename)
34
+ PlotStatistics::Output.new(:clam_plot => actual_plot, :monte_carlo => monte_carlo).to_univariate_file(output_filename)
34
35
 
35
36
  puts "Done™"
36
37
  end
@@ -16,5 +16,9 @@ class PlotStatistics
16
16
  return super(other) unless other.kind_of?(PlotStatistics::Clam)
17
17
  self.x == other.x && self.y == other.y
18
18
  end
19
+
20
+ def reset_distances
21
+ distances.clear
22
+ end
19
23
  end
20
24
  end
@@ -1,16 +1,29 @@
1
1
  class PlotStatistics
2
2
  class ClamPlot
3
- attr_accessor :clams, :stats
3
+ attr_accessor :clams, :dead_clams, :stats
4
4
 
5
5
  AREA_OF_PLOT = 10_000
6
6
  MAX_RADIUS = 50
7
7
  PLOT_CORNERS = [[0,0], [0,100], [100,0], [100,100]]
8
8
 
9
- def initialize(clams)
9
+ def initialize(clams, dead_clams=[])
10
10
  @clams = clams
11
- setup_clam_distances(@clams)
12
- @stats = OpenStruct.new(:k_ts => [], :l_ts => [])
13
- calculate_stats
11
+ @dead_clams = dead_clams
12
+ end
13
+
14
+ def univariate_analysis
15
+ self.stats = OpenStruct.new(:k_ts => [], :l_ts => [])
16
+ setup_clam_distances
17
+ calculate_univariate_stats
18
+ self
19
+ end
20
+
21
+ def bivariate_analysis
22
+ self.stats = OpenStruct.new(:k_ts => [], :dead_k_ts => [], :l_ts => [])
23
+ setup_clam_distances
24
+ setup_clam_distances(:dead_clams)
25
+ calculate_bivariate_stats
26
+ self
14
27
  end
15
28
 
16
29
  def self.create_random(number_of_clams)
@@ -29,20 +42,29 @@ class PlotStatistics
29
42
  (0..100).each do |x|
30
43
  (0..100).each do |y|
31
44
  mod_x = x % distance
32
- mod_y = x % distance
45
+ mod_y = y % distance
33
46
  clams << Clam.new(:x => x, :y => y) if mod_x == 0 && mod_y == 0
34
47
  end
35
48
  end
36
49
  new(clams)
37
50
  end
38
51
 
52
+ def self.create_random_from(clam_plot)
53
+ number_dead = clam_plot.dead_clams.size
54
+ all_clams = clam_plot.dead_clams | clam_plot.clams
55
+ dead_clams = all_clams.shuffle.slice(0...number_dead)
56
+ live_clams = all_clams - dead_clams
57
+ new(live_clams, dead_clams)
58
+ end
59
+
39
60
  def number_of_clams
40
61
  clams.size.to_f
41
62
  end
42
63
 
43
- def setup_clam_distances(clams)
44
- clams.each_with_index do |reference_clam, i|
45
- clams[(i + 1)..-1].each do |other_clam|
64
+ def setup_clam_distances(clam_type='clams')
65
+ reset_clam_distances
66
+ send(clam_type).each_with_index do |reference_clam, i|
67
+ send(clam_type)[(i + 1)..-1].each do |other_clam|
46
68
  distance = distance_between_clams(reference_clam, other_clam)
47
69
  reference_clam.distances << distance
48
70
  other_clam.distances << distance
@@ -54,19 +76,32 @@ class PlotStatistics
54
76
  Math.sqrt((clam1.x - clam2.x) ** 2 + (clam1.y - clam2.y) ** 2)
55
77
  end
56
78
 
57
- def calculate_stats
79
+ def calculate_bivariate_stats
80
+ (1..MAX_RADIUS).each do |radius|
81
+
82
+ live_k_t = calculate_k_t(radius)
83
+ dead_k_t = calculate_k_t(radius, :dead_clams)
84
+ l_t = calculate_bivariate_l_t(live_k_t, dead_k_t, radius)
85
+
86
+ stats.k_ts << live_k_t
87
+ stats.dead_k_ts << dead_k_t
88
+ stats.l_ts << l_t
89
+ end
90
+ end
91
+
92
+ def calculate_univariate_stats
58
93
  (1..MAX_RADIUS).each do |radius|
59
94
 
60
95
  k_t = calculate_k_t(radius)
61
- l_t = calculate_l_t(k_t, radius)
96
+ l_t = calculate_univariate_l_t(k_t, radius)
62
97
 
63
98
  stats.k_ts << k_t
64
99
  stats.l_ts << l_t
65
100
  end
66
101
  end
67
102
 
68
- def calculate_k_t(radius)
69
- sums = clams.inject(0.0) do |sum, clam|
103
+ def calculate_k_t(radius, clam_type='clams')
104
+ sums = send(clam_type).inject(0.0) do |sum, clam|
70
105
  clams_inside_circle = clam.distances.select { |distance| distance <= radius }
71
106
 
72
107
  circle_proportion = Circle.new(:clam => clam, :radius => radius).proportion_inside_plot
@@ -79,8 +114,16 @@ class PlotStatistics
79
114
  AREA_OF_PLOT * sums / (number_of_clams ** 2)
80
115
  end
81
116
 
82
- def calculate_l_t(k_t, radius)
117
+ def calculate_univariate_l_t(k_t, radius)
83
118
  radius - Math.sqrt( k_t / Math::PI)
84
119
  end
120
+
121
+ def calculate_bivariate_l_t(live_k_t, dead_k_t, radius)
122
+ radius - Math.sqrt( (live_k_t - dead_k_t).abs / Math::PI)
123
+ end
124
+
125
+ def reset_clam_distances
126
+ (clams | dead_clams).each { |clam| clam.reset_distances }
127
+ end
85
128
  end
86
129
  end
@@ -2,68 +2,75 @@ class PlotStatistics
2
2
  class MonteCarlo
3
3
  attr_accessor :plots, :stats
4
4
 
5
- def initialize(number_of_clams, number_of_plots=100.0)
6
- @plots = (1..number_of_plots).map { ClamPlot.create_random number_of_clams }
7
- @stats = OpenStruct.new(:mean => OpenStruct.new(:k_ts => [], :l_ts => []),
8
- :upper_limit => OpenStruct.new(:k_ts => [], :l_ts => []),
9
- :lower_limit => OpenStruct.new(:k_ts => [], :l_ts => []))
10
- calculate_means
11
- calculate_limits
5
+ def initialize(params={})
6
+ @plots = params[:plots]
12
7
  end
13
8
 
14
- def calculate_means
9
+ def self.new_univariate(number_of_clams, number_of_plots=500.0)
10
+ plots = (1..number_of_plots).map { ClamPlot.create_random(number_of_clams).univariate_analysis }
11
+ new(:plots => plots)
12
+ end
13
+
14
+ def self.new_bivariate(actual_plot, number_of_plots=500.0)
15
+ plots = (1..number_of_plots).map { ClamPlot.create_random_from(actual_plot).bivariate_analysis }
16
+ new(:plots => plots)
17
+ end
18
+
19
+ def bivariate_analysis
20
+ self.stats = OpenStruct.new(:mean => OpenStruct.new(:k_ts => [], :dead_k_ts => [], :l_ts => []),
21
+ :upper_limit => OpenStruct.new(:k_ts => [], :dead_k_ts => [], :l_ts => []),
22
+ :lower_limit => OpenStruct.new(:k_ts => [], :dead_k_ts => [], :l_ts => []))
23
+ calculate_means([:k_ts, :dead_k_ts, :l_ts])
24
+ calculate_limits([:k_ts, :dead_k_ts, :l_ts])
25
+ self
26
+ end
27
+
28
+ def univariate_analysis
29
+ self.stats = OpenStruct.new(:mean => OpenStruct.new(:k_ts => [], :l_ts => []),
30
+ :upper_limit => OpenStruct.new(:k_ts => [], :l_ts => []),
31
+ :lower_limit => OpenStruct.new(:k_ts => [], :l_ts => []))
32
+ calculate_means([:k_ts, :l_ts])
33
+ calculate_limits([:k_ts, :l_ts])
34
+ self
35
+ end
36
+
37
+ def calculate_means(means_for)
15
38
  (0...ClamPlot::MAX_RADIUS).each do |radius|
16
- stats.mean.k_ts << average_k(radius)
17
- stats.mean.l_ts << average_l(radius)
39
+ means_for.each do |stat|
40
+ stats.mean.send(stat) << average_stat(radius, stat)
41
+ end
18
42
  end
19
43
  end
20
44
 
21
- def calculate_limits
45
+ def calculate_limits(limits_for)
22
46
  (0...ClamPlot::MAX_RADIUS).each do |radius|
23
- threshold_k = standard_deviation_k(radius) * 2.0
24
- threshold_l = standard_deviation_l(radius) * 2.0
47
+ limits_for.each do |stat|
48
+ threshold = standard_deviation_stat(radius, stat) * 2.0
25
49
 
26
- stats.upper_limit.k_ts << (stats.mean.k_ts[radius] + threshold_k)
27
- stats.upper_limit.l_ts << (stats.mean.l_ts[radius] + threshold_l)
28
- stats.lower_limit.k_ts << (stats.mean.k_ts[radius] - threshold_k)
29
- stats.lower_limit.l_ts << (stats.mean.l_ts[radius] - threshold_l)
50
+ stats.upper_limit.send(stat) << (stats.mean.send(stat)[radius] + threshold)
51
+ stats.lower_limit.send(stat) << (stats.mean.send(stat)[radius] - threshold)
52
+ end
30
53
  end
31
54
  end
32
55
 
33
- def standard_deviation_k(radius)
56
+ def standard_deviation_stat(radius, stat)
34
57
  sum = plots.inject(0.0) do |sum, plot|
35
- (plot.stats.k_ts[radius] - stats.mean.k_ts[radius]) ** 2
58
+ (plot.stats.send(stat)[radius] - stats.mean.send(stat)[radius]) ** 2
36
59
  end
37
60
 
38
61
  Math.sqrt(sum / number_of_plots)
39
62
  end
40
63
 
41
- def standard_deviation_l(radius)
64
+ def average_stat(radius, stat)
42
65
  sum = plots.inject(0.0) do |sum, plot|
43
- (plot.stats.l_ts[radius] - stats.mean.l_ts[radius]) ** 2
66
+ plot.stats.send(stat)[radius]
44
67
  end
45
68
 
46
- Math.sqrt(sum / number_of_plots)
69
+ sum / number_of_plots
47
70
  end
48
71
 
49
72
  def number_of_plots
50
73
  plots.size
51
74
  end
52
-
53
- def average_k(radius)
54
- sum = plots.inject(0.0) do |sum, plot|
55
- plot.stats.k_ts[radius]
56
- end
57
-
58
- sum / number_of_plots
59
- end
60
-
61
- def average_l(radius)
62
- sum = plots.inject(0.0) do |sum, plot|
63
- plot.stats.l_ts[radius]
64
- end
65
-
66
- sum / number_of_plots
67
- end
68
75
  end
69
76
  end
@@ -7,7 +7,7 @@ class PlotStatistics
7
7
  @monte_carlo = params[:monte_carlo]
8
8
  end
9
9
 
10
- def write_to_file(filename)
10
+ def to_univariate_file(filename)
11
11
  FasterCSV.open(filename, 'w') do |csv|
12
12
  csv << ['Radius', 'K(t)', 'L(t)', 'Mean K(t)', 'Mean L(t)', 'Upper K(t)', 'Lower K(t)', 'Upper L(t)', 'Lower L(t)']
13
13
 
@@ -23,5 +23,25 @@ class PlotStatistics
23
23
  end
24
24
  end
25
25
  end
26
+
27
+ def to_bivariate_file(filename)
28
+ FasterCSV.open(filename, 'w') do |csv|
29
+ csv << ['Radius', 'Live K(t)', 'Dead K(t)', 'L(t)', 'Mean Live K(t)', 'Mean Dead K(t)', 'Mean L(t)', 'Upper Live K(t)', 'Lower Live K(t)', 'Upper Dead K(t)', 'Lower Dead K(t)', 'Upper L(t)', 'Lower L(t)']
30
+
31
+ (0...ClamPlot::MAX_RADIUS).each do |position|
32
+ radius = position + 1
33
+ csv << [
34
+ radius,
35
+ clam_plot.stats.k_ts[position], clam_plot.stats.dead_k_ts[position],
36
+ clam_plot.stats.l_ts[position],
37
+ monte_carlo.stats.mean.k_ts[position], monte_carlo.stats.mean.dead_k_ts[position],
38
+ monte_carlo.stats.mean.l_ts[position],
39
+ monte_carlo.stats.upper_limit.k_ts[position], monte_carlo.stats.lower_limit.k_ts[position],
40
+ monte_carlo.stats.upper_limit.dead_k_ts[position], monte_carlo.stats.lower_limit.dead_k_ts[position],
41
+ monte_carlo.stats.upper_limit.l_ts[position], monte_carlo.stats.lower_limit.l_ts[position]
42
+ ]
43
+ end
44
+ end
45
+ end
26
46
  end
27
47
  end
@@ -5,15 +5,14 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{plot_statistics}
8
- s.version = "1.3.0"
8
+ s.version = "1.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Asa Wilson"]
12
- s.date = %q{2010-03-19}
13
- s.default_executable = %q{plot_statistics}
12
+ s.date = %q{2010-09-27}
14
13
  s.description = %q{This is a gem to do a Ripley's K analysis}
15
14
  s.email = %q{acvwilson@gmail.com}
16
- s.executables = ["plot_statistics"]
15
+ s.executables = ["bivariate_ripleys_k", "univariate_ripleys_k"]
17
16
  s.extra_rdoc_files = [
18
17
  "LICENSE",
19
18
  "README.markdown"
@@ -25,7 +24,8 @@ Gem::Specification.new do |s|
25
24
  "README.markdown",
26
25
  "Rakefile",
27
26
  "VERSION",
28
- "bin/plot_statistics",
27
+ "bin/bivariate_ripleys_k",
28
+ "bin/univariate_ripleys_k",
29
29
  "lib/plot_statistics.rb",
30
30
  "lib/plot_statistics/circle.rb",
31
31
  "lib/plot_statistics/clam.rb",
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 3
7
+ - 4
8
8
  - 0
9
- version: 1.3.0
9
+ version: 1.4.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Asa Wilson
@@ -14,8 +14,8 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-19 00:00:00 -04:00
18
- default_executable: plot_statistics
17
+ date: 2010-09-27 00:00:00 -04:00
18
+ default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rspec
@@ -48,7 +48,8 @@ dependencies:
48
48
  description: This is a gem to do a Ripley's K analysis
49
49
  email: acvwilson@gmail.com
50
50
  executables:
51
- - plot_statistics
51
+ - bivariate_ripleys_k
52
+ - univariate_ripleys_k
52
53
  extensions: []
53
54
 
54
55
  extra_rdoc_files:
@@ -61,7 +62,8 @@ files:
61
62
  - README.markdown
62
63
  - Rakefile
63
64
  - VERSION
64
- - bin/plot_statistics
65
+ - bin/bivariate_ripleys_k
66
+ - bin/univariate_ripleys_k
65
67
  - lib/plot_statistics.rb
66
68
  - lib/plot_statistics/circle.rb
67
69
  - lib/plot_statistics/clam.rb