Class: Statsample::Reliability::ICC

Inherits:
Object
  • Object
show all
Includes:
Summarizable
Defined in:
lib/statsample/reliability/icc.rb

Overview

Intra-class correlation

According to Shrout & Fleiss (1979, p.422): “ICC is the correlation between one measurement (either a single rating or a mean of several ratings) on a target and another measurement obtained on that target”

Usage

require 'statsample'
size = 1000
a = Daru::Vector.new(size.times.map {rand(10)})
b = a.recode{|i|i+rand(4)-2}
c = a.recode{|i|i+rand(4)-2}
d = a.recode{|i|i+rand(4)-2}
ds = Daru::DataFrame.new({:a => a,:b => b,:c => c,:d => d})
# Use :type attribute to set type to summarize
icc=Statsample::Reliability::ICC.new(ds, :type=>:icc_1_k)
puts icc.summary

Reference

  • Shrout,P. & Fleiss, J. (1979). Intraclass Correlation: Uses in assessing rater reliability. Psychological Bulletin, 86(2), 420-428

  • McGraw, K. & Wong, S.P. (1996). Forming Inferences About Some Intraclass Correlation Coefficients. Psychological methods, 1(1), 30-46.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Summarizable

#summary

Constructor Details

#initialize(ds, opts = Hash.new) ⇒ ICC

Returns a new instance of ICC.



98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/statsample/reliability/icc.rb', line 98

def initialize(ds, opts=Hash.new)
  ds.update
  @ds=ds.dup_only_valid
  @vectors=@ds.map { |e| e }
  @n=@ds.nrows
  @k=@ds.ncols
  compute
  @g_rho=0
  @alpha=0.05
  @icc_name=nil
  opts_default={:name=>"Intra-class correlation", :type=>:icc_1}
  @opts=opts_default.merge(opts)
  @opts.each{|k,v| self.send("#{k}=",v) if self.respond_to? k }
end

Instance Attribute Details

#alphaObject

Returns the value of attribute alpha.



96
97
98
# File 'lib/statsample/reliability/icc.rb', line 96

def alpha
  @alpha
end

#df_bjObject (readonly)

Returns the value of attribute df_bj.



33
34
35
# File 'lib/statsample/reliability/icc.rb', line 33

def df_bj
  @df_bj
end

#df_btObject (readonly)

Create a ICC analysis for a given dataset Each vector is a different measurement. Only uses complete data (listwise deletion).



31
32
33
# File 'lib/statsample/reliability/icc.rb', line 31

def df_bt
  @df_bt
end

#df_residualObject (readonly)

Returns the value of attribute df_residual.



34
35
36
# File 'lib/statsample/reliability/icc.rb', line 34

def df_residual
  @df_residual
end

#df_wtObject (readonly)

Returns the value of attribute df_wt.



32
33
34
# File 'lib/statsample/reliability/icc.rb', line 32

def df_wt
  @df_wt
end

#fObject (readonly)

Returns the value of attribute f.



91
92
93
# File 'lib/statsample/reliability/icc.rb', line 91

def f
  @f
end

#g_rhoObject

Returns the value of attribute g_rho.



95
96
97
# File 'lib/statsample/reliability/icc.rb', line 95

def g_rho
  @g_rho
end

#icc_1Object (readonly)

:section: McGraw and Wong ICC denominations



61
62
63
# File 'lib/statsample/reliability/icc.rb', line 61

def icc_1
  @icc_1
end

#icc_1_1Object (readonly)

:section: Shrout and Fleiss ICC denominations



52
53
54
# File 'lib/statsample/reliability/icc.rb', line 52

def icc_1_1
  @icc_1_1
end

#icc_1_kObject (readonly)

Returns the value of attribute icc_1_k.



55
56
57
# File 'lib/statsample/reliability/icc.rb', line 55

def icc_1_k
  @icc_1_k
end

#icc_2_1Object (readonly)

Returns the value of attribute icc_2_1.



