statsample-ekatena 2.0.2

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.
Files changed (156) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +23 -0
  4. data/CONTRIBUTING.md +17 -0
  5. data/Gemfile +2 -0
  6. data/History.txt +457 -0
  7. data/LICENSE.txt +12 -0
  8. data/README.md +175 -0
  9. data/Rakefile +44 -0
  10. data/benchmarks/correlation_matrix_15_variables.rb +32 -0
  11. data/benchmarks/correlation_matrix_5_variables.rb +33 -0
  12. data/benchmarks/correlation_matrix_methods/correlation_matrix.ds +0 -0
  13. data/benchmarks/correlation_matrix_methods/correlation_matrix.html +93 -0
  14. data/benchmarks/correlation_matrix_methods/correlation_matrix.rb +71 -0
  15. data/benchmarks/correlation_matrix_methods/correlation_matrix.xls +0 -0
  16. data/benchmarks/correlation_matrix_methods/correlation_matrix_gsl_ruby.ods +0 -0
  17. data/benchmarks/correlation_matrix_methods/correlation_matrix_with_graphics.ods +0 -0
  18. data/benchmarks/correlation_matrix_methods/results.ds +0 -0
  19. data/benchmarks/factor_map.rb +37 -0
  20. data/benchmarks/helpers_benchmark.rb +5 -0
  21. data/data/locale/es/LC_MESSAGES/statsample.mo +0 -0
  22. data/doc_latex/manual/equations.tex +78 -0
  23. data/examples/boxplot.rb +28 -0
  24. data/examples/chisquare_test.rb +23 -0
  25. data/examples/correlation_matrix.rb +32 -0
  26. data/examples/dataset.rb +30 -0
  27. data/examples/dominance_analysis.rb +33 -0
  28. data/examples/dominance_analysis_bootstrap.rb +32 -0
  29. data/examples/histogram.rb +26 -0
  30. data/examples/icc.rb +24 -0
  31. data/examples/levene.rb +29 -0
  32. data/examples/multiple_regression.rb +20 -0
  33. data/examples/multivariate_correlation.rb +33 -0
  34. data/examples/parallel_analysis.rb +40 -0
  35. data/examples/polychoric.rb +40 -0
  36. data/examples/principal_axis.rb +26 -0
  37. data/examples/reliability.rb +31 -0
  38. data/examples/scatterplot.rb +25 -0
  39. data/examples/t_test.rb +27 -0
  40. data/examples/tetrachoric.rb +17 -0
  41. data/examples/u_test.rb +24 -0
  42. data/examples/vector.rb +20 -0
  43. data/examples/velicer_map_test.rb +46 -0
  44. data/grab_references.rb +29 -0
  45. data/lib/spss.rb +134 -0
  46. data/lib/statsample-ekatena/analysis.rb +100 -0
  47. data/lib/statsample-ekatena/analysis/suite.rb +89 -0
  48. data/lib/statsample-ekatena/analysis/suitereportbuilder.rb +44 -0
  49. data/lib/statsample-ekatena/anova.rb +24 -0
  50. data/lib/statsample-ekatena/anova/contrast.rb +79 -0
  51. data/lib/statsample-ekatena/anova/oneway.rb +187 -0
  52. data/lib/statsample-ekatena/anova/twoway.rb +207 -0
  53. data/lib/statsample-ekatena/bivariate.rb +406 -0
  54. data/lib/statsample-ekatena/bivariate/pearson.rb +54 -0
  55. data/lib/statsample-ekatena/codification.rb +182 -0
  56. data/lib/statsample-ekatena/converter/csv.rb +28 -0
  57. data/lib/statsample-ekatena/converter/spss.rb +48 -0
  58. data/lib/statsample-ekatena/converters.rb +211 -0
  59. data/lib/statsample-ekatena/crosstab.rb +188 -0
  60. data/lib/statsample-ekatena/daru.rb +115 -0
  61. data/lib/statsample-ekatena/dataset.rb +10 -0
  62. data/lib/statsample-ekatena/dominanceanalysis.rb +425 -0
  63. data/lib/statsample-ekatena/dominanceanalysis/bootstrap.rb +232 -0
  64. data/lib/statsample-ekatena/factor.rb +104 -0
  65. data/lib/statsample-ekatena/factor/map.rb +124 -0
  66. data/lib/statsample-ekatena/factor/parallelanalysis.rb +166 -0
  67. data/lib/statsample-ekatena/factor/pca.rb +242 -0
  68. data/lib/statsample-ekatena/factor/principalaxis.rb +243 -0
  69. data/lib/statsample-ekatena/factor/rotation.rb +198 -0
  70. data/lib/statsample-ekatena/formula/fit_model.rb +46 -0
  71. data/lib/statsample-ekatena/formula/formula.rb +306 -0
  72. data/lib/statsample-ekatena/graph.rb +11 -0
  73. data/lib/statsample-ekatena/graph/boxplot.rb +236 -0
  74. data/lib/statsample-ekatena/graph/histogram.rb +198 -0
  75. data/lib/statsample-ekatena/graph/scatterplot.rb +213 -0
  76. data/lib/statsample-ekatena/histogram.rb +180 -0
  77. data/lib/statsample-ekatena/matrix.rb +329 -0
  78. data/lib/statsample-ekatena/multiset.rb +310 -0
  79. data/lib/statsample-ekatena/regression.rb +65 -0
  80. data/lib/statsample-ekatena/regression/multiple.rb +89 -0
  81. data/lib/statsample-ekatena/regression/multiple/alglibengine.rb +128 -0
  82. data/lib/statsample-ekatena/regression/multiple/baseengine.rb +251 -0
  83. data/lib/statsample-ekatena/regression/multiple/gslengine.rb +129 -0
  84. data/lib/statsample-ekatena/regression/multiple/matrixengine.rb +205 -0
  85. data/lib/statsample-ekatena/regression/multiple/rubyengine.rb +86 -0
  86. data/lib/statsample-ekatena/regression/simple.rb +121 -0
  87. data/lib/statsample-ekatena/reliability.rb +150 -0
  88. data/lib/statsample-ekatena/reliability/icc.rb +415 -0
  89. data/lib/statsample-ekatena/reliability/multiscaleanalysis.rb +181 -0
  90. data/lib/statsample-ekatena/reliability/scaleanalysis.rb +233 -0
  91. data/lib/statsample-ekatena/reliability/skillscaleanalysis.rb +114 -0
  92. data/lib/statsample-ekatena/resample.rb +15 -0
  93. data/lib/statsample-ekatena/shorthand.rb +125 -0
  94. data/lib/statsample-ekatena/srs.rb +169 -0
  95. data/lib/statsample-ekatena/test.rb +82 -0
  96. data/lib/statsample-ekatena/test/bartlettsphericity.rb +45 -0
  97. data/lib/statsample-ekatena/test/chisquare.rb +73 -0
  98. data/lib/statsample-ekatena/test/f.rb +52 -0
  99. data/lib/statsample-ekatena/test/kolmogorovsmirnov.rb +63 -0
  100. data/lib/statsample-ekatena/test/levene.rb +88 -0
  101. data/lib/statsample-ekatena/test/t.rb +309 -0
  102. data/lib/statsample-ekatena/test/umannwhitney.rb +208 -0
  103. data/lib/statsample-ekatena/test/wilcoxonsignedrank.rb +90 -0
  104. data/lib/statsample-ekatena/vector.rb +19 -0
  105. data/lib/statsample-ekatena/version.rb +3 -0
  106. data/lib/statsample.rb +282 -0
  107. data/po/es/statsample.mo +0 -0
  108. data/po/es/statsample.po +959 -0
  109. data/po/statsample.pot +947 -0
  110. data/references.txt +24 -0
  111. data/statsample-ekatena.gemspec +49 -0
  112. data/test/fixtures/bank2.dat +200 -0
  113. data/test/fixtures/correlation_matrix.rb +17 -0
  114. data/test/fixtures/df.csv +15 -0
  115. data/test/fixtures/hartman_23.matrix +9 -0
  116. data/test/fixtures/stock_data.csv +500 -0
  117. data/test/fixtures/tetmat_matrix.txt +5 -0
  118. data/test/fixtures/tetmat_test.txt +1001 -0
  119. data/test/helpers_tests.rb +83 -0
  120. data/test/test_analysis.rb +176 -0
  121. data/test/test_anova_contrast.rb +36 -0
  122. data/test/test_anovaoneway.rb +26 -0
  123. data/test/test_anovatwoway.rb +37 -0
  124. data/test/test_anovatwowaywithdataset.rb +47 -0
  125. data/test/test_anovawithvectors.rb +102 -0
  126. data/test/test_awesome_print_bug.rb +16 -0
  127. data/test/test_bartlettsphericity.rb +25 -0
  128. data/test/test_bivariate.rb +164 -0
  129. data/test/test_codification.rb +78 -0
  130. data/test/test_crosstab.rb +67 -0
  131. data/test/test_dominance_analysis.rb +39 -0
  132. data/test/test_factor.rb +228 -0
  133. data/test/test_factor_map.rb +38 -0
  134. data/test/test_factor_pa.rb +56 -0
  135. data/test/test_fit_model.rb +88 -0
  136. data/test/test_ggobi.rb +35 -0
  137. data/test/test_gsl.rb +15 -0
  138. data/test/test_histogram.rb +109 -0
  139. data/test/test_matrix.rb +48 -0
  140. data/test/test_multiset.rb +176 -0
  141. data/test/test_regression.rb +231 -0
  142. data/test/test_reliability.rb +223 -0
  143. data/test/test_reliability_icc.rb +198 -0
  144. data/test/test_reliability_skillscale.rb +57 -0
  145. data/test/test_resample.rb +24 -0
  146. data/test/test_srs.rb +9 -0
  147. data/test/test_statistics.rb +69 -0
  148. data/test/test_stest.rb +69 -0
  149. data/test/test_stratified.rb +17 -0
  150. data/test/test_test_f.rb +33 -0
  151. data/test/test_test_kolmogorovsmirnov.rb +34 -0
  152. data/test/test_test_t.rb +62 -0
  153. data/test/test_umannwhitney.rb +27 -0
  154. data/test/test_vector.rb +12 -0
  155. data/test/test_wilcoxonsignedrank.rb +64 -0
  156. metadata +570 -0
