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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.travis.yml +23 -0
- data/CONTRIBUTING.md +17 -0
- data/Gemfile +2 -0
- data/History.txt +457 -0
- data/LICENSE.txt +12 -0
- data/README.md +175 -0
- data/Rakefile +44 -0
- data/benchmarks/correlation_matrix_15_variables.rb +32 -0
- data/benchmarks/correlation_matrix_5_variables.rb +33 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix.ds +0 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix.html +93 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix.rb +71 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix.xls +0 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix_gsl_ruby.ods +0 -0
- data/benchmarks/correlation_matrix_methods/correlation_matrix_with_graphics.ods +0 -0
- data/benchmarks/correlation_matrix_methods/results.ds +0 -0
- data/benchmarks/factor_map.rb +37 -0
- data/benchmarks/helpers_benchmark.rb +5 -0
- data/data/locale/es/LC_MESSAGES/statsample.mo +0 -0
- data/doc_latex/manual/equations.tex +78 -0
- data/examples/boxplot.rb +28 -0
- data/examples/chisquare_test.rb +23 -0
- data/examples/correlation_matrix.rb +32 -0
- data/examples/dataset.rb +30 -0
- data/examples/dominance_analysis.rb +33 -0
- data/examples/dominance_analysis_bootstrap.rb +32 -0
- data/examples/histogram.rb +26 -0
- data/examples/icc.rb +24 -0
- data/examples/levene.rb +29 -0
- data/examples/multiple_regression.rb +20 -0
- data/examples/multivariate_correlation.rb +33 -0
- data/examples/parallel_analysis.rb +40 -0
- data/examples/polychoric.rb +40 -0
- data/examples/principal_axis.rb +26 -0
- data/examples/reliability.rb +31 -0
- data/examples/scatterplot.rb +25 -0
- data/examples/t_test.rb +27 -0
- data/examples/tetrachoric.rb +17 -0
- data/examples/u_test.rb +24 -0
- data/examples/vector.rb +20 -0
- data/examples/velicer_map_test.rb +46 -0
- data/grab_references.rb +29 -0
- data/lib/spss.rb +134 -0
- data/lib/statsample-ekatena/analysis.rb +100 -0
- data/lib/statsample-ekatena/analysis/suite.rb +89 -0
- data/lib/statsample-ekatena/analysis/suitereportbuilder.rb +44 -0
- data/lib/statsample-ekatena/anova.rb +24 -0
- data/lib/statsample-ekatena/anova/contrast.rb +79 -0
- data/lib/statsample-ekatena/anova/oneway.rb +187 -0
- data/lib/statsample-ekatena/anova/twoway.rb +207 -0
- data/lib/statsample-ekatena/bivariate.rb +406 -0
- data/lib/statsample-ekatena/bivariate/pearson.rb +54 -0
- data/lib/statsample-ekatena/codification.rb +182 -0
- data/lib/statsample-ekatena/converter/csv.rb +28 -0
- data/lib/statsample-ekatena/converter/spss.rb +48 -0
- data/lib/statsample-ekatena/converters.rb +211 -0
- data/lib/statsample-ekatena/crosstab.rb +188 -0
- data/lib/statsample-ekatena/daru.rb +115 -0
- data/lib/statsample-ekatena/dataset.rb +10 -0
- data/lib/statsample-ekatena/dominanceanalysis.rb +425 -0
- data/lib/statsample-ekatena/dominanceanalysis/bootstrap.rb +232 -0
- data/lib/statsample-ekatena/factor.rb +104 -0
- data/lib/statsample-ekatena/factor/map.rb +124 -0
- data/lib/statsample-ekatena/factor/parallelanalysis.rb +166 -0
- data/lib/statsample-ekatena/factor/pca.rb +242 -0
- data/lib/statsample-ekatena/factor/principalaxis.rb +243 -0
- data/lib/statsample-ekatena/factor/rotation.rb +198 -0
- data/lib/statsample-ekatena/formula/fit_model.rb +46 -0
- data/lib/statsample-ekatena/formula/formula.rb +306 -0
- data/lib/statsample-ekatena/graph.rb +11 -0
- data/lib/statsample-ekatena/graph/boxplot.rb +236 -0
- data/lib/statsample-ekatena/graph/histogram.rb +198 -0
- data/lib/statsample-ekatena/graph/scatterplot.rb +213 -0
- data/lib/statsample-ekatena/histogram.rb +180 -0
- data/lib/statsample-ekatena/matrix.rb +329 -0
- data/lib/statsample-ekatena/multiset.rb +310 -0
- data/lib/statsample-ekatena/regression.rb +65 -0
- data/lib/statsample-ekatena/regression/multiple.rb +89 -0
- data/lib/statsample-ekatena/regression/multiple/alglibengine.rb +128 -0
- data/lib/statsample-ekatena/regression/multiple/baseengine.rb +251 -0
- data/lib/statsample-ekatena/regression/multiple/gslengine.rb +129 -0
- data/lib/statsample-ekatena/regression/multiple/matrixengine.rb +205 -0
- data/lib/statsample-ekatena/regression/multiple/rubyengine.rb +86 -0
- data/lib/statsample-ekatena/regression/simple.rb +121 -0
- data/lib/statsample-ekatena/reliability.rb +150 -0
- data/lib/statsample-ekatena/reliability/icc.rb +415 -0
- data/lib/statsample-ekatena/reliability/multiscaleanalysis.rb +181 -0
- data/lib/statsample-ekatena/reliability/scaleanalysis.rb +233 -0
- data/lib/statsample-ekatena/reliability/skillscaleanalysis.rb +114 -0
- data/lib/statsample-ekatena/resample.rb +15 -0
- data/lib/statsample-ekatena/shorthand.rb +125 -0
- data/lib/statsample-ekatena/srs.rb +169 -0
- data/lib/statsample-ekatena/test.rb +82 -0
- data/lib/statsample-ekatena/test/bartlettsphericity.rb +45 -0
- data/lib/statsample-ekatena/test/chisquare.rb +73 -0
- data/lib/statsample-ekatena/test/f.rb +52 -0
- data/lib/statsample-ekatena/test/kolmogorovsmirnov.rb +63 -0
- data/lib/statsample-ekatena/test/levene.rb +88 -0
- data/lib/statsample-ekatena/test/t.rb +309 -0
- data/lib/statsample-ekatena/test/umannwhitney.rb +208 -0
- data/lib/statsample-ekatena/test/wilcoxonsignedrank.rb +90 -0
- data/lib/statsample-ekatena/vector.rb +19 -0
- data/lib/statsample-ekatena/version.rb +3 -0
- data/lib/statsample.rb +282 -0
- data/po/es/statsample.mo +0 -0
- data/po/es/statsample.po +959 -0
- data/po/statsample.pot +947 -0
- data/references.txt +24 -0
- data/statsample-ekatena.gemspec +49 -0
- data/test/fixtures/bank2.dat +200 -0
- data/test/fixtures/correlation_matrix.rb +17 -0
- data/test/fixtures/df.csv +15 -0
- data/test/fixtures/hartman_23.matrix +9 -0
- data/test/fixtures/stock_data.csv +500 -0
- data/test/fixtures/tetmat_matrix.txt +5 -0
- data/test/fixtures/tetmat_test.txt +1001 -0
- data/test/helpers_tests.rb +83 -0
- data/test/test_analysis.rb +176 -0
- data/test/test_anova_contrast.rb +36 -0
- data/test/test_anovaoneway.rb +26 -0
- data/test/test_anovatwoway.rb +37 -0
- data/test/test_anovatwowaywithdataset.rb +47 -0
- data/test/test_anovawithvectors.rb +102 -0
- data/test/test_awesome_print_bug.rb +16 -0
- data/test/test_bartlettsphericity.rb +25 -0
- data/test/test_bivariate.rb +164 -0
- data/test/test_codification.rb +78 -0
- data/test/test_crosstab.rb +67 -0
- data/test/test_dominance_analysis.rb +39 -0
- data/test/test_factor.rb +228 -0
- data/test/test_factor_map.rb +38 -0
- data/test/test_factor_pa.rb +56 -0
- data/test/test_fit_model.rb +88 -0
- data/test/test_ggobi.rb +35 -0
- data/test/test_gsl.rb +15 -0
- data/test/test_histogram.rb +109 -0
- data/test/test_matrix.rb +48 -0
- data/test/test_multiset.rb +176 -0
- data/test/test_regression.rb +231 -0
- data/test/test_reliability.rb +223 -0
- data/test/test_reliability_icc.rb +198 -0
- data/test/test_reliability_skillscale.rb +57 -0
- data/test/test_resample.rb +24 -0
- data/test/test_srs.rb +9 -0
- data/test/test_statistics.rb +69 -0
- data/test/test_stest.rb +69 -0
- data/test/test_stratified.rb +17 -0
- data/test/test_test_f.rb +33 -0
- data/test/test_test_kolmogorovsmirnov.rb +34 -0
- data/test/test_test_t.rb +62 -0
- data/test/test_umannwhitney.rb +27 -0
- data/test/test_vector.rb +12 -0
- data/test/test_wilcoxonsignedrank.rb +64 -0
- 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
|