53
54
55
# File 'lib/statsample/reliability/icc.rb', line 53

def icc_2_1
  @icc_2_1
end

#icc_2_kObject (readonly)

Returns the value of attribute icc_2_k.



56
57
58
# File 'lib/statsample/reliability/icc.rb', line 56

def icc_2_k
  @icc_2_k
end

#icc_3_1Object (readonly)

Returns the value of attribute icc_3_1.



54
55
56
# File 'lib/statsample/reliability/icc.rb', line 54

def icc_3_1
  @icc_3_1
end

#icc_3_kObject (readonly)

Returns the value of attribute icc_3_k.



57
58
59
# File 'lib/statsample/reliability/icc.rb', line 57

def icc_3_k
  @icc_3_k
end

#icc_a_1Object (readonly)

Returns the value of attribute icc_a_1.



63
64
65
# File 'lib/statsample/reliability/icc.rb', line 63

def icc_a_1
  @icc_a_1
end

#icc_a_kObject (readonly)

Returns the value of attribute icc_a_k.



66
67
68
# File 'lib/statsample/reliability/icc.rb', line 66

def icc_a_k
  @icc_a_k
end

#icc_c_1Object (readonly)

Returns the value of attribute icc_c_1.



62
63
64
# File 'lib/statsample/reliability/icc.rb', line 62

def icc_c_1
  @icc_c_1
end

#icc_c_kObject (readonly)

Returns the value of attribute icc_c_k.



65
66
67
# File 'lib/statsample/reliability/icc.rb', line 65

def icc_c_k
  @icc_c_k
end

#icc_kObject (readonly)

Returns the value of attribute icc_k.



64
65
66
# File 'lib/statsample/reliability/icc.rb', line 64

def icc_k
  @icc_k
end

#kObject (readonly)

Returns the value of attribute k.



69
70
71
# File 'lib/statsample/reliability/icc.rb', line 69

def k
  @k
end

#lboundObject (readonly)

Returns the value of attribute lbound.



92
93
94
# File 'lib/statsample/reliability/icc.rb', line 92

def lbound
  @lbound
end

#ms_bjObject (readonly) Also known as: jms, msc

Returns the value of attribute ms_bj.



38
39
40
# File 'lib/statsample/reliability/icc.rb', line 38

def ms_bj
  @ms_bj
end

#ms_btObject (readonly) Also known as: bms, msr

Returns the value of attribute ms_bt.



36
37
38
# File 'lib/statsample/reliability/icc.rb', line 36

def ms_bt
  @ms_bt
end

#ms_residualObject (readonly) Also known as: ems, mse

Returns the value of attribute ms_residual.



39
40
41
# File 'lib/statsample/reliability/icc.rb', line 39

def ms_residual
  @ms_residual
end

#ms_wtObject (readonly) Also known as: wms, msw

Returns the value of attribute ms_wt.



37
38
39
# File 'lib/statsample/reliability/icc.rb', line 37

def ms_wt
  @ms_wt
end

#nObject (readonly)

Returns the value of attribute n.



69
70
71
# File 'lib/statsample/reliability/icc.rb', line 69

def n
  @n
end

#nameObject

Returns the value of attribute name.



97
98
99
# File 'lib/statsample/reliability/icc.rb', line 97

def name
  @name
end

#rObject (readonly)

ICC value, set with :type



90
91
92
# File 'lib/statsample/reliability/icc.rb', line 90

def r
  @r
end

#total_meanObject (readonly)

Returns the value of attribute total_mean.



70
71
72
# File 'lib/statsample/reliability/icc.rb', line 70

def total_mean
  @total_mean
end

#typeObject

Type of analysis, for easy summarization By default, set to :icc_1

  • Shrout & Fleiss(1979) denominations

    • :icc_1_1

    • :icc_2_1

    • :icc_3_1

    • :icc_1_k

    • :icc_2_k

    • :icc_3_k

  • McGraw & Wong (1996) denominations

    • :icc_1

    • :icc_k

    • :icc_c_1

    • :icc_c_k

    • :icc_a_1

    • :icc_a_k