@@ -0,0 +1,415 @@
1
+ module Statsample
2
+ module Reliability
3
+ # = Intra-class correlation
4
+ # According to Shrout & Fleiss (1979, p.422): "ICC is the correlation
5
+ # between one measurement (either a single rating or a mean of
6
+ # several ratings) on a target and another measurement obtained on that target"
7
+ # == Usage
8
+ # require 'statsample'
9
+ # size = 1000
10
+ # a = Daru::Vector.new(size.times.map {rand(10)})
11
+ # b = a.recode{|i|i+rand(4)-2}
12
+ # c = a.recode{|i|i+rand(4)-2}
13
+ # d = a.recode{|i|i+rand(4)-2}
14
+ # ds = Daru::DataFrame.new({:a => a,:b => b,:c => c,:d => d})
15
+ # # Use :type attribute to set type to summarize
16
+ # icc=Statsample::Reliability::ICC.new(ds, :type=>:icc_1_k)
17
+ # puts icc.summary
18
+ #
19
+ # == Reference
20
+ # * Shrout,P. & Fleiss, J. (1979). Intraclass Correlation: Uses in assessing rater reliability. Psychological Bulletin, 86(2), 420-428
21
+ # * McGraw, K. & Wong, S.P. (1996). Forming Inferences About Some Intraclass Correlation Coefficients. Psychological methods, 1(1), 30-46.
22
+
23
+ class ICC
24
+ include Summarizable
25
+
26
+ # Create a ICC analysis for a given dataset
27
+ # Each vector is a different measurement. Only uses complete data
28
+ # (listwise deletion).
29
+ #
30
+
31
+ attr_reader :df_bt
32
+ attr_reader :df_wt
33
+ attr_reader :df_bj
34
+ attr_reader :df_residual
35
+
36
+ attr_reader :ms_bt
37
+ attr_reader :ms_wt
38
+ attr_reader :ms_bj
39
+ attr_reader :ms_residual
40
+
41
+ alias :bms :ms_bt
42
+ alias :wms :ms_wt
43
+ alias :jms :ms_bj
44
+ alias :ems :ms_residual
45
+
46
+ alias :msr :ms_bt
47
+ alias :msw :ms_wt
48
+ alias :msc :ms_bj
49
+ alias :mse :ms_residual
50
+
51
+ # :section: Shrout and Fleiss ICC denominations
52
+ attr_reader :icc_1_1
53
+ attr_reader :icc_2_1
54
+ attr_reader :icc_3_1
55
+ attr_reader :icc_1_k
56
+ attr_reader :icc_2_k
57
+ attr_reader :icc_3_k
58
+
59
+ # :section: McGraw and Wong ICC denominations
60
+
61
+ attr_reader :icc_1
62
+ attr_reader :icc_c_1
63
+ attr_reader :icc_a_1
64
+ attr_reader :icc_k
65
+ attr_reader :icc_c_k
66
+ attr_reader :icc_a_k
67
+
68
+
69
+ attr_reader :n, :k
70
+ attr_reader :total_mean
71
+ # Type of analysis, for easy summarization
72
+ # By default, set to :icc_1
73
+ # * Shrout & Fleiss(1979) denominations
74
+ # * :icc_1_1
75
+ # * :icc_2_1
76
+ # * :icc_3_1
77
+ # * :icc_1_k
78
+ # * :icc_2_k
79
+ # * :icc_3_k
80
+ # * McGraw & Wong (1996) denominations
81
+ # * :icc_1
82
+ # * :icc_k
83
+ # * :icc_c_1
84
+ # * :icc_c_k
85
+ # * :icc_a_1
86
+ # * :icc_a_k
87
+
88
+ attr_reader :type
89
+ # ICC value, set with :type
90
+ attr_reader :r
91
+ attr_reader :f
92
+ attr_reader :lbound
93
+ attr_reader :ubound
94
+
95
+ attr_accessor :g_rho
96
+ attr_accessor :alpha
97
+ attr_accessor :name
98
+ def initialize(ds, opts=Hash.new)
99
+ @ds=ds.reject_values(*Daru::MISSING_VALUES)
100
+ @vectors=@ds.map { |e| e }
101
+ @n=@ds.nrows
102
+ @k=@ds.ncols
103
+ compute
104
+ @g_rho=0
105
+ @alpha=0.05
106
+ @icc_name=nil
107
+ opts_default={:name=>"Intra-class correlation", :type=>:icc_1}
108
+ @opts=opts_default.merge(opts)
109
+ @opts.each{|k,v| self.send("#{k}=",v) if self.respond_to? k }
110
+ end
111
+ def type=(v)
112
+ case v
113
+ when :icc_1_1
114
+ @icc_name=_("Shrout & Fleiss ICC(1,1)")
115
+ @r=@icc_1_1
116
+ @f=icc_1_f
117
+ @lbound, @ubound=icc_1_1_ci(@alpha)
118
+ when :icc_2_1
119
+ @icc_name=_("Shrout & Fleiss ICC(2,1)")
120
+ @r=@icc_2_1
121
+ @f=icc_2_f
122
+ @lbound, @ubound=icc_2_1_ci(@alpha)
123
+
124
+ when :icc_3_1
125
+ @icc_name=_("Shrout & Fleiss ICC(3,1)")
126
+
127
+ @r=@icc_3_1
128
+ @f=icc_3_f
129
+ @lbound, @ubound=icc_3_1_ci(@alpha)
130
+
131
+ when :icc_1_k
132
+ @icc_name=_("Shrout & Fleiss ICC(1,k)")
133
+
134
+ @r=@icc_1_k
135
+ @f=icc_1_k_f
136
+ @lbound, @ubound=icc_1_k_ci(@alpha)
137
+ when :icc_2_k
138
+ @icc_name=_("Shrout & Fleiss ICC(2,k)")
139
+
140
+ @r=@icc_2_k
141
+ @f=icc_2_k_f
142
+ @lbound, @ubound=icc_2_k_ci(@alpha)
143
+
144
+ when :icc_3_k
145
+ @icc_name=_("Shrout & Fleiss ICC(3,k)")
146
+
147
+ @r=@icc_3_k
148
+ @f=icc_3_k_f
149
+ @lbound, @ubound=icc_3_k_ci(@alpha)
150
+
151
+
152
+ when :icc_1
153
+ @icc_name=_("McGraw & Wong ICC(1)")
154
+
155
+ @r=@icc_1_1
156
+ @f=icc_1_f(@g_rho)
157
+ @lbound, @ubound=icc_1_1_ci(@alpha)
158
+ when :icc_k
159
+ @icc_name=_("McGraw & Wong ICC(K)")
160
+
161
+ @r=@icc_1_k
162
+ @f=icc_1_k_f(@g_rho)
163
+ @lbound, @ubound=icc_1_k_ci(@alpha)
164
+ when :icc_c_1
165
+ @icc_name=_("McGraw & Wong ICC(C,1)")
166
+
167
+ @r=@icc_3_1
168
+ @f=icc_c_1_f(@g_rho)
169
+ @lbound, @ubound=icc_3_1_ci(@alpha)
170
+
171
+ when :icc_c_k
172
+ @icc_name=_("McGraw & Wong ICC(C,K)")
173
+
174
+ @r=@icc_3_k
175
+ @f=icc_c_k_f(@g_rho)
176
+ @lbound, @ubound=icc_c_k_ci(@alpha)
177
+
178
+ when :icc_a_1
179
+ @icc_name=_("McGraw & Wong ICC(A,1)")
180
+
181
+ @r=@icc_2_1
182
+ @f=icc_a_1_f(@g_rho)
183
+ @lbound,@ubound = icc_2_1_ci(@alpha)
184
+
185
+ when :icc_a_k
186
+ @icc_name=_("McGraw & Wong ICC(A,K)")
187
+
188
+ @r=@icc_2_k
189
+ @f=icc_a_k_f(@g_rho)
190
+ @lbound,@ubound=icc_2_k_ci(@alpha)
191
+
192
+ else
193
+ raise "Type #{v} doesn't exists"
194
+ end
195
+ end
196
+ def compute
197
+ @df_bt=n-1
198
+ @df_wt=n*(k-1)
199
+ @df_bj=k-1
200
+ @df_residual=(n-1)*(k-1)
201
+ @total_mean=@vectors.inject(0){|ac,v| ac+v.sum}.quo(n*k)
202
+ vm=@ds.vector_mean
203
+
204
+ @ss_bt=k*vm.ss(@total_mean)
205
+ @ms_bt=@ss_bt.quo(@df_bt)
206
+
207
+ @ss_bj=n*@vectors.inject(0){|ac,v| ac+(v.mean-@total_mean).square}
208
+ @ms_bj=@ss_bj.quo(@df_bj)
209
+
210
+ @ss_wt=@vectors.inject(0){|ac,v| ac+(v-vm).ss(0)}
211
+ @ms_wt=@ss_wt.quo(@df_wt)
212
+
213
+ @ss_residual=@ss_wt-@ss_bj
214
+ @ms_residual=@ss_residual.quo(@df_residual)
215
+ ###
216
+ # Shrout and Fleiss denomination
217
+ ###
218
+ # ICC(1,1) / ICC(1)
219
+ @icc_1_1=(bms-wms).quo(bms+(k-1)*wms)
220
+ # ICC(2,1) / ICC(A,1)
221
+ @icc_2_1=(bms-ems).quo(bms+(k-1)*ems+k*(jms - ems).quo(n))
222
+ # ICC(3,1) / ICC(C,1)
223
+ @icc_3_1=(bms-ems).quo(bms+(k-1)*ems)
224
+
225
+
226
+
227
+ # ICC(1,K) / ICC(K)
228
+ @icc_1_k=(bms-wms).quo(bms)
229
+ # ICC(2,K) / ICC(A,k)
230
+ @icc_2_k=(bms-ems).quo(bms+(jms-ems).quo(n))
231
+ # ICC(3,K) / ICC(C,k) = Cronbach's alpha
232
+ @icc_3_k=(bms-ems).quo(bms)
233
+
234
+ ###
235
+ # McGraw and Wong
236
+ ###
237
+
238
+ end
239
+
240
+ def icc_1_f(rho=0.0)
241
+ num=msr*(1-rho)
242
+ den=msw*(1+(k-1)*rho)
243
+ Statsample::Test::F.new(num, den, @df_bt, @df_wt)
244
+ end
245
+ # One way random F, type k
246
+ def icc_1_k_f(rho=0)
247
+ num=msr*(1-rho)
248
+ den=msw
249
+ Statsample::Test::F.new(num, den, @df_bt, @df_wt)
250
+ end
251
+
252
+ def icc_c_1_f(rho=0)
253
+ num=msr*(1-rho)
254
+ den=mse*(1+(k-1)*rho)
255
+ Statsample::Test::F.new(num, den, @df_bt, @df_residual)
256
+ end
257
+ def icc_c_k_f(rho=0)
258
+ num=(1-rho)
259
+ den=1-@icc_3_k
260
+ Statsample::Test::F.new(num, den, @df_bt, @df_residual)
261
+ end
262
+
263
+ def v(a,b)
264
+ ((a*msc+b*mse)**2).quo(((a*msc)**2.quo(k-1))+((b*mse)**2.quo( (n-1) * (k-1))))
265
+ end
266
+ def a(rho)
267
+ (k*rho).quo(n*(1-rho))
268
+ end
269
+ def b(rho)
270
+ 1+((k*rho*(n-1)).quo(n*(1-rho)))
271
+ end
272
+ def c(rho)
273
+ rho.quo(n*(1-rho))
274
+ end
275
+ def d(rho)
276
+ 1+((rho*(n-1)).quo(n*(1-rho)))
277
+ end
278
+ private :v, :a, :b, :c, :d
279
+ def icc_a_1_f(rho=0)
280
+ fj=jms.quo(ems)
281
+ num=msr
282
+ den=a(rho)*msc+b(rho)*mse
283
+ pp = @icc_2_1
284
+ vn=(k-1)*(n-1)*((k*pp*fj+n*(1+(k-1)*pp)-k*pp)**2)
285
+ vd=(n-1)*(k**2)*(pp**2)*(fj**2)+((n*(1+(k-1)*pp)-k*pp)**2)
286
+ v=vn.quo(vd)
287
+ Statsample::Test::F.new(num, den, @df_bt, v)
288
+ end
289
+
290
+ def icc_a_k_f(rho=0)
291
+ num=msr
292
+ den=c(rho)*msc+d(rho)*mse
293
+
294
+ fj=jms.quo(ems)
295
+
296
+ pp = @icc_2_k
297
+ vn=(k-1)*(n-1)*((k*pp*fj+n*(1+(k-1)*pp)-k*pp)**2)
298
+ vd=(n-1)*(k**2)*(pp**2)*(fj**2)+((n*(1+(k-1)*pp)-k*pp)**2)
299
+ v=vn.quo(vd)
300
+
301
+
302
+ Statsample::Test::F.new(num, den, @df_bt,v)
303
+
304
+ end
305
+
306
+ # F test for ICC Case 1. Shrout and Fleiss
307
+ def icc_1_f_shrout
308
+ Statsample::Test::F.new(bms, wms, @df_bt, @df_wt)
309
+ end
310
+
311
+ # Intervale of confidence for ICC (1,1)
312
+ def icc_1_1_ci(alpha=0.05)
313
+ per=1-(0.5*alpha)
314
+
315
+ fu=icc_1_f.f*Distribution::F.p_value(per, @df_wt, @df_bt)
316
+ fl=icc_1_f.f.quo(Distribution::F.p_value(per, @df_bt, @df_wt))
317
+
318
+ [(fl-1).quo(fl+k-1), (fu-1).quo(fu+k-1)]
319
+ end
320
+
321
+ # Intervale of confidence for ICC (1,k)
322
+ def icc_1_k_ci(alpha=0.05)
323
+ per=1-(0.5*alpha)
324
+ fu=icc_1_f.f*Distribution::F.p_value(per, @df_wt, @df_bt)
325
+ fl=icc_1_f.f.quo(Distribution::F.p_value(per, @df_bt, @df_wt))
326
+ [1-1.quo(fl), 1-1.quo(fu)]
327
+ end
328
+
329
+ # F test for ICC Case 2
330
+ def icc_2_f
331
+ Statsample::Test::F.new(bms, ems, @df_bt, @df_residual)
332
+ end
333
+
334
+
335
+ #
336
+ # F* for ICC(2,1) and ICC(2,k)
337
+ #
338
+ def icc_2_1_fs(pp,alpha=0.05)
339
+ fj=jms.quo(ems)
340
+ per=1-(0.5*alpha)
341
+ vn=(k-1)*(n-1)*((k*pp*fj+n*(1+(k-1)*pp)-k*pp)**2)
342
+ vd=(n-1)*(k**2)*(pp**2)*(fj**2)+((n*(1+(k-1)*pp)-k*pp)**2)
343
+ v=vn.quo(vd)
344
+ f1=Distribution::F.p_value(per, n-1,v)
345
+ f2=Distribution::F.p_value(per, v, n-1)
346
+ [f1,f2]
347
+ end
348
+
349
+
350
+ def icc_2_1_ci(alpha=0.05)
351
+ icc_2_1_ci_mcgraw
352
+ end
353
+
354
+ # Confidence interval ICC(A,1), McGawn
355
+
356
+ def icc_2_1_ci_mcgraw(alpha=0.05)
357
+ fd,fu=icc_2_1_fs(icc_2_1,alpha)
358
+ cl=(n*(msr-fd*mse)).quo(fd*(k*msc+(k*n-k-n)*mse)+n*msr)
359
+ cu=(n*(fu*msr-mse)).quo(k*msc+(k*n-k-n)*mse+n*fu*msr)
360
+ [cl,cu]
361
+ end
362
+
363
+ def icc_2_k_ci(alpha=0.05)
364
+ icc_2_k_ci_mcgraw(alpha)
365
+ end
366
+
367
+ def icc_2_k_ci_mcgraw(alpha=0.05)
368
+ f1,f2=icc_2_1_fs(icc_2_k,alpha)
369
+ [
370
+ (n*(msr-f1*mse)).quo(f1*(msc-mse)+n*msr),
371
+ (n*(f2*msr-mse)).quo(msc-mse+n*f2*msr)
372
+ ]
373
+
374
+ end
375
+ def icc_2_k_ci_shrout(alpha=0.05)
376
+ ci=icc_2_1_ci(alpha)
377
+ [(ci[0]*k).quo(1+(k-1)*ci[0]), (ci[1]*k).quo(1+(k-1)*ci[1])]
378
+ end
379
+
380
+
381
+ def icc_3_f
382
+ Statsample::Test::F.new(bms, ems, @df_bt, @df_residual)
383
+ end
384
+
385
+ def icc_3_1_ci(alpha=0.05)
386
+ per=1-(0.5*alpha)
387
+ fl=icc_3_f.f.quo(Distribution::F.p_value(per, @df_bt, @df_residual))
388
+ fu=icc_3_f.f*Distribution::F.p_value(per, @df_residual, @df_bt)
389
+ [(fl-1).quo(fl+k-1), (fu-1).quo(fu+k-1)]
390
+ end
391
+
392
+ def icc_3_k_ci(alpha=0.05)
393
+ per=1-(0.5*alpha)
394
+ fl=icc_3_f.f.quo(Distribution::F.p_value(per, @df_bt, @df_residual))
395
+ fu=icc_3_f.f*Distribution::F.p_value(per, @df_residual, @df_bt)
396
+ [1-1.quo(fl),1-1.quo(fu)]
397
+ end
398
+
399
+ def icc_c_k_ci(alpha=0.05)
400
+ per=1-(0.5*alpha)
401
+ fl=icc_c_k_f.f.quo(Distribution::F.p_value(per, @df_bt, @df_residual))
402
+ fu=icc_c_k_f.f*Distribution::F.p_value(per, @df_residual, @df_bt)
403
+ [1-1.quo(fl),1-1.quo(fu)]
404
+ end
405
+ def report_building(b)
406
+ b.section(:name=>name) do |s|
407
+ s.text @icc_name
408
+ s.text _("ICC: %0.4f") % @r
409
+ s.parse_element(@f)
410
+ s.text _("CI (%0.2f): [%0.4f - %0.4f]") % [(1-@alpha)*100, @lbound, @ubound]
411
+ end
412
+ end
413
+ end
414
+ end
415
+ end
@@ -0,0 +1,181 @@
1
+ module Statsample
2
+ module Reliability
3
+ # DSL for analysis of multiple scales analysis.
4
+ # Retrieves reliability analysis for each scale and
5
+ # provides fast accessors to correlations matrix,
6
+ # PCA and Factor Analysis.
7
+ #
8
+ # == Usage
9
+ # @x1 = Daru::Vector.new([1,1,1,1,2,2,2,2,3,3,3,30])
10
+ # @x2 = Daru::Vector.new([1,1,1,2,2,3,3,3,3,4,4,50])
11
+ # @x3 = Daru::Vector.new([2,2,1,1,1,2,2,2,3,4,5,40])
12
+ # @x4 = Daru::Vector.new([1,2,3,4,4,4,4,3,4,4,5,30])
13
+ # ds = Daru::DataFrame.new({:x1 => @x1,:x2 => @x2,:x3 => @x3,:x4 => @x4})
14
+ # opts={:name=>"Scales", # Name of analysis
15
+ # :summary_correlation_matrix=>true, # Add correlation matrix
16
+ # :summary_pca } # Add PCA between scales
17
+ # msa=Statsample::Reliability::MultiScaleAnalysis.new(opts) do |m|
18
+ # m.scale :s1, ds.clone([:x1, :x2])
19
+ # m.scale :s2, ds.clone([:x3, :x4]), {:name=>"Scale 2"}
20
+ # end
21
+ # # Retrieve summary
22
+ # puts msa.summary
23
+ class MultiScaleAnalysis
24
+ include Statsample::Summarizable
25
+ # Hash with scales
26
+ attr_reader :scales
27
+ # Name of analysis
28
+ attr_accessor :name
29
+ # Add a correlation matrix on summary
30
+ attr_accessor :summary_correlation_matrix
31
+ # Add PCA to summary
32
+ attr_accessor :summary_pca
33
+ # Add Principal Axis to summary
34
+ attr_accessor :summary_principal_axis
35
+ # Options for Factor::PCA object
36
+ attr_accessor :pca_options
37
+ # Options for Factor::PrincipalAxis
38
+ attr_accessor :principal_axis_options
39
+
40
+ # Add Parallel Analysis to summary
41
+ attr_accessor :summary_parallel_analysis
42
+ # Options for Parallel Analysis
43
+ attr_accessor :parallel_analysis_options
44
+
45
+ # Add MPA to summary
46
+ attr_accessor :summary_map
47
+ # Options for MAP
48
+ attr_accessor :map_options
49
+
50
+
51
+ # Generates a new MultiScaleAnalysis
52
+ # Opts could be any accessor of the class
53
+ # * :name,
54
+ # * :summary_correlation_matrix
55
+ # * :summary_pca
56
+ # * :summary_principal_axis
57
+ # * :summary_map
58
+ # * :pca_options
59
+ # * :factor_analysis_options
60
+ # * :map_options
61
+ # If block given, all methods should be called
62
+ # inside object environment.
63
+ #
64
+ def initialize(opts=Hash.new, &block)
65
+ @scales=Hash.new
66
+ @scales_keys=Array.new
67
+ opts_default={ :name=>_("Multiple Scale analysis"),
68
+ :summary_correlation_matrix=>false,
69
+ :summary_pca=>false,
70
+ :summary_principal_axis=>false,
71
+ :summary_parallel_analysis=>false,
72
+ :summary_map=>false,
73
+ :pca_options=>Hash.new,
74
+ :principal_axis_options=>Hash.new,
75
+ :parallel_analysis_options=>Hash.new,
76
+ :map_options=>Hash.new
77
+ }
78
+ @opts=opts_default.merge(opts)
79
+ @opts.each{|k,v|
80
+ self.send("#{k}=",v) if self.respond_to? k
81
+ }
82
+
83
+ if block
84
+ block.arity<1 ? instance_eval(&block) : block.call(self)
85
+ end
86
+ end
87
+ # Add or retrieve a scale to analysis.
88
+ # If second parameters is a dataset, generates a ScaleAnalysis
89
+ # for <tt>ds</tt>, named <tt>code</tt> with options <tt>opts</tt>.
90
+ #
91
+ # If second parameters is empty, returns the ScaleAnalysis
92
+ # <tt>code</tt>.
93
+ def scale(code, ds=nil, opts=nil)
94
+ if ds.nil?
95
+ @scales[code]
96
+ else
97
+ opts={:name=>_("Scale %s") % code} if opts.nil?
98
+ @scales_keys.push(code)
99
+ @scales[code]=ScaleAnalysis.new(ds, opts)
100
+ end
101
+ end
102
+ # Delete ScaleAnalysis named <tt>code</tt>
103
+ def delete_scale(code)
104
+ @scales_keys.delete code
105
+ @scales.delete code
106
+ end
107
+ # Retrieves a Principal Component Analysis (Factor::PCA)
108
+ # using all scales, using <tt>opts</tt> a options.
109
+ def pca(opts=nil)
110
+ opts ||= pca_options
111
+ Statsample::Factor::PCA.new(correlation_matrix, opts)
112
+ end
113
+ # Retrieve Velicer's MAP
114
+ # using all scales.
115
+ def map(opts=nil)
116
+ opts||=map_options
117
+ Statsample::Factor::MAP.new(correlation_matrix, opts)
118
+ end
119
+ # Retrieves a PrincipalAxis Analysis (Factor::PrincipalAxis)
120
+ # using all scales, using <tt>opts</tt> a options.
121
+ def principal_axis_analysis(opts=nil)
122
+ opts||=principal_axis_options
123
+ Statsample::Factor::PrincipalAxis.new(correlation_matrix, opts)
124
+ end
125
+ def dataset_from_scales
126
+ ds = Daru::DataFrame.new({}, order: @scales_keys.map(&:to_sym))
127
+ @scales.each_pair do |code,scale|
128
+ ds[code.to_sym] = scale.ds.vector_sum
129
+ end
130
+
131
+ ds
132
+ end
133
+
134
+ def parallel_analysis(opts=nil)
135
+ opts||=parallel_analysis_options
136
+ Statsample::Factor::ParallelAnalysis.new(dataset_from_scales, opts)
137
+ end
138
+ # Retrieves a Correlation Matrix between scales.
139
+ #
140
+ def correlation_matrix
141
+ Statsample::Bivariate.correlation_matrix(dataset_from_scales)
142
+ end
143
+
144
+ def report_building(b) # :nodoc:
145
+ b.section(:name=>name) do |s|
146
+ s.section(:name=>_("Reliability analysis of scales")) do |s2|
147
+ @scales.each_pair do |k, scale|
148
+ s2.parse_element(scale)
149
+ end
150
+ end
151
+ if summary_correlation_matrix
152
+ s.section(:name=>_("Correlation matrix for %s") % name) do |s2|
153
+ s2.parse_element(correlation_matrix)
154
+ end
155
+ end
156
+ if summary_pca
157
+ s.section(:name=>_("PCA for %s") % name) do |s2|
158
+ s2.parse_element(pca)
159
+ end
160
+ end
161
+ if summary_principal_axis
162
+ s.section(:name=>_("Principal Axis for %s") % name) do |s2|
163
+ s2.parse_element(principal_axis_analysis)
164
+ end
165
+ end
166
+
167
+ if summary_parallel_analysis
168
+ s.section(:name=>_("Parallel Analysis for %s") % name) do |s2|
169
+ s2.parse_element(parallel_analysis)
170
+ end
171
+ end
172
+ if summary_map
173
+ s.section(:name=>_("MAP for %s") % name) do |s2|
174
+ s2.parse_element(map)
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end