To many seasoned SAS programmers, this may look like a simple problem, I am sure, but this one has been boggling my mind. I do not have access to PROC IML so I have keep myself busy with sas/stat. I have created a nested design with PROC PLAN and various datasteps. The dataset is called final. proc plan seed=6457149;
factors dep=5 pen=4 ordered subpen=2 ordered sex=8 random / noprint;
output out=first sex nvals=(1 1 1 1 2 2 2 2) random;
run;
data first(keep=AnimalID dep pen subpen sex);
set first;
AnimalID=_n_;
run;
proc sort data=first;
by dep pen subpen animalID;
run;
data first;
set first;
Block+1;
by dep pen subpen;
if first.subpen then Block=1;
run;
proc rank
groups=20
out=first;
var AnimalID;
ranks PenID2;
run;
data first(drop=PenID2 Pen);
set first;
PenID=PenID2+1;
run;
proc freq data=first nlevels;
table PenID;
run;
proc plan seed=6457149;
factors frequency=1 random comparison=20 random;
output out=randomtreat
comparison CVALS=( '1vs2'
'1vs3'
'1vs4'
'1vs5'
'2vs3'
'2vs4'
'2vs5'
'3vs4'
'3vs5'
'4vs5'
'1vs2'
'1vs3'
'1vs4'
'1vs5'
'2vs3'
'2vs4'
'2vs5'
'3vs4'
'3vs5'
'4vs5');
run;
data randomtreat(drop=frequency);
set randomtreat;
PenID=_N_;
run;
proc sort data=first;
by PenID;
run;
data combined;
merge first randomtreat;
by PenID;
run;
data final (drop=comparison);
set combined;
if subpen=1 then Trt=scan(comparison,1,'vs');
if subpen=2 then Trt=scan(comparison,2,'vs');
run; This dataset shows for each animal their specific characteristics (which treatment, sex, dep, pen, block) . Now, to simulate response variables, I want to create columns, for each level of a random factor (dep1-dep5 block1-block8 pen1-pen20) via an array, and I would look that array to be copied 320 times, for each animal the same array. This way, I can then create response variables by just going to the array. However, how to create 320 copied versions of an array I know, but not how to merge with an existing dataset via a do loop. This is what I have tried so far, but any kind of deviation has failed miserably. %let nBlock=8;
%let nDep=5;
%let nPen=20;
%let PigVariance=0.001;
%let PenVariance=0.0016;
%let BlockVariance=0.001;
%let DepVariance=0.0005;
%let N=320;
data combinedrandom (drop=j k l);
set final;
array b{&nBlock} b1-b&nBlock;
array d{&nDep} d1-d&nDep;
array p{&nPen} p1-p&nPen;
array t[5] _temporary_ (0.670 0.660 0.650 0.640 0.630);
array s[2] _temporary_ (0 -0.10);
do j=1 to &nBlock; /* j=1 to 8 */
b{j} = rand("Normal", 0, sqrt(&BlockVariance)); /* create 8 columns of block */
end;
do k=1 to &nDep;
d{k} = rand("Normal", 0, sqrt(&DepVariance)); /* create 5 columns of department */
end;
do l=1 to &nPen; /* j=1 to 8 */
p{l} = rand("Normal", 0, sqrt(&PenVariance)); /* create 20 columns of pen */
end;
do i=1 to &N; /* if N=320, it builds 320 copies for each row in the dataset final, however, if N=1 it builds 1 'copy' for each row of final --> i want it to copy first row 320 times*/
if i=1 then output;
y=t[trt]+s[sex]+ b[block] + d[dep] + p[penID] + rand("Normal", 0, sqrt(&PigVariance));
end;
run; I hope this all make sense. Thanks in advance
... View more