88
89
90
# File 'lib/statsample/reliability/icc.rb', line 88

def type
  @type
end

#uboundObject (readonly)

Returns the value of attribute ubound.



93
94
95
# File 'lib/statsample/reliability/icc.rb', line 93

def ubound
  @ubound
end

Instance Method Details

#computeObject



197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/statsample/reliability/icc.rb', line 197

def compute
  @df_bt=n-1
  @df_wt=n*(k-1)
  @df_bj=k-1
  @df_residual=(n-1)*(k-1)
  @total_mean=@vectors.inject(0){|ac,v| ac+v.sum}.quo(n*k)
  vm=@ds.vector_mean
  
  @ss_bt=k*vm.ss(@total_mean)
  @ms_bt=@ss_bt.quo(@df_bt)
  
  @ss_bj=n*@vectors.inject(0){|ac,v| ac+(v.mean-@total_mean).square}
  @ms_bj=@ss_bj.quo(@df_bj)
  
  @ss_wt=@vectors.inject(0){|ac,v| ac+(v-vm).ss(0)}
  @ms_wt=@ss_wt.quo(@df_wt)
  
  @ss_residual=@ss_wt-@ss_bj
  @ms_residual=@ss_residual.quo(@df_residual)
  ###
  # Shrout and Fleiss denomination
  ###
  # ICC(1,1) / ICC(1)
  @icc_1_1=(bms-wms).quo(bms+(k-1)*wms) 
  # ICC(2,1) / ICC(A,1)
  @icc_2_1=(bms-ems).quo(bms+(k-1)*ems+k*(jms - ems).quo(n))  
  # ICC(3,1) / ICC(C,1)
  @icc_3_1=(bms-ems).quo(bms+(k-1)*ems) 
  
  
  
  # ICC(1,K) / ICC(K)
  @icc_1_k=(bms-wms).quo(bms) 
  # ICC(2,K) / ICC(A,k)
  @icc_2_k=(bms-ems).quo(bms+(jms-ems).quo(n))
  # ICC(3,K) / ICC(C,k) = Cronbach's alpha
  @icc_3_k=(bms-ems).quo(bms) 
  
  ###
  # McGraw and Wong
  ###
  
end

#icc_1_1_ci(alpha = 0.05) ⇒ Object

Intervale of confidence for ICC (1,1)



313
314
315
316
317
318
319
320
# File 'lib/statsample/reliability/icc.rb', line 313

def icc_1_1_ci(alpha=0.05)
  per=1-(0.5*alpha)
 
  fu=icc_1_f.f*Distribution::F.p_value(per, @df_wt, @df_bt)
  fl=icc_1_f.f.quo(Distribution::F.p_value(per, @df_bt, @df_wt))
  
  [(fl-1).quo(fl+k-1), (fu-1).quo(fu+k-1)]
end

#icc_1_f(rho = 0.0) ⇒ Object



241
242
243
244
245
# File 'lib/statsample/reliability/icc.rb', line 241

def icc_1_f(rho=0.0)
  num=msr*(1-rho)
  den=msw*(1+(k-1)*rho)
  Statsample::Test::F.new(num, den, @df_bt, @df_wt)
end

#icc_1_f_shroutObject

F test for ICC Case 1. Shrout and Fleiss



308
309
310
# File 'lib/statsample/reliability/icc.rb', line 308

def icc_1_f_shrout
  Statsample::Test::F.new(bms, wms, @df_bt, @df_wt)
end

#icc_1_k_ci(alpha = 0.05) ⇒ Object

Intervale of confidence for ICC (1,k)



323
324
325
326
327
328
# File 'lib/statsample/reliability/icc.rb', line 323

def icc_1_k_ci(alpha=0.05)
  per=1-(0.5*alpha)
  fu=icc_1_f.f*Distribution::F.p_value(per, @df_wt, @df_bt)
  fl=icc_1_f.f.quo(Distribution::F.p_value(per, @df_bt, @df_wt))
  [1-1.quo(fl), 1-1.quo(fu)]
