statsample 0.3.4 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -0
- data/Manifest.txt +20 -2
- data/data/crime.txt +47 -0
- data/data/test_binomial.csv +201 -0
- data/demo/distribution_t.rb +2 -2
- data/demo/regression.rb +2 -1
- data/lib/distribution.rb +8 -0
- data/lib/distribution/chisquare.rb +24 -0
- data/lib/distribution/f.rb +25 -0
- data/lib/distribution/normal.rb +25 -0
- data/lib/distribution/t.rb +22 -0
- data/lib/matrix_extension.rb +78 -0
- data/lib/statistics2.rb +531 -0
- data/lib/statsample.rb +12 -9
- data/lib/statsample/anova.rb +1 -5
- data/lib/statsample/bivariate.rb +24 -20
- data/lib/statsample/combination.rb +14 -4
- data/lib/statsample/converters.rb +17 -1
- data/lib/statsample/dataset.rb +66 -10
- data/lib/statsample/dominanceanalysis/bootstrap.rb +1 -3
- data/lib/statsample/graph/gdchart.rb +2 -3
- data/lib/statsample/graph/svggraph.rb +8 -4
- data/lib/statsample/mle.rb +137 -0
- data/lib/statsample/mle/logit.rb +95 -0
- data/lib/statsample/mle/normal.rb +83 -0
- data/lib/statsample/mle/probit.rb +93 -0
- data/lib/statsample/regression.rb +3 -1
- data/lib/statsample/regression/binomial.rb +65 -0
- data/lib/statsample/regression/binomial/logit.rb +13 -0
- data/lib/statsample/regression/binomial/probit.rb +13 -0
- data/lib/statsample/regression/multiple.rb +61 -58
- data/lib/statsample/regression/multiple/rubyengine.rb +1 -1
- data/lib/statsample/srs.rb +5 -5
- data/lib/statsample/vector.rb +129 -59
- data/test/test_anova.rb +0 -5
- data/test/test_dataset.rb +13 -1
- data/test/test_distribution.rb +57 -0
- data/test/test_gsl.rb +22 -0
- data/test/test_logit.rb +22 -0
- data/test/test_mle.rb +140 -0
- data/test/test_r.rb +9 -0
- data/test/test_regression.rb +12 -4
- data/test/test_srs.rb +0 -4
- data/test/test_stata.rb +11 -0
- data/test/test_statistics.rb +0 -15
- data/test/test_vector.rb +11 -0
- metadata +28 -4
- data/lib/statsample/chidistribution.rb +0 -39
- data/lib/statsample/regression/logit.rb +0 -35
data/lib/statsample.rb
CHANGED
@@ -21,9 +21,8 @@
|
|
21
21
|
$:.unshift(File.dirname(__FILE__))
|
22
22
|
$:.unshift(File.expand_path(File.dirname(__FILE__)+"/../ext"))
|
23
23
|
|
24
|
-
require 'delegate'
|
25
24
|
require 'matrix'
|
26
|
-
|
25
|
+
require 'distribution'
|
27
26
|
|
28
27
|
class Numeric
|
29
28
|
def square ; self * self ; end
|
@@ -44,6 +43,7 @@ def create_test(*args,&proc)
|
|
44
43
|
fields=args
|
45
44
|
[description, fields, Proc.new]
|
46
45
|
end
|
46
|
+
#--
|
47
47
|
# Test extensions
|
48
48
|
begin
|
49
49
|
require 'gettext'
|
@@ -59,7 +59,7 @@ begin
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
begin
|
64
64
|
require 'rbgsl'
|
65
65
|
HAS_GSL=true
|
@@ -72,7 +72,7 @@ end
|
|
72
72
|
rescue LoadError
|
73
73
|
HAS_ALGIB=false
|
74
74
|
end
|
75
|
-
#
|
75
|
+
# ++
|
76
76
|
# Modules for statistical analysis
|
77
77
|
# See first:
|
78
78
|
# * Converter : several modules to import and export data
|
@@ -80,12 +80,14 @@ end
|
|
80
80
|
# * Dataset: An union of vectors.
|
81
81
|
#
|
82
82
|
module Statsample
|
83
|
-
|
83
|
+
|
84
|
+
VERSION = '0.4.0'
|
84
85
|
SPLIT_TOKEN = ","
|
85
86
|
autoload(:Database, 'statsample/converters')
|
86
87
|
autoload(:Anova, 'statsample/anova')
|
87
88
|
autoload(:Combination, 'statsample/combination')
|
88
89
|
autoload(:CSV, 'statsample/converters')
|
90
|
+
autoload(:PlainText, 'statsample/converters')
|
89
91
|
autoload(:Excel, 'statsample/converters')
|
90
92
|
autoload(:GGobi, 'statsample/converters')
|
91
93
|
autoload(:DominanceAnalysis, 'statsample/dominanceanalysis')
|
@@ -99,8 +101,7 @@ module Statsample
|
|
99
101
|
autoload(:Multivariate, 'statsample/multivariate')
|
100
102
|
autoload(:Multiset, 'statsample/multiset')
|
101
103
|
autoload(:StratifiedSample, 'statsample/multiset')
|
102
|
-
|
103
|
-
|
104
|
+
autoload(:MLE, 'statsample/mle')
|
104
105
|
autoload(:Regression, 'statsample/regression')
|
105
106
|
autoload(:Test, 'statsample/test')
|
106
107
|
def self.load(filename)
|
@@ -240,16 +241,18 @@ module Statsample
|
|
240
241
|
end
|
241
242
|
end
|
242
243
|
|
243
|
-
module STATSAMPLE__
|
244
|
+
module STATSAMPLE__ #:nodoc:
|
244
245
|
end
|
245
246
|
|
246
247
|
end
|
247
248
|
|
248
249
|
|
250
|
+
|
251
|
+
#--
|
249
252
|
begin
|
250
253
|
require 'statsamplert'
|
251
254
|
rescue LoadError
|
252
|
-
module Statsample
|
255
|
+
module Statsample
|
253
256
|
OPTIMIZED=false
|
254
257
|
end
|
255
258
|
end
|
data/lib/statsample/anova.rb
CHANGED
data/lib/statsample/bivariate.rb
CHANGED
@@ -20,8 +20,8 @@ module Statsample
|
|
20
20
|
}
|
21
21
|
sum
|
22
22
|
end
|
23
|
-
|
24
|
-
def covariance_slow(v1a,v2a)
|
23
|
+
|
24
|
+
def covariance_slow(v1a,v2a) # :nodoc:
|
25
25
|
t=0
|
26
26
|
m1=v1a.mean
|
27
27
|
m2=v1a.mean
|
@@ -40,8 +40,8 @@ module Statsample
|
|
40
40
|
pearson_slow(v1a,v2a)
|
41
41
|
end
|
42
42
|
end
|
43
|
-
|
44
|
-
|
43
|
+
def pearson_slow(v1a,v2a) # :nodoc:
|
44
|
+
|
45
45
|
v1s,v2s=v1a.vector_standarized_pop,v2a.vector_standarized_pop
|
46
46
|
t=0
|
47
47
|
siz=v1s.size
|
@@ -62,7 +62,7 @@ module Statsample
|
|
62
62
|
# Retrieves the value for t test for a pearson correlation
|
63
63
|
# giving r and vector size
|
64
64
|
def t_r(r,size)
|
65
|
-
r*Math::sqrt(((size)-2).to_f / (1 - r**2))
|
65
|
+
r * Math::sqrt(((size)-2).to_f / (1 - r**2))
|
66
66
|
end
|
67
67
|
# Retrieves the probability value (a la SPSS)
|
68
68
|
# for a given t, size and number of tails.
|
@@ -71,7 +71,7 @@ module Statsample
|
|
71
71
|
# * :right, :positive or 1 : for r > 0
|
72
72
|
# * :left, :negative : for r < 0
|
73
73
|
|
74
|
-
def prop_pearson(t,size, tails=:both)
|
74
|
+
def prop_pearson(t, size, tails=:both)
|
75
75
|
tails=:both if tails==2
|
76
76
|
tails=:right if tails==1 or tails==:positive
|
77
77
|
tails=:left if tails==:negative
|
@@ -82,16 +82,12 @@ module Statsample
|
|
82
82
|
else
|
83
83
|
1
|
84
84
|
end
|
85
|
-
if
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
1.0-(cdf*n_tails)
|
90
|
-
else
|
91
|
-
cdf*n_tails
|
92
|
-
end
|
85
|
+
t=-t if t>0 and (tails==:both)
|
86
|
+
cdf=Distribution::T.cdf(t, size-2)
|
87
|
+
if(tails==:right)
|
88
|
+
1.0-(cdf*n_tails)
|
93
89
|
else
|
94
|
-
|
90
|
+
cdf*n_tails
|
95
91
|
end
|
96
92
|
end
|
97
93
|
# Returns residual score after delete variance
|
@@ -110,6 +106,8 @@ module Statsample
|
|
110
106
|
}
|
111
107
|
nv.to_vector(:scale)
|
112
108
|
end
|
109
|
+
# Correlation between v1 and v2, controling the effect of
|
110
|
+
# control on both.
|
113
111
|
def partial_correlation(v1,v2,control)
|
114
112
|
v1a,v2a,cona=Statsample.only_valid(v1,v2,control)
|
115
113
|
rv1v2=pearson(v1a,v2a)
|
@@ -119,7 +117,9 @@ module Statsample
|
|
119
117
|
(rv1v2-(rv1con*rv2con)).quo(Math::sqrt(1-rv1con**2) * Math::sqrt(1-rv2con**2))
|
120
118
|
|
121
119
|
end
|
122
|
-
# Covariance matrix
|
120
|
+
# Covariance matrix.
|
121
|
+
# Order of rows and columns depends on Dataset#fields order
|
122
|
+
|
123
123
|
def covariance_matrix(ds)
|
124
124
|
ds.collect_matrix do |row,col|
|
125
125
|
if (ds[row].type!=:scale or ds[col].type!=:scale)
|
@@ -130,7 +130,8 @@ module Statsample
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
133
|
-
#
|
133
|
+
# Correlation matrix.
|
134
|
+
# Order of rows and columns depends on Dataset#fields order
|
134
135
|
|
135
136
|
def correlation_matrix(ds)
|
136
137
|
ds.collect_matrix {|row,col|
|
@@ -154,16 +155,19 @@ module Statsample
|
|
154
155
|
end
|
155
156
|
}
|
156
157
|
end
|
157
|
-
|
158
|
+
# Matrix of correlation probability
|
159
|
+
# Order of rows and columns depends on Dataset#fields order
|
160
|
+
|
161
|
+
def correlation_probability_matrix(ds, tails=:both)
|
158
162
|
rows=ds.fields.collect{|row|
|
159
163
|
ds.fields.collect{|col|
|
160
164
|
v1a,v2a=Statsample.only_valid(ds[row],ds[col])
|
161
|
-
(row==col or ds[row].type!=:scale or ds[col].type!=:scale) ? nil : prop_pearson(t_pearson(ds[row],ds[col]), v1a.size)
|
165
|
+
(row==col or ds[row].type!=:scale or ds[col].type!=:scale) ? nil : prop_pearson(t_pearson(ds[row],ds[col]), v1a.size, tails)
|
162
166
|
}
|
163
167
|
}
|
164
168
|
Matrix.rows(rows)
|
165
169
|
end
|
166
|
-
#
|
170
|
+
# Spearman ranked correlation coefficient between 2 vectors
|
167
171
|
def spearman(v1,v2)
|
168
172
|
v1a,v2a=Statsample.only_valid(v1,v2)
|
169
173
|
v1r,v2r=v1a.ranked(:scale),v2a.ranked(:scale)
|
@@ -1,12 +1,22 @@
|
|
1
1
|
module Statsample
|
2
2
|
# Combination class systematically generates all combinations of n elements, taken r at a time.
|
3
|
-
#
|
3
|
+
# With rbgsl, GSL::Combination is available for extra speed
|
4
4
|
# Source: http://snippets.dzone.com/posts/show/4666
|
5
5
|
# Use:
|
6
6
|
# comb=Statsample::Combination.new(3,5)
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
7
|
+
# => #<Statsample::Combination:0x7f6323804e08 @n=5, @d=#<Statsample::Combination::CombinationGsl:0x7f63237ff7f0 @n=5, @k=3, @c=GSL::Combination>, @k=3>
|
8
|
+
# comb.each{|c| p c }
|
9
|
+
# [0, 1, 2]
|
10
|
+
# [0, 1, 3]
|
11
|
+
# [0, 1, 4]
|
12
|
+
# [0, 2, 3]
|
13
|
+
# [0, 2, 4]
|
14
|
+
# [0, 3, 4]
|
15
|
+
# [1, 2, 3]
|
16
|
+
# [1, 2, 4]
|
17
|
+
# [1, 3, 4]
|
18
|
+
# [2, 3, 4]
|
19
|
+
#
|
10
20
|
class Combination
|
11
21
|
attr_reader :d
|
12
22
|
def initialize(k,n,only_ruby=false)
|
@@ -117,6 +117,21 @@ module Statsample
|
|
117
117
|
|
118
118
|
end
|
119
119
|
end
|
120
|
+
class PlainText < SpreadsheetBase
|
121
|
+
class << self
|
122
|
+
def read(filename, fields)
|
123
|
+
ds=Statsample::Dataset.new(fields)
|
124
|
+
fp=File.open(filename,"r")
|
125
|
+
fp.each_line do |line|
|
126
|
+
row=process_row(line.strip.split(/\s+/),[""])
|
127
|
+
ds.add_case_array(row)
|
128
|
+
end
|
129
|
+
convert_to_scale(ds,fields)
|
130
|
+
ds.update_valid_data
|
131
|
+
ds
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
120
135
|
class Excel < SpreadsheetBase
|
121
136
|
class << self
|
122
137
|
def write(dataset,filename)
|
@@ -157,7 +172,7 @@ module Statsample
|
|
157
172
|
}
|
158
173
|
line_number+=1
|
159
174
|
if(line_number<=ignore_lines)
|
160
|
-
|
175
|
+
#puts "Skip line #{line_number}:#{row.to_s}"
|
161
176
|
next
|
162
177
|
end
|
163
178
|
# This should be fixed.
|
@@ -235,6 +250,7 @@ module Statsample
|
|
235
250
|
# USE:
|
236
251
|
# Statsample::CSV.write(ds,"test_csv.csv")
|
237
252
|
def write(dataset,filename, convert_comma=false,*opts)
|
253
|
+
require 'csv'
|
238
254
|
writer=::CSV.open(filename,'w',*opts)
|
239
255
|
writer << dataset.fields
|
240
256
|
dataset.each_array{|row|
|
data/lib/statsample/dataset.rb
CHANGED
@@ -36,11 +36,26 @@ module Statsample
|
|
36
36
|
include Writable
|
37
37
|
attr_reader :vectors, :fields, :cases, :i
|
38
38
|
attr_accessor :labels
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
39
|
+
# Creates a new dataset. A dataset is a set of ordered named vectors
|
40
|
+
# of the same size.
|
41
|
+
#
|
42
|
+
# [vectors] With an array, creates a set of empty vectors named as
|
43
|
+
# values on the array. With a hash, each Vector is assigned as
|
44
|
+
# a variable of the Dataset named as its key
|
45
|
+
# [fields] Array of names for vectors. Is only used for set the
|
46
|
+
# order of variables. If empty, vectors keys on alfabethic order as
|
47
|
+
# used as fields
|
48
|
+
# [labels] Hash to set names for fields.
|
49
|
+
#
|
50
|
+
#
|
51
|
+
# Dataset.new()
|
52
|
+
# Dataset.new(%w{v1 v2 v3})
|
53
|
+
# Dataset.new({'v1'=>%w{1 2 3}.to_vector, 'v2'=>%w{4 5 6}.to_vector})
|
54
|
+
# Dataset.new({'v2'=>v2,'v1'=>v1},['v1','v2'])
|
55
|
+
#
|
56
|
+
# The fast way to create a dataset uses Hash#to_dataset, with
|
57
|
+
# fields and labels as arguments
|
58
|
+
# ds = {'v1'=>[1,2,3].to_vector}.to_dataset
|
44
59
|
#
|
45
60
|
def initialize(vectors={}, fields=[], labels={})
|
46
61
|
if vectors.instance_of? Array
|
@@ -296,7 +311,7 @@ module Statsample
|
|
296
311
|
}
|
297
312
|
end
|
298
313
|
if Statsample::STATSAMPLE__.respond_to?(:case_as_hash)
|
299
|
-
def case_as_hash(c)
|
314
|
+
def case_as_hash(c) # :nodoc:
|
300
315
|
Statsample::STATSAMPLE__.case_as_hash(self,c)
|
301
316
|
end
|
302
317
|
else
|
@@ -306,7 +321,7 @@ module Statsample
|
|
306
321
|
end
|
307
322
|
|
308
323
|
if Statsample::STATSAMPLE__.respond_to?(:case_as_array)
|
309
|
-
def case_as_array(c)
|
324
|
+
def case_as_array(c) # :nodoc:
|
310
325
|
Statsample::STATSAMPLE__.case_as_array(self,c)
|
311
326
|
end
|
312
327
|
else
|
@@ -314,16 +329,16 @@ module Statsample
|
|
314
329
|
_case_as_array(c)
|
315
330
|
end
|
316
331
|
end
|
317
|
-
|
332
|
+
def _case_as_hash(c) # :nodoc:
|
318
333
|
@fields.inject({}) {|a,x|
|
319
334
|
a[x]=@vectors[x][c]
|
320
335
|
a
|
321
336
|
}
|
322
337
|
end
|
323
|
-
def _case_as_array(c)
|
338
|
+
def _case_as_array(c) # :nodoc:
|
324
339
|
@fields.collect {|x| @vectors[x][c]}
|
325
340
|
end
|
326
|
-
|
341
|
+
# Returns each case as a hash
|
327
342
|
def each
|
328
343
|
begin
|
329
344
|
@i=0
|
@@ -337,6 +352,7 @@ module Statsample
|
|
337
352
|
raise DatasetException.new(self,e)
|
338
353
|
end
|
339
354
|
end
|
355
|
+
# Returns each case as index and hash
|
340
356
|
def each_with_index
|
341
357
|
begin
|
342
358
|
@i=0
|
@@ -350,6 +366,7 @@ module Statsample
|
|
350
366
|
raise DatasetException.new(self,e)
|
351
367
|
end
|
352
368
|
end
|
369
|
+
# Returns each case as an array
|
353
370
|
def each_array
|
354
371
|
@cases.times {|i|
|
355
372
|
@i=i
|
@@ -495,6 +512,40 @@ module Statsample
|
|
495
512
|
ms
|
496
513
|
|
497
514
|
end
|
515
|
+
# Returns a vector, based on a string with a calculation based
|
516
|
+
# on vector
|
517
|
+
# The calculation will be eval'ed, so you can put any variable
|
518
|
+
# or expression valid on ruby
|
519
|
+
# For example:
|
520
|
+
# a=[1,2].to_vector(scale)
|
521
|
+
# b=[3,4].to_vector(scale)
|
522
|
+
# ds={'a'=>a,'b'=>b}.to_dataset
|
523
|
+
# ds.calculate("a+b")
|
524
|
+
# => Vector [4,6]
|
525
|
+
def compute(text)
|
526
|
+
@fields.each{|f|
|
527
|
+
if @vectors[f].type=:scale
|
528
|
+
text.gsub!(f,"row['#{f}'].to_f")
|
529
|
+
else
|
530
|
+
text.gsub!(f,"row['#{f}']")
|
531
|
+
|
532
|
+
end
|
533
|
+
|
534
|
+
}
|
535
|
+
collect_with_index {|i,row|
|
536
|
+
invalid=false
|
537
|
+
@fields.each{|f|
|
538
|
+
if @vectors[f].data_with_nils[i].nil?
|
539
|
+
invalid=true
|
540
|
+
end
|
541
|
+
}
|
542
|
+
if invalid
|
543
|
+
nil
|
544
|
+
else
|
545
|
+
eval(text)
|
546
|
+
end
|
547
|
+
}
|
548
|
+
end
|
498
549
|
# Test each row with one or more tests
|
499
550
|
# each test is a Proc with the form
|
500
551
|
# Proc.new {|row| row['age']>0}
|
@@ -540,5 +591,10 @@ module Statsample
|
|
540
591
|
}
|
541
592
|
out
|
542
593
|
end
|
594
|
+
def as_r
|
595
|
+
require 'rsruby/dataframe'
|
596
|
+
r=RSRuby.instance
|
597
|
+
|
598
|
+
end
|
543
599
|
end
|
544
600
|
end
|
@@ -69,10 +69,8 @@ class DominanceAnalysis
|
|
69
69
|
out.extend report_type
|
70
70
|
out.add _("Summary for Bootstrap Dominance Analysis of %s on %s\n") % [@fields.join(", "), @y_var]
|
71
71
|
out.add _("Sample size: %d\n") % @n_samples
|
72
|
-
|
73
|
-
t=GSL::Cdf.tdist_Pinv(1-((1-alfa) / 2),@n_samples - 1)
|
72
|
+
t=Distribution::T.p_value(1-((1-alfa) / 2),@n_samples - 1)
|
74
73
|
out.add "t:#{t}\n"
|
75
|
-
end
|
76
74
|
out.add "Linear Regression Engine: #{@lr_class.name}"
|
77
75
|
out.nl
|
78
76
|
table=ReportTable.new
|
@@ -17,7 +17,7 @@ module Statsample
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
|
-
class
|
20
|
+
class Vector
|
21
21
|
# Creates a barchart using ruby-gdchart
|
22
22
|
def gdchart_frequencies(file, width=300, height=150, chart_type=GDChart::BAR, options={})
|
23
23
|
labels,data=[],[]
|
@@ -28,9 +28,8 @@ module Statsample
|
|
28
28
|
options['ext_color']=[0xFF3399,0xFF9933,0xFFEE33,0x33FF33, 0x9966FF]
|
29
29
|
Statsample::Util.chart_gdchart(file,width,height,chart_type, labels,options,1,data)
|
30
30
|
end
|
31
|
-
end
|
32
|
-
class Scale < Ordinal
|
33
31
|
def gdchart_histogram(bins,file, width=300, height=150, chart_type=GDChart::BAR, options={})
|
32
|
+
check_type :scale
|
34
33
|
labels=[]
|
35
34
|
h=histogram(bins)
|
36
35
|
data=[]
|
@@ -27,6 +27,7 @@ module Statsample
|
|
27
27
|
}
|
28
28
|
end
|
29
29
|
def svggraph_histogram(bins, options={})
|
30
|
+
check_type :scale
|
30
31
|
options={:graph_title=>"Histogram", :show_graph_title=>true,:show_normal=>true, :mean=>self.mean, :sigma=>sdp }.merge! options
|
31
32
|
graph = Statsample::Graph::SvgHistogram.new(options)
|
32
33
|
graph.histogram=histogram(bins)
|
@@ -35,6 +36,7 @@ module Statsample
|
|
35
36
|
# Returns a Run-Sequence Plot
|
36
37
|
# Reference: http://www.itl.nist.gov/div898/handbook/eda/section3/runseqpl.htm
|
37
38
|
def svggraph_runsequence_plot(options={})
|
39
|
+
check_type :scale
|
38
40
|
options={:graph_title=>"Run-Sequence Plot", :show_graph_title=>true, :scale_x_integers => true, :add_popups=>true }.merge! options
|
39
41
|
vx=(1..@data.size).to_a.to_vector(:scale)
|
40
42
|
vy=@data.to_vector(:scale)
|
@@ -45,6 +47,7 @@ module Statsample
|
|
45
47
|
graph
|
46
48
|
end
|
47
49
|
def svggraph_boxplot(options={})
|
50
|
+
check_type :scale
|
48
51
|
options={:graph_title=>"Boxplot", :fields=>['vector'], :show_graph_title=>true}.merge! options
|
49
52
|
vx=@data.to_a.to_vector(:scale)
|
50
53
|
graph = Statsample::Graph::SvgBoxplot.new(options)
|
@@ -53,6 +56,7 @@ module Statsample
|
|
53
56
|
end
|
54
57
|
|
55
58
|
def svggraph_lag_plot(options={})
|
59
|
+
check_type :scale
|
56
60
|
options={:graph_title=>"Lag Plot", :show_graph_title=>true}.merge! options
|
57
61
|
vx=@data[0...(@data.size-1)].to_vector(:scale)
|
58
62
|
vy=@data[1...@data.size].to_vector(:scale)
|
@@ -66,12 +70,12 @@ module Statsample
|
|
66
70
|
# Returns a Normal Probability Plot
|
67
71
|
# Reference: http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm
|
68
72
|
def svggraph_normalprobability_plot(options={})
|
69
|
-
|
70
|
-
|
71
|
-
|
73
|
+
extend Statsample::Util
|
74
|
+
check_type :scale
|
75
|
+
options={:graph_title=>"Normal Probability Plot", :show_graph_title=>true}.merge! options
|
72
76
|
n=@data.size
|
73
77
|
vx=(1..@data.size).to_a.collect{|i|
|
74
|
-
|
78
|
+
Distribution::Normal.p_value(normal_order_statistic_medians(i,n))
|
75
79
|
}.to_vector(:scale)
|
76
80
|
vy=@data.sort.to_vector(:scale)
|
77
81
|
ds={'normal_order_statistics_medians'=>vx, 'ordered_response'=>vy}.to_dataset
|