-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathkripAlpha.m
More file actions
147 lines (127 loc) · 3.93 KB
/
Copy pathkripAlpha.m
File metadata and controls
147 lines (127 loc) · 3.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
function [alpha, cfg] = kripAlpha(dat, scale)
% Calculate Krippendorff's alpha using original approach.
% Use as:
% [alpha, cfg] = kripAlpha(X, method)
% Where
% dat: N observers x M observations. For time series M = t. Data
% must be numeric.
% scale: The method for calculating the error (i.e. delta) for
% Krippendorpf's Alpha. Can be NOMINAL, ORDINAL, INTERVAL,
% ANGLE_DEG, ANLGE_RAD or RATIO.
%
% Output:
% alpha: The Alpha value
% cfg: Setting for bootstrap procedure.
% Calculate alpha with hist approach (absolute value)
% Check inputs
if nargin < 2
error('Error: must have argument SCALE')
end
scale = lower(scale);
if ~any(contains({'nominal','ordinal','interval','angle','angle_rad','angle_deg','ratio'}, scale))
error('Unknown scale of measurement');
end
if strcmp(scale, 'angle')
scale = 'angle_deg';
end
% Get variables
fprintf('This dataset has %i observers and %i data points.\n',size(dat, 1) , size(dat, 2) )
allvals = unique(dat(~isnan(dat)));
if isa(allvals, 'logical'); allvals = int8(allvals); end
nu_ = sum(~isnan(dat));
n__ = sum(nu_(nu_>1));
% allvals = unique(dat(~isnan(dat(:,nu_>1)));
if isa(allvals, 'logical'); allvals = int8(allvals); end
dE = hist(reshape(dat(:, nu_>1), 1, []), allvals)'; % Expected count
% f = waitbar(0,'Calculating...');
% nominator
Zu = 0;
for tt = 1:length(nu_)
if ~(nu_(tt) > 1)
continue
end
% Find values
dOu = hist(dat(:,tt),allvals);
vidx = find(dOu);
Znucnuk = 0; % Initiate as zero.
deltas = zeros(length(vidx) -1, 1); % Preallocate
for ii = 1:length(vidx)-1
idx = vidx(ii);
c = allvals(idx);
kvals = allvals(vidx(ii+1:end));
switch scale
case 'nominal'
deltas = delta_nominal(c, kvals);
case 'ordinal'
deltas = delta_ordinal(dE, vidx, ii, kvals);
case 'interval'
deltas = delta_interval(c, kvals);
case 'angle_deg'
deltas = delta_angle_deg(c, kvals);
case 'angle_rad'
deltas = delta_angle_rad(c, kvals);
case 'ratio'
deltas = delta_ratio(c, kvals);
end
nuc = dOu(idx); %sum(dat(:,tt) == c);
nuk = dOu(vidx(ii+1:end))';
Znucnuk = Znucnuk + sum(nuc*nuk.*deltas);
end
Zu = Zu + sum(Znucnuk./(nu_(tt)-1));
end
% denominator
Zncnk = 0;
for ii = 1:length(allvals)-1
c = allvals(ii);
kvals = allvals(ii+1:end);
vidx = 1:length(allvals);
switch scale
case 'nominal'
deltas = delta_nominal(c, kvals);
case 'ordinal'
deltas = delta_ordinal(dE, vidx, ii, kvals);
case 'interval'
deltas = delta_interval(c, kvals);
case 'angle_deg'
deltas = delta_angle_deg(c, kvals);
case 'angle_rad'
deltas = delta_angle_rad(c, kvals);
case 'ratio'
deltas = delta_ratio(c, kvals);
end
n_c = dE(ii);
n_k = dE(ii+1:end);
Zncnk = Zncnk + sum(n_c*n_k.*deltas);
end
alpha = 1 - (Zu/Zncnk) * (n__-1);
% Variables for bootstrapping
cfg.n__ = n__;
cfg.mu = nu_;
cfg.dE = dE;
cfg.allvals = allvals;
cfg.scale = scale;
% Error functions
function deltas = delta_nominal(c, kvals)
deltas = ~(kvals==c);
end
function deltas = delta_ordinal(dE, vidx, ii, kvals)
deltas = nan(length(kvals),1);
kidx = vidx(ii+1:end);
for gg = 1:length(kidx)
deltas(gg) = (sum(dE(vidx(ii):kidx(gg))) - (dE(vidx(ii))+dE(kidx(gg)))/2)^2;
end
end
function deltas = delta_interval(c, kvals)
deltas = (kvals-c).^2;
end
function deltas = delta_angle_deg(c, kvals)
deltas = sin(pi*(c-kvals)/360).^2;
end
function deltas = delta_angle_rad(c, kvals)
deltas = sin(pi*(c-kvals)/(2*pi)).^2;
end
function deltas = delta_ratio(c, kvals)
deltas = ((c-kvals)./(c+kvals)).^2;
end
end
%END