plot_statistics 0.3.0 → 1.0.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
- 0.3.0
1
+ 1.0.0
data/bin/plot_statistics CHANGED
@@ -8,33 +8,25 @@ rescue LoadError
8
8
  require 'plot_statistics'
9
9
  end
10
10
 
11
- ARGV.each do |file_name|
12
- puts "\nCommand started at: #{Time.now}\n"
13
-
14
- file = File.new(file_name)
11
+ ARGV.each do |filename|
12
+ file = File.new(filename)
13
+ lines = file.readlines
14
+ file.close
15
15
 
16
16
  puts "\n"
17
17
  puts '##########################'
18
- puts "# #{file_name}"
18
+ puts "# #{filename}"
19
19
  puts '##########################'
20
20
  puts "\n"
21
21
 
22
- lines = file.readlines
23
-
24
22
  clams = lines.map do |line|
25
23
  x, y = line.strip.split("\t")
26
- PlotStatistics::Clam.new(:x => x.to_i, :y => y.to_i)
24
+ PlotStatistics::Clam.new(:x => x, :y => y)
27
25
  end
28
26
 
29
- puts "\nActual plot started at: #{Time.now}\n"
30
-
31
27
  actual_plot = PlotStatistics::ClamPlot.new(clams)
32
- puts actual_plot.inspect
33
-
34
- puts "\nMonte Carlo plots started at: #{Time.now}\n"
35
-
36
28
  monte_carlo = PlotStatistics::MonteCarlo.new(actual_plot.number_of_clams)
37
- puts monte_carlo.inspect
38
29
 
39
- puts "\mCommand finished at: #{Time.now}\n"
30
+ output_filename = filename + '.ripleys_k.csv'
31
+ PlotStatistics::Output.new(:clam_plot => actual_plot, :monte_carlo => monte_carlo).write_to_file(output_filename)
40
32
  end
@@ -26,7 +26,7 @@ class PlotStatistics
26
26
  end
27
27
 
28
28
  def proportion_for_two_sides_out
29
- if corners_outside_radius.size == 3
29
+ if corners_outside_circle.size == 3
30
30
  1 - ( Math.acos( distance_from_bound.pop / radius ) + Math.acos( distance_from_bound.pop / radius ) + Math::PI / 2 ) / (Math::PI * 2)
31
31
  else
32
32
  1 - ( 2 * Math.acos( distance_from_bound.pop / radius ) + 2 * Math.acos( distance_from_bound.pop / radius ) ) / (Math::PI * 2)
@@ -35,14 +35,14 @@ class PlotStatistics
35
35
 
36
36
  def find_distance_from_bounds
37
37
  [
38
- (clam.y - 100).abs, # distance from top
39
- (clam.x - 100).abs, # distance from right
40
- clam.x, # distance from left
41
- clam.y # distance from bottom
38
+ 100 - clam.y, # distance from top
39
+ 100 - clam.x, # distance from right
40
+ clam.x, # distance from left
41
+ clam.y # distance from bottom
42
42
  ]
43
43
  end
44
44
 
45
- def corners_outside_radius
45
+ def corners_outside_circle
46
46
  ClamPlot::PLOT_CORNERS.map do |corner|
47
47
  distance = Math.sqrt((corner.first - clam.x) ** 2 + (corner.last - clam.y) ** 2)
48
48
  next if distance < radius
@@ -3,8 +3,8 @@ class PlotStatistics
3
3
  attr_accessor :x, :y, :distances
4
4
 
5
5
  def initialize(params={})
6
- @x = params[:x]
7
- @y = params[:y]
6
+ @x = params[:x].to_f
7
+ @y = params[:y].to_f
8
8
  @distances = params[:distances] || []
9
9
  end
10
10
 
@@ -2,7 +2,7 @@ class PlotStatistics
2
2
  class ClamPlot
3
3
  attr_accessor :clams, :stats
4
4
 
5
- AREA_OF_PLOT = 10_000
5
+ AREA_OF_PLOT = 1 # this is in meters everything else is in centimeters
6
6
  MAX_RADIUS = 50
7
7
  PLOT_CORNERS = [[0,0], [0,100], [100,0], [100,100]]
8
8
 
@@ -18,8 +18,20 @@ class PlotStatistics
18
18
  new(clams)
19
19
  end
20
20
 
21
+ def self.create_regular(distance=5)
22
+ clams = []
23
+ (0..100).each do |x|
24
+ (0..100).each do |y|
25
+ mod_x = x % distance
26
+ mod_y = x % distance
27
+ clams << Clam.new(:x => x, :y => y) if mod_x == 0 && mod_y == 0
28
+ end
29
+ end
30
+ new(clams)
31
+ end
32
+
21
33
  def number_of_clams
22
- clams.size
34
+ clams.size.to_f
23
35
  end
24
36
 
25
37
  def setup_clam_distances(clams)
@@ -39,18 +51,16 @@ class PlotStatistics
39
51
  def calculate_stats
40
52
  (1..MAX_RADIUS).each do |radius|
41
53
 
42
- sums = clams.inject(0) do |sum, clam|
54
+ sums = clams.inject(0.0) do |sum, clam|
43
55
  clams_inside_circle = clam.distances.select { |distance| distance <= radius }
44
56
 
45
57
  circle_proportion = Circle.new(:clam => clam, :radius => radius).proportion_inside_plot
46
- reciprocal_proportion = 1 / circle_proportion
58
+ reciprocal_proportion = 1.0 / circle_proportion
47
59
 
