statsample-ekatena 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
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