SAS中文论坛

标题: 以下的程序怎么编程 [打印本页]

作者: shiyiming    时间: 2009-5-10 15:09
标题: 以下的程序怎么编程
以下的问题如何通过编程获得
一列数据的前k项均值和后n-k项均值的差值
作者: shiyiming    时间: 2009-5-10 17:11
标题: Re: 以下的程序怎么编程
程序比较丑~~~不过能解决问题。。
[code]
proc sql noprint;
select mean(x) into :pre
from youdata(firstobs=1 obs=k)
;
select mean(x) into :post
from youdata(firstobs=k obs=n-k)
;
%put The difference = %sysevalf(&pre-&post);
quit;
作者: shiyiming    时间: 2009-5-12 21:35
标题: Re: 以下的程序怎么编程
*create a dataset;
data tblTrial;
do i=1 to 20;
    x=i;
    if ^mod(x,5) then x=.;
    output;
end;
drop i;
run;
proc print;run;

*get means and differences;
data tblTrial_1;
set tblTrial end=endof;
k=10;*assume k=10;
retain Ntot NnmissK NnmissK_N nSumK nSumK_N 0;
Ntot+1;
if ^missing(x) then do;*excluding missing values;
    if Ntot<=k then do;
       NnmissK+1;
       nSumK=sum(x,nSumK);
    end;
    else do;*after k;
           NnmissK_N+1;
           nSumK_N=sum(x,nSumK_N);
   end;
end;
if endof then do;
    if NnmissK then nMeanK=nSumK/NnmissK;
       else do;
              nSumK=.;
              nMeanK=.;
       end;
    if NnmissK_N then nMeanK_N=nSumK_N/NnmissK_N;
       else do;
              nSumK_N=.;
              nMeanK_N=.;
       end;
      nDiff=nMeanK-nMeanK_N;
      output;
end;
drop x;
run;

proc print;run;
作者: shiyiming    时间: 2009-5-12 22:21
标题: Re: 以下的程序怎么编程
[code:30d0mgl4]data ahuige;
  input A B;
  cards;
2 3
2 3
5 7
7 9
;run;
%let k=2;
%macro cal(VAL); sum((monotonic()<=&k)*&val)/sum(monotonic()<=&k)-sum((monotonic()>&k)*&val)/sum(monotonic()>&k)%mend;

proc sql;
  select distinct  %CAL(A) as AA,%CAL(B) as BB
  from ahuige;
  ;[/code:30d0mgl4]
作者: shiyiming    时间: 2009-5-12 22:46
标题: Re: 以下的程序怎么编程
*very good, but not work for this dataset;
data ahuige;
  input A B;
  cards;
. 1
2 3
5 7
7 9
;run;
%let k=2;
%macro cal(VAL); sum((monotonic()<=&k)*&val)/sum(monotonic()<=&k)-sum((monotonic()>&k)*&val)/sum(monotonic()>&k)%mend;

proc sql;
  select distinct  %CAL(A) as AA,%CAL(B) as BB
  from ahuige;
  ;
作者: shiyiming    时间: 2009-5-12 23:21
标题: Re: 以下的程序怎么编程
[code:1wvui6py]%macro cal(VAL); sum((monotonic()<=&k)*&val)/sum((monotonic()<=&k)*(1-missing(&val)))
                -sum((monotonic()> &k)*&val)/sum((monotonic()> &k)*(1-missing(&val)))%mend;

proc sql;
  select distinct %CAL(A) as AA,%CAL(B) as BB
  from ahuige
  ;[/code:1wvui6py]
作者: shiyiming    时间: 2009-5-13 02:37
标题: Re: 以下的程序怎么编程
呵呵呵,,我怎么就没想到rownum函数~~..
<!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: --> 幸好没用fetchobs,否则丢脸到家~~~
Proc SQL不支持Oracle的group rownum功能~~~
经常郁闷~~
作者: shiyiming    时间: 2009-5-13 03:19
标题: Re: 以下的程序怎么编程
因为自己不是计算机专业的,所以尽量避免用sql,以免滥竽充数。但从以上的程序看来,sql是有独到之处,尤其是0/0居然没有错误提示。而且那个monotonic()居然从手册都查不到。 厉害。
作者: shiyiming    时间: 2009-5-13 16:56
标题: Re: 以下的程序怎么编程
如果你对DATA步那么坚持的话。

[code:3acqjf7j]data ahuige;
  input A B;
cards;
2 3
2 3
5 7
7 9
;
run;

%let k=2;
data ex(keep=ma mb);
   set ahuige nobs=n;
  if &amp;k&#46; ge _N_ then
      do;
          aa1+A;bb1+B;
        end;
      else do;
           aa2+A;bb2+B;
                 end;

  if _N_=n then
        do;
           ma=aa1/&amp;k&#46;- aa2/(n-&amp;k&#46;);
                   mb=bb1/&amp;k&#46;- bb2/(n-&amp;k&#46;);
           output;
                  end;
   run;[/code:3acqjf7j]
