Тест Шапиро-Вилка - PullRequest
       2

Тест Шапиро-Вилка

2 голосов
/ 18 октября 2019

В PL / SQL я хочу вычислить значение Shapiro-Wilk для моих выбранных данных.

По-видимому, функция DBMS_STAT_FUNCS.normal_dist_fit может это сделать, но в качестве параметра используется имя таблицы, а не результат выбора.

Значения, с которыми я работаю:номера, выбранные после многих внутренних соединений. Вот образец моих значений для типичного теста (каждое значение - только одно число, я только перегруппировал их здесь для удобства чтения):

-1,1168954372406006 -1,0339429378509521 -1,0194162130355835 -,9636680483818054 -,9536418914794922 -,9111286401748657 -,851311981678009 -,8325300216674805 -,8051750063896179 -,738100528717041 -,7174761295318604 -,6651638746261597 -,663613498210907 -,6444216966629028 -,6267942190170288 -,6180349588394165 -,6027824282646179 -,5999149084091187 -,5908389687538147 -,590206503868103 -,5845686793327332 -,5831132531166077 -,5629676580429077 -,5572993159294128 -,5481508374214172 -,5445670485496521 -,5093156099319458 -,49224603176116943 -,47992199659347534 -,4758097231388092 -,4546264410018921 -,38799363374710083 -,3803306519985199 -,3734436631202698 -,36905646324157715 -,27978914976119995 -,2048187553882599 -,16521787643432617

1 Ответ

0 голосов
/ 21 октября 2019

Вы можете создать представление на основе вашего запроса. («Представление» означает просто именованный запрос, код которого сохранен для будущего использования; представление не содержит никаких данных. Поэтому, даже если вы не хотите создавать таблицы на рабочем сервере, возможно, все в порядке для создания представлений.) Затемвы можете использовать это представление при вызове процедуры проверки соответствия.

Сначала давайте уточним, что DBMS_STAT_FUNCS.normal_dist_fit не является функцией, как может быть предложено FUNCS в имени пакета (и, как выскажем в вашем посте), но процедура . Фактически, все подпрограммы в этом пакете являются процедурами!

Документация для пакета неверна .

https://docs.oracle.com/database/121/ARPLS/d_stat_f.htm#ARPLS68476

В нем говорится, что mean и stddev являются IN параметрами. Они не;это OUT параметров. Не совсем понятно, зачем они нужны в этой процедуре (есть отдельные функции для их вычисления), но, опять же, это не мой выбор, а Oracle.

Вот краткий пример использования normal_dist_fit процедура на физической таблице (из другой схемы: стандартная HR схема). Обратите внимание, что у меня должна быть привилегия select any table или какая-либо другая привилегия, которая позволяет мне выбирать из таблиц в схеме HR. (Я вошел не как HR, а как другой пользователь, MATHGUY.)

declare
  mn number;
  sd number;
  sw number;
begin
  dbms_stat_funcs.normal_dist_fit('HR', 'EMPLOYEES', 'SALARY',
                                  'SHAPIRO_WILKS', mn, sd, sw);
end;
/

W value : .8739562109117848523112862359519603805821

PL/SQL procedure successfully completed.

(Обратите внимание, что аргумент для теста Шапиро-Уилка 'SHAPIRO_WILKS' , с S в конце, возможно, у Oracle была веская причина для этого, хотя я сомневаюсь в этом.)

Теперь, скажем, в моей схеме Iиметь этот запрос, который производит столбец чисел:

select salary * (1 + nvl(commission_pct, 0)) as total_compensation 
from   hr.employees
;

Это вычисляет общую компенсацию, включая комиссию (для тех сотрудников, у которых есть такая; звонок NVL необходим, потому что для сотрудников без комиссии,процент отображается как NULL, а не ноль).

Я создам представление на основе этого запроса ... но мне нужно будет иметь необходимые привилегии, и есть лишь небольшаяосложнение.

До сих пор я предполагал, что могу выбрать из таблицы в схеме HR;действительно, у меня есть привилегия SELECT ANY TABLE. Но в моем случае у меня есть эта привилегия через роль . Это нормально для выбора, но не ОК для создания представления на основе этого SELECT. Чтобы создать представление, я должен иметь SELECT ANY TABLE (или гораздо более слабый грант: чтобы выбрать конкретно из этой таблицы, или, возможно, ограничить его только двумя необходимыми столбцами) , предоставленный мне напрямую ,не через роль. Это то, что вам нужно обсудить с вашим администратором базы данных;эта привилегия у вас уже есть (в противном случае ваш существующий SELECT не будет работать), но если у вас есть эта роль через роль, теперь вам нужно будет предоставить ее непосредственно вам. И, конечно, у вас должна быть привилегия CREATE VIEW.

OK, поэтому предположим, что у вас есть нужные привилегии. Затем вы можете сделать это:

Создать представление

create or replace view my_emp(total_comp) 
as 
    select salary*(1 + nvl(commission_pct, 0)) from hr.employees;

Вызвать процедуру

declare
  mn number;
  sd number;
  sw number;
begin
  dbms_stat_funcs.normal_dist_fit('MATHGUY', 'MY_EMP', 'TOTAL_COMP', 
                                  'SHAPIRO_WILKS', mn, sd, sw);
end;
/

W value : .8852586932906502861798487994791857389177
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...