statsample 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gemtest +0 -0
- data/History.txt +14 -0
- data/Manifest.txt +4 -0
- data/README.txt +49 -13
- data/data/locale/es/LC_MESSAGES/statsample.mo +0 -0
- data/lib/statsample.rb +1 -23
- data/lib/statsample/analysis.rb +49 -28
- data/lib/statsample/analysis/suite.rb +18 -5
- data/lib/statsample/analysis/suitereportbuilder.rb +9 -3
- data/lib/statsample/anova.rb +2 -0
- data/lib/statsample/anova/contrast.rb +79 -0
- data/lib/statsample/anova/oneway.rb +39 -5
- data/lib/statsample/converter/csv.rb +2 -5
- data/lib/statsample/converters.rb +1 -0
- data/lib/statsample/dataset.rb +31 -1
- data/lib/statsample/graph/histogram.rb +1 -1
- data/lib/statsample/regression/multiple/baseengine.rb +5 -0
- data/lib/statsample/reliability/multiscaleanalysis.rb +3 -1
- data/lib/statsample/reliability/scaleanalysis.rb +3 -4
- data/lib/statsample/shorthand.rb +41 -1
- data/lib/statsample/test.rb +10 -0
- data/lib/statsample/test/kolmogorovsmirnov.rb +61 -0
- data/lib/statsample/test/t.rb +92 -9
- data/lib/statsample/vector.rb +143 -10
- data/po/es/statsample.mo +0 -0
- data/po/es/statsample.po +109 -110
- data/po/statsample.pot +108 -60
- data/test/helpers_tests.rb +1 -0
- data/test/test_analysis.rb +70 -11
- data/test/test_anova_contrast.rb +36 -0
- data/test/test_anovawithvectors.rb +8 -0
- data/test/test_dataset.rb +12 -0
- data/test/test_factor_pa.rb +1 -3
- data/test/test_test_kolmogorovsmirnov.rb +34 -0
- data/test/test_test_t.rb +16 -0
- data/test/test_vector.rb +40 -2
- metadata +44 -118
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -0
@@ -35,10 +35,10 @@ module Statsample
|
|
35
35
|
:name_denominator=>_("Explained variance"),
|
36
36
|
:name_numerator=>_("Unexplained variance")}
|
37
37
|
@opts=opts_default.merge(opts)
|
38
|
-
|
39
|
-
send("#{k}=", @opts[k])
|
38
|
+
opts.keys.each {|k|
|
39
|
+
send("#{k}=", @opts[k]) if self.respond_to? "#{k}="
|
40
40
|
}
|
41
|
-
@f_object=Statsample::Test::F.new(@ms_num
|
41
|
+
@f_object=Statsample::Test::F.new(@ms_num, @ms_den, @df_num,@df_den)
|
42
42
|
end
|
43
43
|
# F value
|
44
44
|
def f
|
@@ -62,6 +62,7 @@ module Statsample
|
|
62
62
|
end
|
63
63
|
|
64
64
|
end
|
65
|
+
|
65
66
|
# One Way Anova with vectors
|
66
67
|
# Example:
|
67
68
|
# v1=[2,3,4,5,6].to_scale
|
@@ -80,6 +81,11 @@ module Statsample
|
|
80
81
|
attr_accessor :summary_levene
|
81
82
|
# Show on summary descriptives for vectors
|
82
83
|
attr_accessor :summary_descriptives
|
84
|
+
# Show on summary of contrasts
|
85
|
+
attr_accessor :summary_contrasts
|
86
|
+
# Array with stored contrasts
|
87
|
+
attr_reader :contrasts
|
88
|
+
|
83
89
|
def initialize(*args)
|
84
90
|
if args[0].is_a? Array
|
85
91
|
@vectors=args.shift
|
@@ -92,11 +98,31 @@ module Statsample
|
|
92
98
|
:name_numerator=>_("Between Groups"),
|
93
99
|
:name_denominator=>_("Within Groups"),
|
94
100
|
:summary_descriptives=>false,
|
95
|
-
:summary_levene=>true
|
101
|
+
:summary_levene=>true,
|
102
|
+
:summary_contrasts=>true
|
103
|
+
}
|
96
104
|
@opts=opts_default.merge(opts).merge(:ss_num=>ssbg, :ss_den=>sswg, :df_num=>df_bg, :df_den=>df_wg)
|
105
|
+
@contrasts=[]
|
97
106
|
super(@opts)
|
98
107
|
end
|
99
|
-
alias
|
108
|
+
alias :sst :ss_total
|
109
|
+
alias :msb :ms_num
|
110
|
+
alias :msw :ms_den
|
111
|
+
|
112
|
+
# Generates and store a contrast.
|
113
|
+
# Options should be provided as a hash
|
114
|
+
# [:c]=>contrast vector
|
115
|
+
# [:c1 - :c2]=>index for automatic construction of contrast
|
116
|
+
# [:name]=>contrast name
|
117
|
+
|
118
|
+
def contrast(opts=Hash.new)
|
119
|
+
name=opts[:name] || _("Contrast for %s") % @name
|
120
|
+
opts=opts.merge({:vectors=>@vectors, :name=>name})
|
121
|
+
c=Statsample::Anova::Contrast.new(opts)
|
122
|
+
@contrasts.push(c)
|
123
|
+
c
|
124
|
+
end
|
125
|
+
|
100
126
|
def levene
|
101
127
|
Statsample::Test.levene(@vectors, :name=>_("Test of Homogeneity of variances (Levene)"))
|
102
128
|
end
|
@@ -140,10 +166,18 @@ module Statsample
|
|
140
166
|
end
|
141
167
|
end
|
142
168
|
end
|
169
|
+
|
143
170
|
if summary_levene
|
144
171
|
s.parse_element(levene)
|
145
172
|
end
|
146
173
|
report_building_table(s)
|
174
|
+
if summary_contrasts and @contrasts.size>0
|
175
|
+
|
176
|
+
@contrasts.each do |c|
|
177
|
+
s.parse_element(c)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
147
181
|
end
|
148
182
|
end
|
149
183
|
end
|
@@ -12,16 +12,13 @@ module Statsample
|
|
12
12
|
#
|
13
13
|
# USE:
|
14
14
|
# ds=Statsample::CSV.read("test_csv.csv")
|
15
|
-
def read(filename, empty=[''],ignore_lines=0,
|
15
|
+
def read(filename, empty=[''],ignore_lines=0,csv_opts=Hash.new)
|
16
16
|
first_row=true
|
17
17
|
fields=[]
|
18
18
|
fields_data={}
|
19
19
|
ds=nil
|
20
20
|
line_number=0
|
21
|
-
|
22
|
-
opts[:col_sep]=fs unless fs.nil?
|
23
|
-
opts[:row_sep]=rs unless rs.nil?
|
24
|
-
csv=CSV_klass.open(filename,'r',opts)
|
21
|
+
csv=CSV_klass.open(filename,'rb', csv_opts)
|
25
22
|
csv.each do |row|
|
26
23
|
line_number+=1
|
27
24
|
if(line_number<=ignore_lines)
|
data/lib/statsample/dataset.rb
CHANGED
@@ -119,6 +119,33 @@ module Statsample
|
|
119
119
|
def has_missing_data?
|
120
120
|
@vectors.any? {|k,v| v.has_missing_data?}
|
121
121
|
end
|
122
|
+
# Return a nested hash using fields as keys and
|
123
|
+
# an array constructed of hashes with other values.
|
124
|
+
# If block provided, is used to provide the
|
125
|
+
# values, with parameters +row+ of dataset,
|
126
|
+
# +current+ last hash on hierarchy and
|
127
|
+
# +name+ of the key to include
|
128
|
+
def nest(*tree_keys,&block)
|
129
|
+
tree_keys=tree_keys[0] if tree_keys[0].is_a? Array
|
130
|
+
out=Hash.new
|
131
|
+
each do |row|
|
132
|
+
current=out
|
133
|
+
# Create tree
|
134
|
+
tree_keys[0,tree_keys.size-1].each do |f|
|
135
|
+
root=row[f]
|
136
|
+
current[root]||=Hash.new
|
137
|
+
current=current[root]
|
138
|
+
end
|
139
|
+
name=row[tree_keys.last]
|
140
|
+
if !block
|
141
|
+
current[name]||=Array.new
|
142
|
+
current[name].push(row.delete_if{|key,value| tree_keys.include? key})
|
143
|
+
else
|
144
|
+
current[name]=block.call(row, current,name)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
out
|
148
|
+
end
|
122
149
|
# Creates a new dataset. A dataset is a set of ordered named vectors
|
123
150
|
# of the same size.
|
124
151
|
#
|
@@ -170,6 +197,7 @@ module Statsample
|
|
170
197
|
else
|
171
198
|
ds=dup fields_to_include
|
172
199
|
end
|
200
|
+
ds.name= self.name
|
173
201
|
ds
|
174
202
|
end
|
175
203
|
#
|
@@ -192,7 +220,9 @@ module Statsample
|
|
192
220
|
vectors[f]=@vectors[f].dup
|
193
221
|
fields.push(f)
|
194
222
|
}
|
195
|
-
Dataset.new(vectors,fields)
|
223
|
+
ds=Dataset.new(vectors,fields)
|
224
|
+
ds.name= self.name
|
225
|
+
ds
|
196
226
|
end
|
197
227
|
|
198
228
|
|
@@ -44,7 +44,7 @@ module Statsample
|
|
44
44
|
# Add a line showing normal distribution
|
45
45
|
attr_accessor :line_normal_distribution
|
46
46
|
# data could be a vector or a histogram
|
47
|
-
def initialize(data,opts=Hash.new)
|
47
|
+
def initialize(data, opts=Hash.new)
|
48
48
|
prov_name=(data.respond_to?(:name)) ? data.name : ""
|
49
49
|
opts_default={
|
50
50
|
:name=>_("Histograma (%s)") % prov_name,
|
@@ -79,6 +79,11 @@ module Statsample
|
|
79
79
|
def sst
|
80
80
|
raise "You should implement this"
|
81
81
|
end
|
82
|
+
# R^2 Adjusted.
|
83
|
+
# Estimate Population R^2 usign Ezequiel formula.
|
84
|
+
# Always lower than sample R^2
|
85
|
+
# == Reference:
|
86
|
+
# * Leach, L. & Henson, R. (2007). The Use and Impact of Adjusted R2 Effects in Published Regression Research. Multiple Linear Regression Viewpoints, 33(1), 1-11.
|
82
87
|
def r2_adjusted
|
83
88
|
r2-((1-r2)*@predictors_n).quo(df_e)
|
84
89
|
end
|
@@ -110,6 +110,8 @@ module Statsample
|
|
110
110
|
opts||=pca_options
|
111
111
|
Statsample::Factor::PCA.new(correlation_matrix, opts)
|
112
112
|
end
|
113
|
+
# Retrieve Velicer's MAP
|
114
|
+
# using all scales.
|
113
115
|
def map(opts=nil)
|
114
116
|
opts||=map_options
|
115
117
|
Statsample::Factor::MAP.new(correlation_matrix, opts)
|
@@ -141,7 +143,7 @@ module Statsample
|
|
141
143
|
def report_building(b) # :nodoc:
|
142
144
|
b.section(:name=>name) do |s|
|
143
145
|
s.section(:name=>_("Reliability analysis of scales")) do |s2|
|
144
|
-
@scales.each_pair do |k,scale|
|
146
|
+
@scales.each_pair do |k, scale|
|
145
147
|
s2.parse_element(scale)
|
146
148
|
end
|
147
149
|
end
|
@@ -22,11 +22,10 @@ module Statsample
|
|
22
22
|
|
23
23
|
@ods=ds
|
24
24
|
@ds=ds.dup_only_valid(ds.fields - @dumped)
|
25
|
-
|
25
|
+
@ds.name=ds.name
|
26
26
|
|
27
27
|
@k=@ds.fields.size
|
28
28
|
@total=@ds.vector_sum
|
29
|
-
|
30
29
|
@o_total=@dumped.size > 0 ? @ods.vector_sum : nil
|
31
30
|
|
32
31
|
@vector_mean=@ds.vector_mean
|
@@ -165,7 +164,7 @@ module Statsample
|
|
165
164
|
t.row(["#{@ods[f].name}(#{f})", "%0.5f" % @ods[f].mean])
|
166
165
|
end
|
167
166
|
end
|
168
|
-
s.parse_element(Statsample::Graph::Histogram.new(@o_total)) if @summary_histogram
|
167
|
+
s.parse_element(Statsample::Graph::Histogram.new(@o_total, :name=>"Histogram (complete data) for %s" % @name)) if @summary_histogram
|
169
168
|
end
|
170
169
|
end
|
171
170
|
|
@@ -229,7 +228,7 @@ module Statsample
|
|
229
228
|
t.row row
|
230
229
|
end # end each
|
231
230
|
end # table
|
232
|
-
s.parse_element(Statsample::Graph::Histogram.new(@total)) if @summary_histogram
|
231
|
+
s.parse_element(Statsample::Graph::Histogram.new(@total, :name=>"Histogram (valid data) for %s" % @name)) if @summary_histogram
|
233
232
|
end # section
|
234
233
|
end # def
|
235
234
|
end # class
|
data/lib/statsample/shorthand.rb
CHANGED
@@ -1,9 +1,36 @@
|
|
1
|
+
class Object
|
2
|
+
# Shorthand for Statsample::Analysis.store(*args,&block)
|
3
|
+
def ss_analysis(*args,&block)
|
4
|
+
Statsample::Analysis.store(*args,&block)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
1
8
|
module Statsample
|
2
9
|
# Module which provide shorthands for many methods.
|
3
10
|
module Shorthand
|
4
11
|
###
|
5
12
|
# :section: R like methods
|
6
13
|
###
|
14
|
+
def read_with_cache(klass, filename,opts=Hash.new, cache=true)
|
15
|
+
file_ds=filename+".ds"
|
16
|
+
if cache and (File.exists? file_ds and File.mtime(file_ds)>File.mtime(filename))
|
17
|
+
ds=Statsample.load(file_ds)
|
18
|
+
else
|
19
|
+
ds=klass.read(filename)
|
20
|
+
ds.save(file_ds) if cache
|
21
|
+
end
|
22
|
+
ds
|
23
|
+
end
|
24
|
+
# Import an Excel file. Cache result by default
|
25
|
+
def read_excel(filename, opts=Hash.new, cache=true)
|
26
|
+
read_with_cache(Statsample::Excel, filename, opts, cache)
|
27
|
+
|
28
|
+
end
|
29
|
+
# Import an CSV file. Cache result by default
|
30
|
+
|
31
|
+
def read_csv
|
32
|
+
read_with_cache(Statsample::CSV, filename, opts, cache)
|
33
|
+
end
|
7
34
|
|
8
35
|
# Retrieve names (fields) from dataset
|
9
36
|
def names(ds)
|
@@ -19,7 +46,7 @@ module Statsample
|
|
19
46
|
end
|
20
47
|
# Create a Statsample::Vector
|
21
48
|
# Analog to R's c
|
22
|
-
def
|
49
|
+
def vector(*args)
|
23
50
|
Statsample::Vector[*args]
|
24
51
|
end
|
25
52
|
# Random generation for the normal distribution
|
@@ -77,5 +104,18 @@ module Statsample
|
|
77
104
|
def dominance_analysis_bootstrap(*args)
|
78
105
|
Statsample::DominanceAnalysis::Bootstrap.new(*args)
|
79
106
|
end
|
107
|
+
def scale_analysis(*args)
|
108
|
+
Statsample::Reliability::ScaleAnalysis.new(*args)
|
109
|
+
end
|
110
|
+
def skill_scale_analysis(*args)
|
111
|
+
Statsample::Reliability::SkillScaleAnalysis.new(*args)
|
112
|
+
end
|
113
|
+
def multiscale_analysis(*args,&block)
|
114
|
+
Statsample::Reliability::MultiScaleAnalysis.new(*args,&block)
|
115
|
+
end
|
116
|
+
def test_u(*args)
|
117
|
+
Statsample::Test::UMannWhitney.new(*args)
|
118
|
+
end
|
119
|
+
module_function :test_u, :rnorm
|
80
120
|
end
|
81
121
|
end
|
data/lib/statsample/test.rb
CHANGED
@@ -8,6 +8,7 @@ module Statsample
|
|
8
8
|
autoload(:F, 'statsample/test/f')
|
9
9
|
autoload(:ChiSquare, 'statsample/test/chisquare')
|
10
10
|
autoload(:BartlettSphericity, 'statsample/test/bartlettsphericity')
|
11
|
+
autoload(:KolmogorovSmirnov, 'statsample/test/kolmogorovsmirnov')
|
11
12
|
|
12
13
|
# Returns probability of getting a value lower or higher
|
13
14
|
# than sample, using cdf and number of tails.
|
@@ -29,6 +30,15 @@ module Statsample
|
|
29
30
|
2*cdf
|
30
31
|
end
|
31
32
|
end
|
33
|
+
# Get critical t to create confidence interval
|
34
|
+
def t_critical(confidence_level, df)
|
35
|
+
-Distribution::T.p_value((1-confidence_level) / 2.0, df)
|
36
|
+
end
|
37
|
+
# Get critical z to create confidence interval
|
38
|
+
def z_critical(confidence_level)
|
39
|
+
-Distribution::Z.p_value((1-confidence_level) / 2.0)
|
40
|
+
end
|
41
|
+
|
32
42
|
extend self
|
33
43
|
# Calculate chi square for two Matrix
|
34
44
|
class << self
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Statsample
|
2
|
+
module Test
|
3
|
+
# == Kolmogorov-Smirnov's test of equality of distributions.
|
4
|
+
class KolmogorovSmirnov
|
5
|
+
|
6
|
+
attr_reader :d
|
7
|
+
include Statsample::Test
|
8
|
+
include Summarizable
|
9
|
+
# Creates a new Kolmogorov-Smirnov test
|
10
|
+
# d1 should have each method
|
11
|
+
# d2 could be a Distribution class, with a cdf method,
|
12
|
+
# a vector or a lambda
|
13
|
+
def initialize(d1,d2)
|
14
|
+
raise "First argument should have each method" unless d1.respond_to? :each
|
15
|
+
@d1=make_cdf(d1)
|
16
|
+
if d2.respond_to? :cdf or d2.is_a? Proc
|
17
|
+
@d2=d2
|
18
|
+
elsif d2.respond_to? :each
|
19
|
+
@d2=make_cdf(d2)
|
20
|
+
else
|
21
|
+
raise "Second argument should respond to cdf or each"
|
22
|
+
end
|
23
|
+
calculate
|
24
|
+
end
|
25
|
+
def calculate
|
26
|
+
d=0
|
27
|
+
@d1.each {|x|
|
28
|
+
v1=@d1.cdf(x);
|
29
|
+
v2=@d2.is_a?(Proc) ? @d2.call(x) : @d2.cdf(x)
|
30
|
+
d=(v1-v2).to_f.abs if (v1-v2).abs>d
|
31
|
+
}
|
32
|
+
@d=d
|
33
|
+
end
|
34
|
+
# Make a wrapper EmpiricDistribution to any method which implements
|
35
|
+
# each
|
36
|
+
# On Statsample::Vector, only uses #valid_data
|
37
|
+
def make_cdf(v)
|
38
|
+
v.is_a?(Statsample::Vector) ? EmpiricDistribution.new(v.valid_data) : EmpiricDistribution.new(v)
|
39
|
+
end
|
40
|
+
class EmpiricDistribution
|
41
|
+
def initialize(data)
|
42
|
+
@min=data.min
|
43
|
+
@max=data.max
|
44
|
+
@data=data.sort
|
45
|
+
@n=data.size
|
46
|
+
end
|
47
|
+
def each
|
48
|
+
@data.each {|x|
|
49
|
+
yield x
|
50
|
+
}
|
51
|
+
end
|
52
|
+
def cdf(x)
|
53
|
+
return 0 if x<@min
|
54
|
+
return 1 if x>=@max
|
55
|
+
v=@data.index{|v1| v1>=x}
|
56
|
+
v.nil? ? 0 : (v+(x==@data[v]? 1 : 0)).quo(@n)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/statsample/test/t.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
module Statsample
|
2
2
|
module Test
|
3
|
-
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
# A t-test is any statistical hypothesis test in which the test statistic follows a Student's t distribution, if the null hypothesis is supported
|
8
|
+
class T
|
9
|
+
|
4
10
|
class << self
|
5
11
|
include Math
|
6
12
|
# Test the null hypothesis that the population mean is equal to a specified value u, one uses the statistic.
|
@@ -10,7 +16,7 @@ module Statsample
|
|
10
16
|
# * <tt>s</tt>: sample/differences standard deviation
|
11
17
|
# * <tt>n</tt>: sample size
|
12
18
|
def one_sample(x,u,s,n)
|
13
|
-
(x-u)
|
19
|
+
(x-u)*Math::sqrt(n).quo(s)
|
14
20
|
end
|
15
21
|
# Test if means of two samples are different.
|
16
22
|
# * <tt>x1</tt>: sample 1 mean
|
@@ -50,6 +56,73 @@ module Statsample
|
|
50
56
|
num.quo(den)
|
51
57
|
end
|
52
58
|
end
|
59
|
+
|
60
|
+
include Statsample::Test
|
61
|
+
include Summarizable
|
62
|
+
attr_reader :standard_error, :estimate, :df
|
63
|
+
# Tails for p-value (:both, :left or :right). Default :both
|
64
|
+
attr_accessor :tails
|
65
|
+
# Name of F analysis
|
66
|
+
attr_accessor :name
|
67
|
+
attr_accessor :confidence_level
|
68
|
+
attr_reader :t
|
69
|
+
attr_accessor :estimate_name, :standard_error_name
|
70
|
+
# Creates a generic t test. Use OneSample or TwoSamplesIndependent
|
71
|
+
# classes for better summaries.
|
72
|
+
# Parameters:
|
73
|
+
# * estimate: estimate
|
74
|
+
# * standard_error: standard error of estimate
|
75
|
+
# * df: degrees of freedom
|
76
|
+
def initialize(estimate, standard_error, df, opts=Hash.new)
|
77
|
+
@estimate=estimate
|
78
|
+
@standard_error=standard_error
|
79
|
+
@df=df
|
80
|
+
@t = @estimate / @standard_error.to_f
|
81
|
+
opts_default={ :tails=>:both,
|
82
|
+
:name=>_("T Test"),
|
83
|
+
:estimate_name=>_("Estimate"),
|
84
|
+
:standard_error_name=>_("Std.Err.of Estimate"),
|
85
|
+
:confidence_level=>0.95}
|
86
|
+
@opts = opts_default.merge(opts)
|
87
|
+
|
88
|
+
@opts.keys.each {|k|
|
89
|
+
send("#{k}=", @opts[k]) if respond_to? k
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
alias :se :standard_error
|
94
|
+
|
95
|
+
def to_f
|
96
|
+
t
|
97
|
+
end
|
98
|
+
|
99
|
+
# probability
|
100
|
+
def probability
|
101
|
+
p_using_cdf(Distribution::T.cdf(t, df), tails)
|
102
|
+
end
|
103
|
+
|
104
|
+
def confidence_interval(cl=nil)
|
105
|
+
cl||=confidence_level
|
106
|
+
t_crit = t_critical(cl, df)
|
107
|
+
[estimate - se*t_crit, estimate + se*t_crit]
|
108
|
+
end
|
109
|
+
alias :ci :confidence_interval
|
110
|
+
|
111
|
+
|
112
|
+
def report_building(builder) #:nodoc:
|
113
|
+
builder.section(:name=>@name) do |section|
|
114
|
+
section.text _("%s: %0.4f | %s: %0.4f") % [@estimate_name, @estimate, @standard_error_name, se]
|
115
|
+
report_building_t(section)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
def report_building_t(s)
|
119
|
+
df_f=@df.is_a?(Integer) ? "%d" : "%0.4f"
|
120
|
+
s.text _("t(%d) = %0.4f, p=%0.4f (%s tails)") % [df, t,probability, tails]
|
121
|
+
s.text _("CI(%d%%): %0.4f - %0.4f") % [confidence_level*100, ci[0],ci[1]]
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
|
53
126
|
# One Sample t-test
|
54
127
|
# == Usage
|
55
128
|
# a=1000.times.map {rand(100)}.to_scale
|
@@ -91,22 +164,32 @@ module Statsample
|
|
91
164
|
@name=@opts[:name]
|
92
165
|
@u=@opts[:u]
|
93
166
|
@tails=@opts[:tails]
|
167
|
+
@confidence_level=@opts[:confidence_level] || 0.95
|
94
168
|
@df= @vector.n_valid-1
|
95
169
|
@t=nil
|
96
170
|
end
|
171
|
+
def t_object
|
172
|
+
T.new(@vector.mean-u, @vector.se, @vector.n_valid-1, opts)
|
173
|
+
end
|
97
174
|
def t
|
98
|
-
|
175
|
+
t_object.t
|
99
176
|
end
|
100
|
-
|
101
177
|
def probability
|
102
|
-
|
178
|
+
t_object.probability
|
179
|
+
end
|
180
|
+
def standard_error
|
181
|
+
t_object.standard_error
|
182
|
+
end
|
183
|
+
alias :se :standard_error
|
184
|
+
def confidence_interval(cl=nil)
|
185
|
+
t_object.confidence_interval(cl)
|
103
186
|
end
|
187
|
+
alias :ci :confidence_interval
|
104
188
|
def report_building(b) # :nodoc:
|
105
189
|
b.section(:name=>@name) {|s|
|
106
|
-
s.text "Sample mean:
|
107
|
-
s.text "Population mean
|
108
|
-
s
|
109
|
-
s.text sprintf("t = %0.4f, p=%0.4f, d.f=%d", t, probability, df)
|
190
|
+
s.text _("Sample mean: %0.4f | Sample sd: %0.4f | se : %0.4f") % [@vector.mean, @vector.sd, se]
|
191
|
+
s.text _("Population mean: %0.4f") % u if u!=0
|
192
|
+
t_object.report_building_t(s)
|
110
193
|
}
|
111
194
|
end
|
112
195
|
end
|