48
- clams_inside_circle.inject(0) do |sum, inside_clam|
49
- ( reciprocal_proportion * 1.0 ) / ( number_of_clams ** 2 )
50
- end
60
+ reciprocal_proportion * clams_inside_circle.size
51
61
  end
52
62
 
53
- k_t = AREA_OF_PLOT * sums
63
+ k_t = AREA_OF_PLOT * sums / (number_of_clams ** 2)
54
64
  l_t = radius - Math.sqrt( k_t / Math::PI)
55
65
 
56
66
  stats.k_ts << k_t
@@ -2,7 +2,7 @@ class PlotStatistics
2
2
  class MonteCarlo
3
3
  attr_accessor :plots, :stats
4
4
 
5
- def initialize(number_of_clams, number_of_plots=100)
5
+ def initialize(number_of_clams, number_of_plots=100.0)
6
6
  @plots = (1..number_of_plots).map { ClamPlot.create_random number_of_clams }
7
7
  @stats = OpenStruct.new(:mean => OpenStruct.new(:k_ts => [], :l_ts => []),
8
8
  :upper_limit => OpenStruct.new(:k_ts => [], :l_ts => []),
@@ -20,8 +20,8 @@ class PlotStatistics
20
20
 
21
21
  def calculate_limits
22
22
  (0...ClamPlot::MAX_RADIUS).each do |radius|
23
- threshold_k = standard_deviation_k(radius) * 2
24
- threshold_l = standard_deviation_l(radius) * 2
23
+ threshold_k = standard_deviation_k(radius) * 2.0
24
+ threshold_l = standard_deviation_l(radius) * 2.0
25
25
 
26
26
  stats.upper_limit.k_ts << (stats.mean.k_ts[radius] + threshold_k)
27
27
  stats.upper_limit.l_ts << (stats.mean.l_ts[radius] + threshold_l)
@@ -31,7 +31,7 @@ class PlotStatistics
31
31
  end
32
32
 
33
33
  def standard_deviation_k(radius)
34
- sum = plots.inject(0) do |sum, plot|
34
+ sum = plots.inject(0.0) do |sum, plot|
35
35
  (plot.stats.k_ts[radius] - stats.mean.k_ts[radius]) ** 2
36
36
  end
37
37
 
@@ -39,7 +39,7 @@ class PlotStatistics
39
39
  end
40
40
 
41
41
  def standard_deviation_l(radius)
42
- sum = plots.inject(0) do |sum, plot|
42
+ sum = plots.inject(0.0) do |sum, plot|
43
43
  (plot.stats.l_ts[radius] - stats.mean.l_ts[radius]) ** 2
44
44
  end
45
45
 
@@ -51,7 +51,7 @@ class PlotStatistics
51
51
  end
52
52
 
53
53
  def average_k(radius)
54
- sum = plots.inject(0) do |sum, plot|
54
+ sum = plots.inject(0.0) do |sum, plot|
55
55
  plot.stats.k_ts[radius]
56
56
  end
57
57
 
@@ -59,7 +59,7 @@ class PlotStatistics
59
59
  end
60
60
 
61
61
  def average_l(radius)
62
- sum = plots.inject(0) do |sum, plot|
62
+ sum = plots.inject(0.0) do |sum, plot|
63
63
  plot.stats.l_ts[radius]
64
64
  end
65
65
 
@@ -3,7 +3,25 @@ class PlotStatistics
3
3
  attr_accessor :clam_plot, :monte_carlo
4
4
 
5
5
  def initialize(params={})
6
+ @clam_plot = params[:clam_plot]
7
+ @monte_carlo = params[:monte_carlo]
8
+ end
9
+
10
+ def write_to_file(filename)
11
+ FasterCSV.open(filename, 'w') do |csv|
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)']
6
13
 
14
+ (0...ClamPlot::MAX_RADIUS).each do |position|
15
+ radius = position + 1
16
+ csv << [
17
+ radius,
18
+ clam_plot.stats.k_ts[position], clam_plot.stats.l_ts[position],
19
+ monte_carlo.stats.mean.k_ts[position], monte_carlo.stats.mean.l_ts[position],
20
+ monte_carlo.stats.upper_limit.k_ts[position], monte_carlo.stats.lower_limit.k_ts[position],
21
+ monte_carlo.stats.upper_limit.l_ts[position], monte_carlo.stats.lower_limit.l_ts[position]
22
+ ]
23
+ end
24
+ end
7
25
  end
8
26
  end
9
27
  end
@@ -5,4 +5,5 @@ class PlotStatistics
5
5
  require File.dirname(__FILE__) + '/plot_statistics/clam'
6
6
  require File.dirname(__FILE__) + '/plot_statistics/clam_plot'
7
7
  require File.dirname(__FILE__) + '/plot_statistics/monte_carlo'
8
+ require File.dirname(__FILE__) + '/plot_statistics/output'
8
9
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{plot_statistics}
8
- s.version = "0.3.0"
8
+ s.version = "1.0.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-18}
12
+ s.date = %q{2010-03-19}
13
13
  s.default_executable = %q{plot_statistics}
14
14
  s.description = %q{This is a gem to do a Ripley's K analysis}
15
15
  s.email = %q{acvwilson@gmail.com}
metadata CHANGED
@@ -3,10 +3,10 @@ name: plot_statistics
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
+ - 1
6
7
  - 0
7
- - 3
8
8
  - 0
9
- version: 0.3.0
9
+ version: 1.0.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Asa Wilson
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-18 00:00:00 -04:00
17
+ date: 2010-03-19 00:00:00 -04:00
18
18
  default_executable: plot_statistics
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency