statsample 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +14 -0
- data/Gemfile +1 -16
- data/History.txt +51 -46
- data/LICENSE.txt +7 -82
- data/README.md +145 -150
- data/Rakefile +20 -102
- data/lib/spss.rb +17 -14
- data/lib/statsample/crosstab.rb +2 -2
- data/lib/statsample/dataset.rb +82 -81
- data/lib/statsample/matrix.rb +43 -43
- data/lib/statsample/reliability.rb +1 -2
- data/lib/statsample/vector.rb +157 -124
- data/lib/statsample/version.rb +1 -1
- data/lib/statsample.rb +91 -91
- data/references.txt +2 -1
- data/statsample.gemspec +89 -0
- data/test/test_awesome_print_bug.rb +16 -0
- data/test/test_crosstab.rb +8 -0
- data/test/test_histogram.rb +7 -0
- data/test/test_vector.rb +62 -48
- metadata +109 -120
- data/.gemtest +0 -0
- data/Gemfile.lock +0 -78
- data/Manifest.txt +0 -157
- data/setup.rb +0 -1585
data/lib/statsample/version.rb
CHANGED
data/lib/statsample.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# = statsample.rb -
|
1
|
+
# = statsample.rb -
|
2
2
|
# Statsample - Statistic package for Ruby
|
3
3
|
# Copyright (C) 2008-2014 Claudio Bustos
|
4
4
|
#
|
@@ -17,17 +17,16 @@
|
|
17
17
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
18
18
|
#
|
19
19
|
|
20
|
-
|
21
|
-
#$:.unshift(File.dirname(__FILE__))
|
22
20
|
require 'matrix'
|
23
21
|
require 'extendmatrix'
|
24
22
|
require 'distribution'
|
25
23
|
require 'dirty-memoize'
|
26
24
|
require 'reportbuilder'
|
27
25
|
|
28
|
-
|
29
26
|
class Numeric
|
30
|
-
def square
|
27
|
+
def square
|
28
|
+
self * self
|
29
|
+
end
|
31
30
|
end
|
32
31
|
|
33
32
|
class String
|
@@ -41,10 +40,10 @@ class String
|
|
41
40
|
end
|
42
41
|
|
43
42
|
class Module
|
44
|
-
def include_aliasing(m, suffix=
|
43
|
+
def include_aliasing(m, suffix = 'ruby')
|
45
44
|
m.instance_methods.each do |f|
|
46
45
|
if instance_methods.include? f
|
47
|
-
alias_method("#{f}_#{suffix}",f)
|
46
|
+
alias_method("#{f}_#{suffix}", f)
|
48
47
|
remove_method f
|
49
48
|
end
|
50
49
|
end
|
@@ -60,15 +59,26 @@ class Array
|
|
60
59
|
# a.recode_repeated
|
61
60
|
# => ["a","b","c_1","c_2","d_1","d_2","d_3","e"]
|
62
61
|
def recode_repeated
|
63
|
-
if
|
62
|
+
if size != uniq.size
|
64
63
|
# Find repeated
|
65
|
-
repeated=
|
66
|
-
|
67
|
-
|
68
|
-
|
64
|
+
repeated = inject({}) do |acc, v|
|
65
|
+
if acc[v].nil?
|
66
|
+
acc[v] = 1
|
67
|
+
else
|
68
|
+
acc[v] += 1
|
69
|
+
end
|
70
|
+
acc
|
71
|
+
end.select { |_k, v| v > 1 }.keys
|
72
|
+
|
73
|
+
ns = repeated.inject({}) do |acc, v|
|
74
|
+
acc[v] = 0
|
75
|
+
acc
|
76
|
+
end
|
77
|
+
|
78
|
+
collect do |f|
|
69
79
|
if repeated.include? f
|
70
|
-
ns[f]+=1
|
71
|
-
sprintf(
|
80
|
+
ns[f] += 1
|
81
|
+
sprintf('%s_%d', f, ns[f])
|
72
82
|
else
|
73
83
|
f
|
74
84
|
end
|
@@ -79,61 +89,62 @@ class Array
|
|
79
89
|
end
|
80
90
|
end
|
81
91
|
|
82
|
-
def create_test(*args
|
83
|
-
description=args.shift
|
84
|
-
fields=args
|
92
|
+
def create_test(*args, &_proc)
|
93
|
+
description = args.shift
|
94
|
+
fields = args
|
85
95
|
[description, fields, Proc.new]
|
86
96
|
end
|
97
|
+
|
87
98
|
#--
|
88
99
|
# Test extensions
|
89
100
|
begin
|
90
101
|
require 'gettext'
|
91
102
|
rescue LoadError
|
92
103
|
def bindtextdomain(d) #:nodoc:
|
93
|
-
|
104
|
+
d
|
94
105
|
end
|
95
|
-
|
106
|
+
|
96
107
|
# Bored module
|
97
108
|
module GetText #:nodoc:
|
98
|
-
def _(t)
|
99
|
-
|
109
|
+
def _(t)
|
110
|
+
t
|
100
111
|
end
|
101
112
|
end
|
102
113
|
end
|
114
|
+
|
103
115
|
# Library for statistical analysis on Ruby
|
104
116
|
#
|
105
117
|
# * Classes for manipulation and storage of data:
|
106
118
|
# * Module Statsample::Bivariate provides covariance and pearson, spearman, point biserial, tau a, tau b, gamma, tetrachoric (see Bivariate::Tetrachoric) and polychoric (see Bivariate::Polychoric) correlations. Include methods to create correlation and covariance matrices
|
107
119
|
# * Multiple types of regression on Statsample::Regression
|
108
120
|
# * Factorial Analysis algorithms on Statsample::Factor module.
|
109
|
-
# * Dominance Analysis. Based on Budescu and Azen papers.link[http://psycnet.apa.org/journals/met/8/2/129/].
|
121
|
+
# * Dominance Analysis. Based on Budescu and Azen papers.link[http://psycnet.apa.org/journals/met/8/2/129/].
|
110
122
|
# * Module Statsample::Codification, to help to codify open questions
|
111
123
|
# * Converters to import and export data from databases, csv and excel files.
|
112
124
|
# * Module Statsample::Crosstab provides function to create crosstab for categorical data
|
113
125
|
# * Reliability analysis provides functions to analyze scales.
|
114
126
|
# * Module Statsample::SRS (Simple Random Sampling) provides a lot of functions to estimate standard error for several type of samples
|
115
|
-
# * Interfaces to gdchart, gnuplot and SVG::Graph
|
127
|
+
# * Interfaces to gdchart, gnuplot and SVG::Graph
|
116
128
|
#
|
117
129
|
module Statsample
|
118
|
-
|
119
130
|
def self.create_has_library(library)
|
120
131
|
define_singleton_method("has_#{library}?") do
|
121
|
-
cv="@@#{library}"
|
122
|
-
|
123
|
-
begin
|
132
|
+
cv = "@@#{library}"
|
133
|
+
unless class_variable_defined? cv
|
134
|
+
begin
|
124
135
|
require library.to_s
|
125
|
-
class_variable_set(cv,true)
|
136
|
+
class_variable_set(cv, true)
|
126
137
|
rescue LoadError
|
127
|
-
class_variable_set(cv,false)
|
138
|
+
class_variable_set(cv, false)
|
128
139
|
end
|
129
140
|
end
|
130
141
|
class_variable_get(cv)
|
131
142
|
end
|
132
143
|
end
|
133
|
-
|
144
|
+
|
134
145
|
create_has_library :gsl
|
135
|
-
|
136
|
-
SPLIT_TOKEN =
|
146
|
+
|
147
|
+
SPLIT_TOKEN = ','
|
137
148
|
autoload(:Analysis, 'statsample/analysis')
|
138
149
|
autoload(:Database, 'statsample/converters')
|
139
150
|
autoload(:Anova, 'statsample/anova')
|
@@ -154,133 +165,122 @@ module Statsample
|
|
154
165
|
autoload(:Multivariate, 'statsample/multivariate')
|
155
166
|
autoload(:Multiset, 'statsample/multiset')
|
156
167
|
autoload(:StratifiedSample, 'statsample/multiset')
|
157
|
-
autoload(:MLE, 'statsample/mle')
|
168
|
+
autoload(:MLE, 'statsample/mle')
|
158
169
|
autoload(:Regression, 'statsample/regression')
|
159
170
|
autoload(:Test, 'statsample/test')
|
160
171
|
autoload(:Factor, 'statsample/factor')
|
161
172
|
autoload(:Graph, 'statsample/graph')
|
162
|
-
|
163
|
-
|
173
|
+
|
164
174
|
class << self
|
165
175
|
# Load a object saved on a file.
|
166
176
|
def load(filename)
|
167
177
|
if File.exist? filename
|
168
|
-
o=false
|
169
|
-
File.open(filename,
|
178
|
+
o = false
|
179
|
+
File.open(filename, 'r') { |fp| o = Marshal.load(fp) }
|
170
180
|
o
|
171
181
|
else
|
172
182
|
false
|
173
183
|
end
|
174
184
|
end
|
175
|
-
|
176
|
-
|
177
|
-
|
185
|
+
|
178
186
|
# Create a matrix using vectors as columns.
|
179
187
|
# Use:
|
180
188
|
#
|
181
189
|
# matrix=Statsample.vector_cols_matrix(v1,v2)
|
182
190
|
def vector_cols_matrix(*vs)
|
183
191
|
# test
|
184
|
-
size=vs[0].size
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
})
|
192
|
+
size = vs[0].size
|
193
|
+
|
194
|
+
vs.each do |v|
|
195
|
+
fail ArgumentError, 'Arguments should be Vector' unless v.instance_of? Statsample::Vector
|
196
|
+
fail ArgumentError, 'Vectors size should be the same' if v.size != size
|
197
|
+
end
|
198
|
+
|
199
|
+
Matrix.rows((0...size).to_a.collect { |i| vs.collect { |v| v[i] } })
|
192
200
|
end
|
201
|
+
|
193
202
|
# Returns a duplicate of the input vectors, without missing data
|
194
203
|
# for any of the vectors.
|
195
|
-
#
|
204
|
+
#
|
196
205
|
# a=[1,2,3,6,7,nil,3,5].to_scale
|
197
206
|
# b=[nil,nil,5,6,4,5,10,2].to_scale
|
198
207
|
# c=[2,4,6,7,4,5,6,7].to_scale
|
199
208
|
# a2,b2,c2=Statsample.only_valid(a,b,c)
|
200
|
-
# => [#<Statsample::Scale:0xb748c8c8 @data=[3, 6, 7, 3, 5]>,
|
201
|
-
# #<Statsample::Scale:0xb748c814 @data=[5, 6, 4, 10, 2]>,
|
209
|
+
# => [#<Statsample::Scale:0xb748c8c8 @data=[3, 6, 7, 3, 5]>,
|
210
|
+
# #<Statsample::Scale:0xb748c814 @data=[5, 6, 4, 10, 2]>,
|
202
211
|
# #<Statsample::Scale:0xb748c760 @data=[6, 7, 4, 6, 7]>]
|
203
212
|
#
|
204
213
|
def only_valid(*vs)
|
205
|
-
i=1
|
206
|
-
h=vs.inject({}) {|
|
207
|
-
ds=Statsample::Dataset.new(h).dup_only_valid
|
214
|
+
i = 1
|
215
|
+
h = vs.inject({}) { |acc, v| acc["v#{i}"] = v; i += 1; acc }
|
216
|
+
ds = Statsample::Dataset.new(h).dup_only_valid
|
208
217
|
ds.vectors.values
|
209
218
|
end
|
210
|
-
|
211
|
-
# Cheap version of #only_valid.
|
219
|
+
|
220
|
+
# Cheap version of #only_valid.
|
212
221
|
# If any vectors have missing_values, return only valid.
|
213
222
|
# If not, return the vectors itself
|
214
223
|
def only_valid_clone(*vs)
|
215
|
-
if vs.any?
|
224
|
+
if vs.any?(&:flawed?)
|
216
225
|
only_valid(*vs)
|
217
226
|
else
|
218
227
|
vs
|
219
228
|
end
|
220
229
|
end
|
221
|
-
end
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
230
|
+
end
|
231
|
+
|
226
232
|
module Util
|
227
233
|
# Reference: http://www.itl.nist.gov/div898/handbook/eda/section3/normprpl.htm
|
228
|
-
def normal_order_statistic_medians(i,n)
|
229
|
-
if i==1
|
230
|
-
u= 1.0 - normal_order_statistic_medians(n,n)
|
231
|
-
elsif i==n
|
232
|
-
u=0.5**(1 / n.to_f)
|
234
|
+
def normal_order_statistic_medians(i, n)
|
235
|
+
if i == 1
|
236
|
+
u = 1.0 - normal_order_statistic_medians(n, n)
|
237
|
+
elsif i == n
|
238
|
+
u = 0.5**(1 / n.to_f)
|
233
239
|
else
|
234
|
-
u= (i - 0.3175) / (n + 0.365)
|
240
|
+
u = (i - 0.3175) / (n + 0.365)
|
235
241
|
end
|
236
242
|
u
|
237
243
|
end
|
238
|
-
|
239
|
-
def self.nice(s,e) # :nodoc:
|
240
|
-
reverse = e<s
|
244
|
+
|
245
|
+
def self.nice(s, e) # :nodoc:
|
246
|
+
reverse = e < s
|
241
247
|
min = reverse ? e : s
|
242
248
|
max = reverse ? s : e
|
243
|
-
span=max-min
|
244
|
-
return [s, e] if
|
245
|
-
|
246
|
-
step=10**((Math
|
247
|
-
out=[(min.quo(step)).floor * step, (max.quo(step)).ceil * step]
|
249
|
+
span = max - min
|
250
|
+
return [s, e] if span == 0 || (span.respond_to?(:infinite?) && span.infinite?)
|
251
|
+
|
252
|
+
step = 10**((Math.log(span).quo(Math.log(10))).round - 1).to_f
|
253
|
+
out = [(min.quo(step)).floor * step, (max.quo(step)).ceil * step]
|
248
254
|
out.reverse! if reverse
|
249
255
|
out
|
250
256
|
end
|
251
|
-
|
252
|
-
|
253
257
|
end
|
254
|
-
|
255
|
-
|
256
|
-
|
258
|
+
|
257
259
|
module Writable
|
258
260
|
def save(filename)
|
259
|
-
fp=File.open(filename,
|
260
|
-
Marshal.dump(self,fp)
|
261
|
+
fp = File.open(filename, 'w')
|
262
|
+
Marshal.dump(self, fp)
|
261
263
|
fp.close
|
262
|
-
end
|
264
|
+
end
|
263
265
|
end
|
264
266
|
# Provides method summary to generate summaries and include GetText
|
265
267
|
module Summarizable
|
266
268
|
include GetText
|
267
|
-
bindtextdomain(
|
268
|
-
def summary(method
|
269
|
-
ReportBuilder.new(:
|
269
|
+
bindtextdomain('statsample')
|
270
|
+
def summary(method = :to_text)
|
271
|
+
ReportBuilder.new(no_title: true).add(self).send(method)
|
270
272
|
end
|
271
273
|
end
|
272
274
|
module STATSAMPLE__ #:nodoc:
|
273
275
|
end
|
274
276
|
end
|
275
277
|
|
276
|
-
|
277
|
-
|
278
278
|
#--
|
279
|
-
begin
|
279
|
+
begin
|
280
280
|
require 'statsamplert'
|
281
281
|
rescue LoadError
|
282
282
|
module Statsample
|
283
|
-
OPTIMIZED=false
|
283
|
+
OPTIMIZED = false
|
284
284
|
end
|
285
285
|
end
|
286
286
|
|
data/references.txt
CHANGED
@@ -8,11 +8,13 @@ References
|
|
8
8
|
* Dziuban, C., & Shirkey E. (1974). When is a correlation matrix appropriate for factor analysis? Some decision rules. Psychological Bulletin, 81(6), 358-361.
|
9
9
|
* Hayton, J., Allen, D. & Scarpello, V.(2004). Factor Retention Decisions in Exploratory Factor Analysis: a Tutorial on Parallel Analysis. <i>Organizational Research Methods, 7</i> (2), 191-205.
|
10
10
|
* Härdle, W. & Simar, L. (2003). Applied Multivariate Statistical Analysis. Springer
|
11
|
+
* 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.
|
11
12
|
* Lin, J. (2007). VARIMAX_K58 [Source code]. [http://www.johnny-lin.com/idl_code/varimax_k58.pro]
|
12
13
|
* Liu, O., & Rijmen, F. (2008). A modified procedure for parallel analysis of ordered categorical data. Behavior Research Methods, 40(2), 556-562.
|
13
14
|
* McGraw, K. & Wong, S.P. (1996). Forming Inferences About Some Intraclass Correlation Coefficients. Psychological methods, 1(1), 30-46.
|
14
15
|
* O'Connor, B. (2000). SPSS and SAS programs for determining the number of components using parallel analysis and Velicer's MAP test. Behavior Research Methods, Instruments, & Computers, 32(3), 396-402.
|
15
16
|
* SPSS Manual
|
17
|
+
* Sawyer, S. (2005). Resampling Data: Using a Statistical Jacknife.
|
16
18
|
* Shrout,P. & Fleiss, J. (1979). Intraclass Correlation: Uses in assessing rater reliability. Psychological Bulletin, 86(2), 420-428
|
17
19
|
* Smith, L. (2002). A tutorial on Principal Component Analysis. Available on http://courses.eas.ualberta.ca/eas570/pca_tutorial.pdf
|
18
20
|
* http://en.wikipedia.org/wiki/Welch-Satterthwaite_equation
|
@@ -20,4 +22,3 @@ References
|
|
20
22
|
* http://stattrek.com/Lesson6/SRS.aspx
|
21
23
|
* http://talkstats.com/showthread.php?t=5056
|
22
24
|
* http://www.gnu.org/software/gsl/manual/html_node/The-histogram-struct.html
|
23
|
-
* http://www.taygeta.com/random/gaussian.html
|
data/statsample.gemspec
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
$:.unshift File.expand_path("../lib/", __FILE__)
|
2
|
+
|
3
|
+
require 'statsample/version'
|
4
|
+
require 'date'
|
5
|
+
|
6
|
+
DESCRIPTION = <<MSG
|
7
|
+
A suite for basic and advanced statistics on Ruby. Tested on CRuby 1.9.3, 2.0.0
|
8
|
+
and 2.1.1. See `.travis.yml` for more information.
|
9
|
+
|
10
|
+
Include:
|
11
|
+
|
12
|
+
- Descriptive statistics: frequencies, median, mean,
|
13
|
+
standard error, skew, kurtosis (and many others).
|
14
|
+
- Imports and exports datasets from and to Excel, CSV and plain text files.
|
15
|
+
- Correlations: Pearson's r, Spearman's rank correlation (rho), point biserial,
|
16
|
+
tau a, tau b and gamma. Tetrachoric and Polychoric correlation provides by
|
17
|
+
statsample-bivariate-extension gem.
|
18
|
+
- Intra-class correlation
|
19
|
+
- Anova: generic and vector-based One-way ANOVA and Two-way ANOVA, with contrasts for
|
20
|
+
One-way ANOVA.
|
21
|
+
- Tests: F, T, Levene, U-Mannwhitney.
|
22
|
+
- Regression: Simple, Multiple (OLS), Probit and Logit
|
23
|
+
- Factorial Analysis: Extraction (PCA and Principal Axis), Rotation (Varimax,
|
24
|
+
Equimax, Quartimax) and Parallel Analysis and Velicer's MAP test, for
|
25
|
+
estimation of number of factors.
|
26
|
+
- Reliability analysis for simple scale and a DSL to easily analyze multiple
|
27
|
+
scales using factor analysis and correlations, if you want it.
|
28
|
+
- Dominance Analysis, with multivariate dependent and bootstrap (Azen & Budescu)
|
29
|
+
- Sample calculation related formulas
|
30
|
+
- Structural Equation Modeling (SEM), using R libraries +sem+ and +OpenMx+
|
31
|
+
- Creates reports on text, html and rtf, using ReportBuilder gem
|
32
|
+
- Graphics: Histogram, Boxplot and Scatterplot.
|
33
|
+
MSG
|
34
|
+
|
35
|
+
POSTINSTALL = <<MSG
|
36
|
+
***************************************************
|
37
|
+
|
38
|
+
Thanks for installing statsample.
|
39
|
+
|
40
|
+
On *nix, you could install statsample-optimization
|
41
|
+
to retrieve gems gsl, statistics2 and a C extension
|
42
|
+
to speed some methods.
|
43
|
+
|
44
|
+
$ [sudo] gem install statsample-optimization
|
45
|
+
|
46
|
+
*****************************************************
|
47
|
+
MSG
|
48
|
+
|
49
|
+
Gem::Specification.new do |s|
|
50
|
+
s.name = "statsample"
|
51
|
+
s.version = Statsample::VERSION
|
52
|
+
s.date = Date.today.to_s
|
53
|
+
s.homepage = "https://github.com/sciruby/statsample"
|
54
|
+
|
55
|
+
s.authors = ["Claudio Bustos", "Carlos Agarie"]
|
56
|
+
s.email = ["clbustos@gmail.com", "carlos@onox.com.br"]
|
57
|
+
|
58
|
+
s.summary = "A suite for basic and advanced statistics on Ruby"
|
59
|
+
s.description = DESCRIPTION
|
60
|
+
s.post_install_message = POSTINSTALL
|
61
|
+
|
62
|
+
s.rdoc_options = ["--main", "README.md"]
|
63
|
+
s.extra_rdoc_files = ["History.txt", "LICENSE.txt", "README.md", "references.txt"]
|
64
|
+
s.require_paths = ["lib"]
|
65
|
+
|
66
|
+
s.files = `git ls-files`.split("\n")
|
67
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
68
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
69
|
+
|
70
|
+
s.add_runtime_dependency 'spreadsheet', '~> 0.6.5'
|
71
|
+
s.add_runtime_dependency 'reportbuilder', '~> 1.4'
|
72
|
+
s.add_runtime_dependency 'minimization'
|
73
|
+
s.add_runtime_dependency 'dirty-memoize'
|
74
|
+
s.add_runtime_dependency 'extendmatrix'
|
75
|
+
s.add_runtime_dependency 'rserve-client'
|
76
|
+
s.add_runtime_dependency 'rubyvis', '~> 0.5.0'
|
77
|
+
s.add_runtime_dependency 'distribution'
|
78
|
+
s.add_runtime_dependency 'rb-gsl'
|
79
|
+
s.add_runtime_dependency 'awesome_print'
|
80
|
+
|
81
|
+
s.add_development_dependency 'bundler'
|
82
|
+
s.add_development_dependency 'rake'
|
83
|
+
s.add_development_dependency 'rdoc'
|
84
|
+
s.add_development_dependency 'shoulda'
|
85
|
+
s.add_development_dependency 'shoulda-matchers', '~> 2.2'
|
86
|
+
s.add_development_dependency 'minitest'
|
87
|
+
s.add_development_dependency 'gettext'
|
88
|
+
s.add_development_dependency 'mocha'
|
89
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require(File.expand_path(File.dirname(__FILE__)+'/helpers_tests.rb'))
|
2
|
+
class StatsampleAwesomePrintBug < MiniTest::Test
|
3
|
+
context("Awesome Print integration") do
|
4
|
+
setup do
|
5
|
+
require "awesome_print"
|
6
|
+
end
|
7
|
+
should "should be flawless" do
|
8
|
+
a=[1,2,3].to_scale
|
9
|
+
|
10
|
+
assert(a!=[1,2,3])
|
11
|
+
assert_nothing_raised do
|
12
|
+
ap a
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/test/test_crosstab.rb
CHANGED
@@ -52,4 +52,12 @@ class StatsampleCrosstabTestCase < MiniTest::Unit::TestCase
|
|
52
52
|
ct=Statsample::Crosstab.new(v1,v2)
|
53
53
|
assert_equal(Matrix[[2.5,2.5],[2.5,2.5]],ct.matrix_expected)
|
54
54
|
end
|
55
|
+
def test_crosstab_with_scale
|
56
|
+
v1=%w{1 1 1 1 1 0 0 0 0 0}.to_scale
|
57
|
+
v2=%w{0 0 0 0 0 1 1 1 1 1}.to_scale
|
58
|
+
ct=Statsample::Crosstab.new(v1,v2)
|
59
|
+
assert_equal(Matrix[[0,5],[5,0]],ct.to_matrix)
|
60
|
+
assert_nothing_raised { ct.summary }
|
61
|
+
end
|
62
|
+
|
55
63
|
end
|
data/test/test_histogram.rb
CHANGED
@@ -100,6 +100,13 @@ class StatsampleHistogramTestCase < MiniTest::Unit::TestCase
|
|
100
100
|
assert_equal(2,h.sum(1,4))
|
101
101
|
|
102
102
|
end
|
103
|
+
should "not raise exception when all values equal" do
|
104
|
+
assert_nothing_raised do
|
105
|
+
a = [5,5,5,5,5,5].to_scale
|
106
|
+
h=Statsample::Graph::Histogram.new(a)
|
107
|
+
h.to_svg
|
108
|
+
end
|
109
|
+
end
|
103
110
|
|
104
111
|
end
|
105
112
|
end
|