home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #27 / NN_1992_27.iso / spool / bit / listserv / sasl / 5057 < prev    next >
Encoding:
Text File  |  1992-11-15  |  3.9 KB  |  148 lines

  1. Comments: Gated by NETNEWS@AUVM.AMERICAN.EDU
  2. Path: sparky!uunet!nevada.edu!news.unomaha.edu!sol.ctr.columbia.edu!zaphod.mps.ohio-state.edu!darwin.sura.net!paladin.american.edu!auvm!LEVEN.APPCOMP.UTAS.EDU.AU!BROBINSO
  3. Message-ID: <9211151030.AA00944@leven>
  4. Newsgroups: bit.listserv.sas-l
  5. Date:         Sun, 15 Nov 1992 21:30:34 +1200
  6. Reply-To:     brobinso@LEVEN.APPCOMP.UTAS.EDU.AU
  7. Sender:       "SAS(r) Discussion" <SAS-L@UGA.BITNET>
  8. From:         brobinso@LEVEN.APPCOMP.UTAS.EDU.AU
  9. Subject:      Covariance with data step
  10. Comments: To: sas-l@uga.cc.uga.edu
  11. Lines: 135
  12.  
  13. Content: Question
  14. Platform/Release: SunOS/6.07
  15. Name: Barrie Robinson
  16. Email: B.Robinson@appcomp.utas.edu.au
  17.  
  18. I'm sorry to burden the list with the following, (and I don't even
  19. subscribe to it at the moment -- I simply haven't the time to read/delete
  20. all the mail for the next few weeks). I've RTFMed till I'm blue in the
  21. face, but I can't seem to figure out how to do what I feel ought to be
  22. quite simple.
  23.  
  24. I have a data file with about 20 variables of interest (llength--lspor),
  25. and I wish to compute the covariance matrix, using all available
  26. information, sort of like pairwise deletion of missing values in SPSS. Now
  27. there are probably other ways of doing this, including proc IML, but
  28. *surely* one ought to be able to do it with a data step.
  29.  
  30. The following is an early attempt:
  31.  
  32. libname g 'GrammDir';
  33.  
  34. data sp3;
  35.   set g.Gramm3;
  36.   if species=3;
  37.  
  38. data g.sp3cov (keep=cov1-cov20);
  39.   array vars{*} llength lwidth lpos lpet larc lldens lpdens llthick lnsor
  40.            llsrat lslrat lsleng sang sarc llsep lscalen lscawid
  41.            lsporang annulus lspor;
  42.   array sums{20}(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0);
  43.   array nnm{20}(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0);
  44.   array cov{20};
  45.   array nt{20,20};
  46.   array sscp{20,20};
  47.   do k=1 to last;
  48.     set sp3 point=k nobs=last;
  49.     do j=1 to 20;
  50.       if vars{j}^=. then do;
  51.         nnm{j}+1;
  52.         sums{j}+vars{j};
  53.       end;
  54.     end;
  55.   end;
  56.   do i=1 to 20;
  57.     do j=1 to 20;
  58.       nt{i,j}=0;
  59.       sscp{i,j}=0;
  60.     end;
  61.   end;
  62.   do k=1 to last;
  63.     set sp3 point=k;
  64.     do i=1 to 20;
  65.       do j=1 to 20;
  66.         if vars{i}^=. and vars{j}^=. then do;
  67.           nt{i,j}+1;
  68.           sscp{i,j}+vars{i}*vars{j};
  69.         end;
  70.       end;
  71.     end;
  72.   end;
  73.   do i=1 to 20;
  74.     do j=1 to 20;
  75.       cov{j}=(sscp{i,j}-nt{i,j}*sums{i}/nnm{i}*sums{j}/nnm{j})
  76.               /(nt{i,j}-1);
  77.     end;
  78.     output;
  79.   end;
  80.  
  81. The above seemed to want to produce hundreds of cases (instead of the 20 I
  82. wanted) and includes the original variables, despite the keep=cov1-cov20
  83. clause.
  84.  
  85. The following is a later attempt:
  86.  
  87. libname g 'GrammDir';
  88.  
  89. data sp3;
  90.   set g.Gramm3;
  91.   if species=3;
  92.  
  93. data g.sp3cov (keep=cov1-cov20);
  94.   array vars{*} llength lwidth lpos lpet larc lldens lpdens llthick lnsor
  95.            llsrat lslrat lsleng sang sarc llsep lscalen lscawid
  96.            lsporang annulus lspor;
  97.   array sums{20}(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0);
  98.   array nnm{20}(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0);
  99.   array nt{20,20};
  100.   array sscp{20,20};
  101.   retain _all_;
  102.   array cov{20};
  103.   do i=1 to 20;
  104.     do j=1 to 20;
  105.       nt{i,j}=0;
  106.       sscp{i,j}=0;
  107.     end;
  108.   end;
  109.   do k=1 to last;
  110.     set sp3 point=k nobs=last;
  111.     do i=1 to 20;
  112.       if vars{i}^=. then do;
  113.         nnm{i}+1;
  114.         sums{i}+vars{i};
  115.       end;
  116.       do j=1 to 20;
  117.         if vars{i}^=. and vars{j}^=. then do;
  118.           nt{i,j}+1;
  119.           sscp{i,j}+vars{i}*vars{j};
  120.         end;
  121.       end;
  122.     end;
  123.   end;
  124.   do i=1 to 20;
  125.     do j=1 to 20;
  126.       cov{j}=(sscp{i,j}-nt{i,j}*sums{i}/nnm{i}*sums{j}/nnm{j})
  127.               /(nt{i,j}-1);
  128.     end;
  129.     output;
  130.   end;
  131.  
  132. This one doesn't seem to do much better. Both programs overflow my
  133. available disk space (over 1 Mbyte to spare), and take a long time doing
  134. it.
  135.  
  136. If anyone has any ideas, I'd be grateful.
  137.  
  138. *Please* email to my address above.
  139.  
  140. Regards,
  141.  
  142. Barrie.
  143.  
  144. --
  145. Barrie Robinson,                  |email:
  146. brobinso@leven.appcomp.utas.edu.au
  147. University of Tasmania at Launceston.  |phone:  (61)(03)260211
  148.