作者: shiyiming    时间: 2009-5-13 17:52
标题: Re: 以下的程序怎么编程
感觉还是ahuige的代码简洁明了。那个monotonic函数让我汗颜,居然在sas help里面找不到,请问哪里有类似这种神奇的函数?能共享这方面的资料吗?ahuige?
作者: shiyiming    时间: 2009-5-13 20:45
标题: Re: 以下的程序怎么编程
即使要追求简洁,也要保证以正确为前提。
sXLION的程序有以下欠考虑1。处理缺失值,2。K=0,3。K>=N
没有任何不敬。
作者: shiyiming    时间: 2009-5-14 08:29
标题: Re: 以下的程序怎么编程
经常看SAS-L和SUGI,都是那里边出来的。。
SAS-L上的大师确实太牛~~~
monotonic()跟DB里的rownum一样,但是功能现在还不健全,所以没有列出来。
proc slq还有很多其他的options比较强大。。不过都没有结束测试,还没有上reference..
作者: shiyiming    时间: 2009-5-14 11:48
标题: Re: 以下的程序怎么编程
to deshengsu
你可以把里面的数值做缺失值看看。
另考虑k=0和k&gt;=N,您认为有意义吗?
作者: shiyiming    时间: 2009-5-21 02:18
标题: Re: 以下的程序怎么编程
data result (keep=mean_a_dif mean_b_dif);
     retain mean_a mean_b;
    set ahuige end=last;
    total_a+a;
    if not missing(a) then num_a+1;
    total_b +b;
    if not missing(b) then num_b+1;
    if _N_=&amp;k. then do;
       mean_a=total_A/num_a;
       mean_b=total_b/num_b;
       total_a=0;
       num_a=0;
       total_b=0;
       num_b=0;
    end;
    if last then do;
       mean_a_dif=mean_a-total_a/num_a;
       mean_b_dif=mean_b-total_b/num_b;
       output;
    end;
run;
作者: shiyiming    时间: 2009-5-21 23:31
标题: Re: 以下的程序怎么编程
[quote=&quot;deshengsu&quot;:3que81hy]即使要追求简洁,也要保证以正确为前提。
sXLION的程序有以下欠考虑1。处理缺失值,2。K=0,3。K>=N
没有任何不敬。[/quote:3que81hy]

不好意思,才明白你的意思。

不将缺失值计算在内,mean=总和/项数(不包含缺失项)                  

如果是2的话:

[code:3que81hy]data ahuige;
  input A B;
cards;
&#46; 3
2 3
5 7
7 9
;
run;

%let k=2;
data ex(keep=ma mb);
   set ahuige nobs=n;
  if &amp;k&#46; ge _N_ then
      do;
          aa1+A;bb1+B;
           if missing(A) then missa1+1;
                   if missing(B) then missb1+1;
        end;
      else do;
           aa2+A;bb2+B;
                    if missing(A) then missa2+1;
                    if missing(B) then missb2+1;
            end;

  if _N_=n then
        do;
           ma=aa1/(&amp;k&#46;-missa1)- aa2/(n-&amp;k&#46;-missb1);
           mb=bb1/(&amp;k&#46;-missa2)- bb2/(n-&amp;k&#46;-missb2);
           output;
        end;
   run;[/code:3que81hy]


ps:不好意思,记错了。
作者: shiyiming    时间: 2009-5-21 23:36
标题: Re: 以下的程序怎么编程
1,将缺失项计算在内,mean=总和/项数(包含缺失项) 这种算法是SAS函数mean()默认的。
作者: shiyiming    时间: 2009-5-21 23:43
标题: Re: 以下的程序怎么编程
data trial;
y=mean(1,.,3);
;
proc print;run;
作者: shiyiming    时间: 2009-5-22 01:21
标题: Re: 以下的程序怎么编程
[code:26prqt1b]data ahuige;
  input A B;
cards;
1 2
1 2
&#46; 3
2 3
5 7
7 9
;
run;
%let k=2;
proc sql;
select mean(a), mean(b),&amp;k+1 into &#58;ma1, &#58;mb1, &#58;k1 from ahuige(obs=&amp;k&#46;);
select &amp;ma1&#46;- mean(a),&amp;mb1&#46;- mean(b)  into &#58;ma2,&#58;mb2 from ahuige(firstobs = &amp;k1&#46; );
quit;[/code:26prqt1b]
作者: shiyiming    时间: 2009-5-22 01:22
标题: Re: 以下的程序怎么编程
[code:3uuadprv]data ahuige;
  input A B;
cards;
&#46; 3
2 3
5 7
7 9
;
run;
%let k=2;

proc sql ;
select mean(a), mean(b) into &#58;ma1, &#58;mb1 from ahuige where monotonic() le &amp;k&#46;;
select &amp;ma1&#46;-mean(a),&amp;mb1&#46;-mean(b) into &#58;ma,&#58;mb from ahuige where monotonic() gt &amp;k&#46;;
quit;[/code:3uuadprv]
作者: shiyiming    时间: 2009-5-22 07:09
标题: Re: 以下的程序怎么编程
真的非常佩服楼上的各位大师!可以问问你们是怎么找出这么多种巧妙脱俗的方法地呢?你们可以进一步谈谈解决这个问题的思路及感想吗?莫非冥冥之中真有注定?
这里真是一个好地方!下次有问题一定跪求!




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2