Еще пару рывков - главное решено. Остаются Трудности в подготовке данных и разнообразные варианты - это потом.
Основная цель Нормализации (нормировки, стандартизации) - устранение природных различий для совместного использования данных (в сопоставимых величинах).
Образно говоря "загнать в бутылку" или Свобода, Равенство, Братство. Равенство перед Законом распределения но не в Объекте!!! (пробе и др.)
В нашем случае хитрая СУММА, обратите внимание - редко где встречается описание, не путать с Sum, смотри в программе
Приведение к нормальному распределению с параметрами (0, 1) путем автоматического преобразованния (в случае необходимости) данных, расчета среднего (SredХj) и стандарта (Sj)
nj
SredХj = Sum Хji / nj ,
i=1
_______________
1 / nj
Sj = —— / Sum (Xji - SredХj)2 ,
n–1 \/ i=1
затем производится нормировка данных Хji по формуле Zji -нормализованные данные похожие друг на друга например Титан (был 500) и Серебро (было 0.001) стали 0!!!:
Хji - SredХj
Zji = ——————.
Sj
Мне не верите посмотрите в БСЭ. Тут сказано плохо и не совсем о том. Нигде слишком четко это не говорится. Нужно быть внимательным.
Просто так в книжках ничего не пишут. Математической литературы под рукой сейчас нет!
В БСЭ «СТАНДАРТИЗОВАННЫЕ КОЭФФИЦИЕНТЫ, статистич. показатели, применяемые для сравнения совокупностей разного состава с целью устранения различий. Так, сравнение показателей смертности лиц двух разных профессий может затрудняться различием их возрастной структуры. Чтобы устранить его влияние на коэффициенты смертности, для обеих групп принимают условно одну и ту же возрастную структуру, после чего исчисляют С. к., характеризующие показатели смертности обеих групп, пригодные для сопоставления. С этой целью по той и другой профессии из повозрастных показателей смертности вычисляются средние с одними и теми же весами для возрастных групп. Возможны и более сложные способы получения С. к. В демографич. статистике С. к. применяются и для сравнения др. показателей (напр., рождаемости, брачности) и не только по профессиям, но и по территориям, периодам времени и т. п. В экономич. статистике с С. к. сходны индексы, в исчислении к-рых принимаются, напр., одинаковые для обоих сравниваемых периодов наборы продуктов.»
Код: Выделить всё
*Программа несколько усложнена с дальним прицелом - нормировки эталонов по
*тому же закону распределения, как и основной файл,
* для простой нормировки можно подставить vibor = 0
*Процедура НОРМА для программы ГЕОКЛАСС. Предназначена для нормировки
*цифровой информации распределенной по нормальному закону. В связи с этим
*в исходных данных могут присутствовать ноли (0) и отрицательные числа.
*Создаются два дополнительных файла - нормированных чисел с заменой последних
*двух букв в названии на ng и параметров нормировки на np в случае нормировки
*основного файла vibor = 0, и один на ng в случае нормировки файла эталонов
* по параметрам нормировки по файлу с np vibor # 0.
*Еще хитрая СУММА где минус идет в плюс, плюс + минус пополам!
*Автор алгоритмов и программы В.Д.Брусницын
PROCEDURE НОРМА
*можно подставить vibor = 0
PARAMETERS vibor
SET TALK OFF
CLEAR
IF ALLTRIM(DBF(1))==""
DEFINE POPUP obj_fil PROMPT FILES LIKE *.DBF;
MESSAGE "ВЫБРАТЬ ФАЙЛ ДЛЯ НОРМИРОВКИ";
TITLE "ВЫБРАТЬ ФАЙЛ ДЛЯ НОРМИРОВКИ"
ON SELECTION POPUP obj_fil DEACTIVATE POPUP obj_fil
ACTIVATE POPUP obj_fil
SELECT 1
USE PROMPT() NOUPDATE
ENDIF
SELECT 1
vorname = DBF(1)
vorname = SUBSTR(vorname,1,LEN(vorname)-6)
imia = "ng"
nach_el = f_fiel()
viv_file = vorname + ALLTRIM(imia) + '.dbf'
IF vibor = 0
imia1 = "np"
viv_fil1 = vorname + ALLTRIM(imia1) + '.dbf'
COPY TO &viv_file AS 1251
COPY STRUCTURE TO &viv_fil1
USE &viv_file
contf = FCOUNT()
konec = FCOUNT()
COUNT TO nom
nom1 = 1/nom/(nom - 1)
DIME srst(2, konec-nach_el + 1)
FOR ii2 = nach_el TO konec
pii = FIELD(ii2)
SUM(&pii) TO sumx
srst(1,ii2-nach_el+1) = sumx/nom
kvsumx = sumx^2
SUM(&pii^2) TO sumxkv
nsumxkv = nom* sumxkv
srst(2,ii2-nach_el+1) = SQRT(nom1*(nsumxkv-kvsumx))
ENDFOR
SELECT 2
USE &viv_fil1
APPEND BLANK
APPEND BLANK
FOR ii3 = nach_el TO konec
pii = FIELD(ii3)
GO BOTTOM
REPL &pii WITH srst(2,ii3-nach_el+1)
SKIP -1
REPL &pii WITH srst(1,ii3-nach_el+1)
ENDFOR
p1 = FIELD(1)
ALTER TABLE &viv_fil1 ALTER COLUMN &p1 C(8)
ALTER TABLE &viv_fil1 RENAME COLUMN &p1 TO "Pokaz"
GO TOP
REPL Pokaz WITH "СРЕДНЕЕ"
SKIP
REPL Pokaz WITH "СТАНДАРТ"
ii4 = 2
DO WHILE ii4<nach_el
pii = UPPER(FIELD(2))
ALTER TABLE &viv_fil1 DROP COLUMN &pii
ii4 = ii4 + 1
ENDDO
BROW TITLE ;
"ВНЕСТИ ИЗМЕНЕНИЯ В СРЕДНЕЕ И СТАНДАРТ (Esc - для продолжения счета)"
ELSE
CLEAR
IF ALLTRIM(DBF(2))==""
DEFINE POPUP obj_fil PROMPT FILES LIKE *.DBF;
MESSAGE "ВЫБРАТЬ ФАЙЛ ПОКАЗАТЕЛЕЙ ДЛЯ НОРМИРОВКИ";
TITLE "ВЫБРАТЬ ФАЙЛ ПОКАЗАТЕЛЕЙ ДЛЯ НОРМИРОВКИ"
ON SELECTION POPUP obj_fil DEACTIVATE POPUP obj_fil
ACTIVATE POPUP obj_fil
SELECT 2
USE PROMPT() NOUPDATE
ENDIF
SELECT 2
COPY STRUCTURE TO &viv_file
SELE 3
USE &viv_file
p1 = FIELD(1)
ALTER TABLE &viv_file ALTER COLUMN &p1 N(3)
p2 = "klasse"
ALTER TABLE &viv_file RENAME COLUMN &p1 TO &p2
APPEND FROM DBF(1)
USE
SELE 1
USE &viv_file
SELE 2
nach_el = 2
konec = FCOUNT()
ENDIF
FOR ii5 = 2 TO FCOUNT()
SELECT 2
pii = FIELD(ii5)
GO BOTTOM
standart = &pii
SKIP -1
srednee = &pii
SELECT 1
REPL ALL &pii WITH (EVAL(pii)-(srednee))/standart
ENDFOR
SELECT 1
FOR ii1 = nach_el TO konec
pii = FIELD(ii1)
pii1 = pii+"_k"
ALTER TABLE &viv_file RENAME COLUMN &pii TO &pii1
ENDFOR
ALTER TABLE &viv_file ADD COLUMN "KA_PLU" N(10,2)
ALTER TABLE &viv_file ADD COLUMN "KA_MIN" N(10,2)
ALTER TABLE &viv_file ADD COLUMN "KA_SUM" N(10,2)
beg = fst_el(UPPER('_K'))
elts = n_el(UPPER('_K'))
last_el = beg + elts - 1
DIMENSION a(elts)
GO TOP
* хитрая СУММА!!!!
DO WHILE ! EOF()
FOR jj=1 TO elts
a(jj)=EVAL(FIELD(beg-1+jj))
ENDFOR
=ASORT(a, 1, elts, 1)
ka = 0
SUM = 0
ii = 1
SUM = a(ii)
ka1 = SUM / SQRT(ii)
DO WHILE ii <=elts
IF ka < ka1
ka = ka1
ii = ii + 1
IF ii = elts+1
EXIT
ENDIF
SUM = SUM + a(ii)
ka1 = SUM / SQRT(ii)
ELSE
ii = elts+1
ENDIF
ENDDO
REPLACE ka_plu WITH ka
ka = 0
SUM = 0
ii = elts
IF a(ii)<0
SUM = a(ii)
ka1 = SUM / SQRT(elts - ii + 1)
ELSE
SUM = 0
ka1 = 0
ENDIF
DO WHILE ii>= beg
IF ka > ka1 AND a(ii)<0
ka = ka1
ii = ii - 1
SUM = SUM + a(ii)
ka1 = SUM / SQRT(elts -ii+1)
IF ii = beg-1 AND ka > ka1
ka = ka1
EXIT
ENDIF
ELSE
ii = beg-1
ENDIF
ENDDO
REPLACE ka_min WITH ka
SKIP
ENDDO
REPLACE ALL ka_sum WITH (ka_plu + ABS(ka_min))/SQRT(2)
CLOSE ALL
*Процедура fst_el для программы ГЕОКЛАСС. Предназначена
*для автоматического определения первого элемента расчета
*по окончаниям "_K", "_R" - BUKVA и др.
*Автор алгоритмов и программы В.Д.Брусницын
PROCEDURE fst_el
PARAMETERS bukva
fst_el = 0
FOR i= 1 TO FCOUNT()
pii = FIELD(i)
IF UPPER(SUBSTR(ALLTRIM(pii), LEN(pii)-1, 2)) = bukva
fst_el = i
EXIT
ENDIF
ENDFOR
RETURN fst_el
*Подпрограмма расчета для программы ГЕОКЛАСС. Предназначена
*для автоматического определения числа полей расчета
*по окончаниям "_K", "_R" - BUKVA и др.
*Автор алгоритмов и программы В.Д.Брусницын
PROCEDURE N_EL
PARAMETERS BUKVA
N_EL = 0
FOR I= 1 TO FCOUNT()
PII = FIELD(I)
IF UPPER(SUBSTR(ALLTRIM(PII), LEN(PII)-1, 2)) = BUKVA
N_EL = N_EL + 1
ENDIF
ENDFOR
RETURN N_EL