end

#icc_1_k_f(rho = 0) ⇒ Object

One way random F, type k



247
248
249
250
251
# File 'lib/statsample/reliability/icc.rb', line 247

def icc_1_k_f(rho=0)
  num=msr*(1-rho)
  den=msw
  Statsample::Test::F.new(num, den, @df_bt, @df_wt)
end

#icc_2_1_ci(alpha = 0.05) ⇒ Object



351
352
353
# File 'lib/statsample/reliability/icc.rb', line 351

def icc_2_1_ci(alpha=0.05)
  icc_2_1_ci_mcgraw
end

#icc_2_1_ci_mcgraw(alpha = 0.05) ⇒ Object

Confidence interval ICC(A,1), McGawn



357
358
359
360
361
362
# File 'lib/statsample/reliability/icc.rb', line 357

def icc_2_1_ci_mcgraw(alpha=0.05)
  fd,fu=icc_2_1_fs(icc_2_1,alpha)
  cl=(n*(msr-fd*mse)).quo(fd*(k*msc+(k*n-k-n)*mse)+n*msr)
  cu=(n*(fu*msr-mse)).quo(k*msc+(k*n-k-n)*mse+n*fu*msr)
  [cl,cu]
end

#icc_2_1_fs(pp, alpha = 0.05) ⇒ Object

F* for ICC(2,1) and ICC(2,k)



339
340
341
342
343
344
345
346
347
348
# File 'lib/statsample/reliability/icc.rb', line 339

def icc_2_1_fs(pp,alpha=0.05)
  fj=jms.quo(ems)
  per=1-(0.5*alpha)
  vn=(k-1)*(n-1)*((k*pp*fj+n*(1+(k-1)*pp)-k*pp)**2)
  vd=(n-1)*(k**2)*(pp**2)*(fj**2)+((n*(1+(k-1)*pp)-k*pp)**2)
  v=vn.quo(vd)
  f1=Distribution::F.p_value(per, n-1,v)
  f2=Distribution::F.p_value(per, v, n-1)
  [f1,f2]
end

#icc_2_fObject

F test for ICC Case 2



331
332
333
# File 'lib/statsample/reliability/icc.rb', line 331

def icc_2_f
  Statsample::Test::F.new(bms, ems, @df_bt, @df_residual)
end

#icc_2_k_ci(alpha = 0.05) ⇒ Object



364
365
366
# File 'lib/statsample/reliability/icc.rb', line 364

def icc_2_k_ci(alpha=0.05)
  icc_2_k_ci_mcgraw(alpha)
end

#icc_2_k_ci_mcgraw(alpha = 0.05) ⇒ Object



368
369
370
371
372
373
374
375
# File 'lib/statsample/reliability/icc.rb', line 368

def icc_2_k_ci_mcgraw(alpha=0.05)
  f1,f2=icc_2_1_fs(icc_2_k,alpha)
  [
  (n*(msr-f1*mse)).quo(f1*(msc-mse)+n*msr),
  (n*(f2*msr-mse)).quo(msc-mse+n*f2*msr)
  ]
  
end

#icc_2_k_ci_shrout(alpha = 0.05) ⇒ Object



376
377
378
379
# File 'lib/statsample/reliability/icc.rb', line 376

def icc_2_k_ci_shrout(alpha=0.05)
  ci=icc_2_1_ci(alpha)
  [(ci[0]*k).quo(1+(k-1)*ci[0]), (ci[1]*k).quo(1+(k-1)*ci[1])]
end

#icc_3_1_ci(alpha = 0.05) ⇒ Object



386
387
388
389
390
391
# File 'lib/statsample/reliability/icc.rb', line 386

def icc_3_1_ci(alpha=0.05)
  per=1-(0.5*alpha)
  fl=icc_3_f.f.quo(Distribution::F.p_value(per, @df_bt, @df_residual))
  fu=icc_3_f.f*Distribution::F.p_value(per, @df_residual, @df_bt)
  [(fl-1).quo(fl+k-1), (fu-1).quo(fu+k-1)]
