Есть несколько способов сделать это в SAS.Я бы использовал proc surveyselect
для генерации образцов начальной загрузки, а затем вычислял индекс Шеннона для каждой копии.(Я не знал, что такое индекс Шеннона, поэтому мой код основан на том, что я прочитал в Википедии.)
data animals;
input v1-v5;
cards;
1 5 12 19 13
6 3 1 3 14
2 7 12 19 21
22 24 21 29 18
17 15 22 9 18
run;
/* Generate 5000 bootstrap samples, with replacement */
proc surveyselect data=animals method=urs n=5 reps=5000 seed=10024 out=boots;
run;
/* For each replicate, calculate the sum of each variable */
proc means data=boots noprint nway;
class replicate;
var v:;
output out=sums sum=;
run;
/* Calculate the proportions, and p*log(p), which will be used next */
data sums;
set sums;
ttl=sum(of v1-v5);
array ps{*} p1-p5;
array vs{*} v1-v5;
array hs{*} h1-h5;
do i=1 to dim(vs);
ps{i}=vs{i}/ttl;
hs{i}=ps{i}*log(ps{i});
end;
keep replicate h:;
run;
/* Calculate the Shannon Index, again for each replicate */
data shannon;
set sums;
shannon = -sum(of h:);
keep replicate shannon;
run;
Теперь у нас есть набор данных shannon
, который содержит ШеннонаИндекс рассчитывается для каждого из 5000 образцов начальной загрузки.Вы можете использовать это для вычисления p -значений, но если вы просто хотите критические значения, вы можете запустить proc means
(или univariate
, если вы хотите 5% -ное значение, так как я не думаю, что этоможно получить 97,5 квантилей с proc means
).
proc means data=shannon mean p1 p5 p95 p99;
var shannon;
run;