plot_statistics 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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