end

#icc_3_fObject



382
383
384
# File 'lib/statsample/reliability/icc.rb', line 382

def icc_3_f
  Statsample::Test::F.new(bms, ems, @df_bt, @df_residual)
end

#icc_3_k_ci(alpha = 0.05) ⇒ Object



393
394
395
396
397
398
# File 'lib/statsample/reliability/icc.rb', line 393

def icc_3_k_ci(alpha=0.05)
  per=1-(0.5*alpha)
  fl=icc_3_f.f.quo(Distribution::F.p_value(per, @df_bt, @df_residual))
  fu=icc_3_f.f*Distribution::F.p_value(per, @df_residual, @df_bt)
  [1-1.quo(fl),1-1.quo(fu)]
end

#icc_a_1_f(rho = 0) ⇒ Object



280
281
282
283
284
285
286
287
288
289
# File 'lib/statsample/reliability/icc.rb', line 280

def icc_a_1_f(rho=0)
  fj=jms.quo(ems)
  num=msr
  den=a(rho)*msc+b(rho)*mse
  pp = @icc_2_1
  vn=(k-1)*(n-1)*((k*pp*fj+n*(1+(k-1)*pp)-k*pp)**2)
  vd=(n-1)*(k**2)*(pp**2)*(fj**2)+((n*(1+(k-1)*pp)-k*pp)**2)
  v=vn.quo(vd)
  Statsample::Test::F.new(num, den, @df_bt, v)        
end

#icc_a_k_f(rho = 0) ⇒ Object



291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
# File 'lib/statsample/reliability/icc.rb', line 291

def icc_a_k_f(rho=0)
  num=msr
  den=c(rho)*msc+d(rho)*mse
  
  fj=jms.quo(ems)
  
  pp = @icc_2_k
  vn=(k-1)*(n-1)*((k*pp*fj+n*(1+(k-1)*pp)-k*pp)**2)
  vd=(n-1)*(k**2)*(pp**2)*(fj**2)+((n*(1+(k-1)*pp)-k*pp)**2)
  v=vn.quo(vd)
  
  
  Statsample::Test::F.new(num, den, @df_bt,v)        

end

#icc_c_1_f(rho = 0) ⇒ Object



253
254
255
256
257
# File 'lib/statsample/reliability/icc.rb', line 253

def icc_c_1_f(rho=0)
  num=msr*(1-rho)
  den=mse*(1+(k-1)*rho)
  Statsample::Test::F.new(num, den, @df_bt, @df_residual)
end

#icc_c_k_ci(alpha = 0.05) ⇒ Object



400
401
402
403
404
405
# File 'lib/statsample/reliability/icc.rb', line 400

def icc_c_k_ci(alpha=0.05)
  per=1-(0.5*alpha)
  fl=icc_c_k_f.f.quo(Distribution::F.p_value(per, @df_bt, @df_residual))
  fu=icc_c_k_f.f*Distribution::F.p_value(per, @df_residual, @df_bt)
  [1-1.quo(fl),1-1.quo(fu)]
end

#icc_c_k_f(rho = 0) ⇒ Object



258
259
260
261
262
# File 'lib/statsample/reliability/icc.rb', line 258

def icc_c_k_f(rho=0)
  num=(1-rho)
  den=1-@icc_3_k
  Statsample::Test::F.new(num, den, @df_bt, @df_residual)
end

#report_building(b) ⇒ Object



406
407
408
409
410
411
412
413
# File 'lib/statsample/reliability/icc.rb', line 406

def report_building(b)
   b.section(:name=>name) do |s|
     s.text @icc_name
     s.text _("ICC: %0.4f") % @r
     s.parse_element(@f)
     s.text _("CI (%0.2f): [%0.4f - %0.4f]") % [(1-@alpha)*100, @lbound, @ubound]
   end
end