DEFINE permreg (dv =!charend('/')/iv =!charend ('/')/perm = !charend('/')). set mxloop = 10000000. preserve. set length = none. set seed = random. matrix. get xy/file = */variables = !dv !iv/names = nm/missing omit. compute nm = t(nm). print nm/title = "Variables:"/rlabels = "DV =" "IV = "/format a8. compute n=nrow(xy). compute perm = trunc(!perm). compute res = make(perm,2,0). compute ones = make(n,1,1). loop i = 1 to perm. compute xyc = xy-(ones*(csum(xy)&/n)). compute vcov = (1/(n-1))*(t(xyc)*xyc). compute var = diag(vcov). compute r = mdiag(1/sqrt(var))*vcov*mdiag(1/sqrt(var)). compute b = mdiag(1/var)*vcov. compute res(i,1) = r(2,1). compute res(i,2) = b(2,1). loop cse = 1 to n. compute k = trunc(uniform(1,1)*(n-cse+1))+cse. compute temp =xy(cse,2). compute xy(cse,2) = xy(k,2). compute xy(k,2) = temp. end loop. end loop. compute ser = sqrt((1-(res(1,1)*res(1,1)))/(n-2)). compute seb = sqrt( (var(1,1)*(1-(res(1,1)*res(1,1)))) / ((n-2)*var(2,1))). compute tstat = res(1,1)/ser. compute pval= 2*(1-tcdf(abs(tstat),(n-2))). compute res2 = csum((abs(res(:,1)) >= abs(res(1,1))))/perm. compute res1g = csum((res(:,1) >= res(1,1)))/perm. compute res1L = csum((res(:,1) <= res(1,1)))/perm. compute se = {ser,seb;pval,pval}. compute obt = {res(1,:);se}. print obt/title = "Obtained Results"/rlabels "Obt" "se(Obt)" "sig(two)"/clabels "r" "b"/format f8.4. compute p={res2;res1g;res1L}. print p/title = "Approximate Permutation Test Results"/rlabels "Two-tail" ">= Obt" "=< Obt" /clabels "prob"/format f8.4. print perm/title = "Number of Permutations:". print n/title = "Sample size:". end matrix. restore. !end define.