Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

Ранжирование выборок   Найти похожие ветки 

 
Mikhail ©   (2006-04-24 15:08) [0]

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


 
Palladin ©   (2006-04-24 15:09) [1]

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


 
Mikhail ©   (2006-04-25 13:54) [2]

Да нет, отсортировать - это 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
Вот именно это и требуется. Просто занимаюсь реализацией статистических критериев Вилкоксона и Пейджа. Столкнулся с проблемкой.


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

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


 
MBo ©   (2006-04-25 14:28) [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:30) [5]

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

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


 
Mikhail ©   (2006-04-25 14:31) [6]

Считать их так. У тебя есть числа 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) [7]

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



Страницы: 1 вся ветка

Текущий архив: 2006.05.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.056 c
15-1145269137
Кулхацкер
2006-04-17 14:18
2006.05.14
Как стать хакером


2-1145751737
parovoZZ
2006-04-23 04:22
2006.05.14
dll и экспортируемые функции


1-1144268190
MBBIII
2006-04-06 00:16
2006.05.14
Создание и отладка Dll


1-1144137303
aleshap
2006-04-04 11:55
2006.05.14
Как определить место в программе?


3-1142690509
__Misha
2006-03-18 17:01
2006.05.14
Как получить коллекцию таблиц и полей базы