Przejdź do zawartości

Kody źródłowe/Tablica wartości krytycznych dla współczynnika korelacji rang Spearmana

Z Wikibooks, biblioteki wolnych podręczników.
Tablica wartości krytycznych dla współczynnika korelacji rang Spearmana
Tablica wartości krytycznych dla współczynnika korelacji rang Spearmana

Kod źródłowy w języku SAS 4GL, za pomocą którego została wygenerowana tabela wartości krytycznych.

%macro wartosci_krytyczne(n);
	proc sql;
		create table krytyczne_&n. as
			select 
				&n. as n,
				min(case when F>=0.9 then rho else . end) as F_10,
				min(case when F>=0.95 then rho else . end) as F_05,
				min(case when F>=0.975 then rho else . end) as F_025,
				min(case when F>=0.99 then rho else . end) as F_01,
				min(case when F>=0.995 then rho else . end) as F_005
			from dystrybuanta_&n.;
	quit;
%mend;

%macro test_permutacyjny(n);
	data masa_&n.;
		array x{0:&n.} _TEMPORARY_;
		do i=0 to &n.;
			x{i}=i;
		end;

		do while (1);
			if 1
			%do i=1 %to &n.;
				%do j=1 %to &i.-1;
					and x{&i.} ne  x{&j.}
				%end;
			%end; 
				then do;
					Sd=
						%do i=1 %to &n.;
							+(x{&i.}-&i.)*(x{&i.}-&i.)
						%end;
					;
					rho=1-6*Sd/%eval(&n.*&n.*&n.-&n.);
					keep rho;
					output;
				end;

			do i=&n. to 0 by -1;
				x{i}=x{i}+1;
				if x{i}<=&n. 
					then leave;
					else x{i}=1;
			end;
			if x{0}>0 then leave;
		end;
	run;

	proc sort data=masa_&n.;
		by rho;
	run;

	/*Liczona dystrybuanta lewostronna (z warunkiem < a nie <= )!*/
	data dystrybuanta_&n.;
		set masa_&n. nobs=silnia;
		by rho;
		retain F 0 n &n.;
		if first.rho then output;
		F=F+1/silnia;
		keep n F rho;
	run;

	%wartosci_krytyczne(&n.);
%mend;

%macro test_Monte_Carlo(n);
	%let iteracji=10000000;
	data MC_&n.;
		do k=1 to &iteracji.;
			array rand{&n.} _TEMPORARY_;
			array x{&n.} _TEMPORARY_;
			%do i=1 %to &n.;
				rand{&i.}=ranuni(28503458);
				x{&i.}=&i.;
			%end;
			/*Sortowanie*/
			do while(1);
				zmiana=0;
				%do i=2 %to &n.;
					if rand{%eval(&i.-1)}>rand{&i.} then do;
						pom=rand{%eval(&i.-1)};
						rand{%eval(&i.-1)}=rand{&i.};
						rand{&i.}=pom;
						pom=x{%eval(&i.-1)};
						x{%eval(&i.-1)}=x{&i.};
						x{&i.}=pom;
						zmiana=1;
					end;
				%end;
				if not zmiana then leave;
			end;

			Sd=
				%do i=1 %to &n.;
					+(x{&i.}-&i.)*(x{&i.}-&i.)
				%end;
			;
			rho=1-6*Sd/%eval(&n.*&n.*&n.-&n.);
			keep rho;
			output;
		end;
	run;

	proc sql;
		create table masa_&n. as
			select rho, count(*)/&iteracji.	as p
				from MC_&n.
				group by rho;
	quit;

	/*Liczona dystrybuanta lewostronna (z warunkiem < a nie <= )!*/
	data dystrybuanta_&n.;
		set masa_&n.;
		retain F 0 n &n.;
		output;
		F=F+p;
		keep n F rho;
	run;

	%wartosci_krytyczne(&n.);
%mend;

%macro obliczenia(minn,maxn);
	%do n=&minn. %to 10;
		%test_permutacyjny(&n.);
	%end;
	%do n=11 %to &maxn.;
		%test_Monte_Carlo(&n.);
	%end;

	data krytyczne_razem;
		set
			%do n=&minn. %to &maxn.;
				krytyczne_&n.
			%end;
		;
	run;

	data dystrybuanty_razem;
		set
			%do n=&minn. %to &maxn.;
				dystrybuanta_&n.
			%end;
		;
	run;
%mend;
%obliczenia(4,30);

%macro pisz(x);
	if missing(&x.) 
		then put '| &ndash;';
		else do;
			x=floor(&x.*10000)/10000;
			put '|' x;
		end;
%mend;

data _null_;
	set krytyczne_razem;
	put '|-';
	put '!' n;
	%pisz(F_10);
	%pisz(F_05);
	%pisz(F_025);
	%pisz(F_01);
	%pisz(F_005);
run;


Public Domain
Ten tekst nie podlega pod prawa autorskie. Jest zatem własnością publiczną, ponieważ jego autor udostępnił go na licencji public domain.