Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ранжирование выборок [D7, WinXP]


Mikhail ©   (2006-04-24 15:08:00) 

Доброго времени суток!
Вопрос такой: есть статистическая выборка, состоящая из n чисел. Как проранжировать эти числа от меньшего к большему?


Mikhail   (2006-04-25 14:31:00) [1]

Считать их так. У тебя есть числа 1 3 3 5
1 - 1(всё понятно)
3 - есть 2 раза, вроде ранги должны быть 2 и 3, но число то одно и то же, поэтому берем посередине, то есть 2,5. Если б было 3 тройки, то ранги должны были бы быть 2,3,4, но опять же берём посередине и получаем 3, причем все три ранга (2,3,4) уже заняты, т.е.
5 - 4


MBo   (2006-04-25 14:31:00) [2]

Пардон, строчка в конце
if Last <> Cur - 1 then
не нужна


balepa   (2006-04-25 14:30:00) [3]

Потом берешь следующее число из массива после последнего повтора предыдущего числа. Так что нужно запоминать индексы элементов для повторов текущего числа и индекс последнего повтора текущего числа.

Что-то типа этого.


MBo   (2006-04-25 14:28:00) [4]

Да вроде нет особых трудностей:


procedure RangeSortedArray(const A: array of Integer; var Rng: array of Single);
var
 Cur, Last: Integer;

 procedure FillRange;
 var
   j: Integer;
   r: Single;
 begin
   r := (Cur + Last + 1) / 2;
   for j := Last to Cur - 1 do
     Rng[j] := r;
 end;

begin
 Last := 0;
 for Cur := 1 to High(A) do begin
   if A[Cur] <> A[Cur - 1] then begin
     FillRange;
     Last := Cur;
   end;
 end;
 Cur := High(A) + 1;
 if Last <> Cur - 1 then
   FillRange;
end;

procedure TForm11.Button3Click(Sender: TObject);
var
 i, N: integer;
 Rng: array of Single;
 A: array of Integer;
begin
 N := 10;
 Memo1.Clear;
 SetLength(Rng, N);
 SetLength(A, N);
 Randomize;
 A[0] := Random(3);
 for i := 1 to High(A) do
   A[i] := A[i - 1] + Random(2);
 RangeSortedArray(A, Rng);
 for i := 0 to High(Rng) do
   Memo1.Lines.Add(Format('%d   %f', [A[i], Rng[i]]));
end;


balepa   (2006-04-25 14:25:00) [5]

Сначала отсортируй, а дальше подумай вроде легко.
Одно из первых что пришло на ум. Можно взять 1 число из отсортированного массива поискать есть ли оно далее. Потом ставь ранги(не понял как их считать так что извиняйте) и т.д.


Mikhail   (2006-04-25 13:54:00) [6]

Да нет, отсортировать - это 1 строчка кода. Нужно именно проранжировать. есть например числа 3, 5, 6, 7, 6, 12, 20, 10. Нужно каждому из них присвоить определённый ранг, чтобы получилось:
3 - 1
5 - 2
6 - 3,5 (так как есть ещё одна 6, если б их было 3, то ранг у каждой был бы 4)
6 - 3,5
7 - 5 (так как 4 уже занята как и 3)
10 - 6
12 - 7
20 - 8
Вот именно это и требуется. Просто занимаюсь реализацией статистических критериев Вилкоксона и Пейджа. Столкнулся с проблемкой.


Palladin   (2006-04-24 15:09:00) [7]

Отсортировать чтоли?


Наверх

Титульная страница Поиск, карта сайта Написать письмо