Ранжирование вариационного ряда
столкнулся с проблемой ранжирования вариационного ряда, попытался реализовать алгоритм:
Расставляем каждому элементу ряда начальный ранг как его номер по порядку(в отсортированном контейнере)
Если находим встречающиеся несколько раз элементы, суммируем их ранги(которые поставили изначально) и делим на количество повторов. Собственно, вот функция, которая возвращает сумму рангов каждой из выборок, но ранжирование производится почему то неверно, хотя на мой взгляд, логика правильная.
inline std::pair<double, double> getRank(const std::vector<std::pair<double, int> >& a) { std::vector<double> _rank(a.size()); double rankX = 0., rankY = 0.; int _count = 1; for (size_t i = 0; i < a.size(); ++i) { _rank[i] = _count; ++_count; } double qq = 1.; double ranklist = 0.; int it, it_1; std::pair<double, int> is_find; for (size_t i = 0; i < a.size() - 1; ++i) { if (a[i].first == a[i + 1].first) { is_find = { a[i].first, a[i].second }; ++qq; ranklist += _rank[i]; } else { it = -1 * std::distance(std::lower_bound(a.begin(), a.end(), is_find), a.begin()); it_1 = -1 * std::distance(std::upper_bound(a.begin(), a.end(), is_find), a.begin()); for (int i = it; i < it_1 - 1; ++i) { _rank[i] = ranklist / qq; } qq = 1.; ranklist = 0.; } } for (size_t i = 0; i < a.size(); ++i) { if (a[i].second == 1) rankX += _rank[i]; else if (a[i].second == 2) rankY += _rank[i]; } cout << rankX << " " << rankY << endl; return std::make_pair(rankX, rankY); }
Например, такой тест(1 - принадлежность выборке 1, 2 - принадлежность выборке 2):
125 1
126 1
127 1
127 1
128 1
130 1
131 1
131 1
133 1
135 1
137 1
137 1
137 1
137 1
119 2
121 2
123 2
124 2
125 2
129 2
129 2
129 2
129 2
130 2
130 2
131 2
СуммаX = 234.5, СуммаY = 116.5
Мой вывод СуммаX = 236, СуммаY = 106.333
Ответы (1 шт):
Если у вас в ряду 14+12=26 различных чисел, то сумма их рангов должна быть 26*27/2= 351. Сумма рангов первых 14 элементов рангов - 105.
Сумма рангов оставшихся 12 элементов - 246.
Что означают приведенные вами ряды и суммы - неведомо.
P.S. По просьбе ТС прикладываю код подсчета рангов двух выборок с учетом повторений на Python. Изначально ДатаФрейм имеет два столбца - 'A' - значения, 'B' - метка класса.
df1=df.sort_values(['A']).reset_index()
df1['R']=df1.index+1
df1['R']=df1['R'].groupby([df1.A]).transform('mean')
in1=sum(list(df1.R[df1.B==1]))
in2=sum(list(df1.R[df1.B==2]))
Полученные значения сумм рангов
print(in1, in2)
234.5 116.5