Ранжирование вариационного ряда

столкнулся с проблемой ранжирования вариационного ряда, попытался реализовать алгоритм:

  • Расставляем каждому элементу ряда начальный ранг как его номер по порядку(в отсортированном контейнере)

  • Если находим встречающиеся несколько раз элементы, суммируем их ранги(которые поставили изначально) и делим на количество повторов. Собственно, вот функция, которая возвращает сумму рангов каждой из выборок, но ранжирование производится почему то неверно, хотя на мой взгляд, логика правильная.

     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 шт):

Автор решения: passant

Если у вас в ряду 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
→ Ссылка