BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
supmilk
Obsidian | Level 7

Hey guys,

 

Sas shows me a waring that Do group statements were not executed due to missing END at the time of Quit,

 

BUT although I have checked it for several times, I still cannot find the problem. 

proc iml;
load D;
load RR;
load LL;

start LLH(st,fi,S);
 b_1=(S[st:(fi-1),4]`)*S[(st+1):fi,4]/((S[st:(fi-1),4]`)*S[st:(fi-1),4]);
 b_2s=S[(st+1):fi,4]-b_1*S[st:(fi-1),4];
 b_2=b_2s[:];
 sigma_s1=S[(st+1):fi,4]-b_1*S[st:(fi-1),4]-b_2;
 sigma_s2=sigma_s1##J((fi-st),1,2);
 sigma=(fi-st-1)/(fi-st-2)*sigma_s2[:];
 if sigma=0 then LLF=.;
  else do;
  LLF=(-0.5*(fi-st-1))*log(2*arcos(-1)*sigma)-1/(2*sigma)*((S[st:(fi-1),4]`)*S[st:(fi-1),4]);
 end;
return(LLF);
finish LLH;

fname = "split1":"split2320";
do i = 1 to ncol(fname);
 dsname = "spl1." + strip(fname[i]);
 use (dsname);
 do t=1 to 120;
  g=D[t,1];
  read all where(COL2=g) into SS; 
  if nrow(SS)=0 then RR[i,t]=.;
   else do;
   st=1;
   fi=15;
   M_sf=J(1,2,0);
   do until (fi>240);
    if abs(LLH(st,fi+1,SS)/LLH(st,fi,SS)-1)>0.1 
     then do;
     M_sf[1,1]=st;
     M_sf[1,2]=fi;
     stfi=stfi//M_sf;
     st=fi+1;
     fi=fi+15;
     if st>225 
      then do;
      M_sf[1,1]=st;
      M_sf[1,2]=240;
      stfi=stfi//M_sf;
     end;
     else do;
     fi=fi+1;
     if fi>240 
      then do;
      M_sf[1,1]=st;
      M_sf[1,2]=240;
      stfi=stfi//M_sf;
     end;
    end;
   end; 
   do tt=1 to nrow(stfi);
    b_1=(S[st:(fi-1),4]`)*S[(st+1):fi,4]/((S[st:(fi-1),4]`)*S[st:(fi-1),4]);
    b_2s=S[(st+1):fi,4]-b_1*S[st:(fi-1),4];
    b_2=b_2s[:];
    sigma_s1=S[(st+1):fi,4]-b_1*S[st:(fi-1),4]-b_2;
    sigma_s2=sigma_s1##J((fi-st),1,2);
    r_11=sigma_s2;
    r_1=r_1+r_11;
    r_22=((S[(st+1):fi,4]-S[(st+1):fi,4][:])`)*(S[(st+1):fi,4]-S[(st+1):fi,4][:]);
    r_2=r_2+r_22;
   end;
   RR[i,t]=r_1/r_2;
  end;
 end;
 close;
end;

store RR;
create ba.RR from RR;
append from RR;
quit;
1 ACCEPTED SOLUTION
6 REPLIES 6
Reeza
Super User

Post your full log. 

 

The included code shows 10 do's and 10 end's so the counts match, but I didn't read each line. 

I (SAS) formatted your code, which is what I usually do to try and find missing do/end. 

 

What type of SAS interface are you working with? In EG and Base there are keyboard shortcuts that allow you to jump from a Do to the corresponding END. I can't find a similar function in SAS Studio 😞

 

proc iml ;
    load D;
    load RR;
    load LL;
    start LLH(st, fi, S);
    b_1=(S[st:(fi-1), 4]`)*S[(st+1):fi, 4]/((S[st:(fi-1), 4]`)*S[st:(fi-1), 4]);
    b_2s=S[(st+1):fi, 4]-b_1*S[st:(fi-1), 4];
    b_2=b_2s[:];
    sigma_s1=S[(st+1):fi, 4]-b_1*S[st:(fi-1), 4]-b_2;
    sigma_s2=sigma_s1##J((fi-st), 1, 2);
    sigma=(fi-st-1)/(fi-st-2)*sigma_s2[:];

    if sigma=0 then
        LLF=.;
    else
        do;
            LLF=(-0.5*(fi-st-1))*log(2*arcos(-1)*sigma)-1/(2*sigma)*((S[st:(fi-1), 
                4]`)*S[st:(fi-1), 4]);
        end;
    return(LLF);
    finish LLH;
    fname="split1":"split2320";

    do i=1 to ncol(fname);
        dsname="spl1." + strip(fname[i]);
        use (dsname);

        do t=1 to 120;
            g=D[t, 1];
            read all where(COL2=g) into SS;

            if nrow(SS)=0 then
                RR[i, t]=.;
            else
                do;
                    st=1;
                    fi=15;
                    M_sf=J(1, 2, 0);

                    do until (fi>240);

                        if abs(LLH(st, fi+1, SS)/LLH(st, fi, SS)-1)>0.1 then
                            do;
                                M_sf[1, 1]=st;
                                M_sf[1, 2]=fi;
                                stfi=stfi//M_sf;
                                st=fi+1;
                                fi=fi+15;

                                if st>225 then
                                    do;
                                        M_sf[1, 1]=st;
                                        M_sf[1, 2]=240;
                                        stfi=stfi//M_sf;
                                    end;
                                else
                                    do;
                                        fi=fi+1;

                                        if fi>240 then
                                            do;
                                                M_sf[1, 1]=st;
                                                M_sf[1, 2]=240;
                                                stfi=stfi//M_sf;
                                            end;
                                    end;
                            end;

                        do tt=1 to nrow(stfi);
                            b_1=(S[st:(fi-1), 4]`)*S[(st+1):fi, 4]/((S[st:(fi-1), 4]`)*S[st:(fi-1), 
                                4]);
                            b_2s=S[(st+1):fi, 4]-b_1*S[st:(fi-1), 4];
                            b_2=b_2s[:];
                            sigma_s1=S[(st+1):fi, 4]-b_1*S[st:(fi-1), 4]-b_2;
                            sigma_s2=sigma_s1##J((fi-st), 1, 2);
                            r_11=sigma_s2;
                            r_1=r_1+r_11;
                            r_22=((S[(st+1):fi, 4]-S[(st+1):fi, 4][:])`)*(S[(st+1):fi, 
                                4]-S[(st+1):fi, 4][:]);
                            r_2=r_2+r_22;
                        end;
                        RR[i, t]=r_1/r_2;
                    end;
                end;
            close;
        end;
        store RR;
        create ba.RR from RR;
        append from RR;
        quit;

 

supmilk
Obsidian | Level 7

the full log is shown as:

 

.......(same as the code)

WARNING: DO group statements were not executed due to missing END at the time of QUIT.

121  quit;

NOTE: Exiting IML.

NOTE: Storage library WORK.IMLSTOR closed.

NOTE: “PROCEDURE IML”:  

real time  0.47

cpu time 0.07

 

 

I use the base of SAS interface, and what is the keyboard shortcuts for the corresponding END of the DO group?

Thank you.

Rick_SAS
SAS Super FREQ

It looks like there is not an END statement for 

do i=1 to ncol(fname);

 

Put an END either before the STORE statement or before the QUIT, depending upon the logic of your program.

supmilk
Obsidian | Level 7

Hi Rick,

 

Have you got the keyboard shortcuts for finding the END corresponding to the DO group, which is mentioned by Reeza?

 

Thanks a lot!

supmilk
Obsidian | Level 7

Hi Rick,

 

I found that some problem still exists. The shortcut cannot lead to the right END with its corresponding DO group. Show you some example as below:

I start the shortcut at line 4, and sas jumps to line 9(wrong). I don't know why.

 

proc iml;
k=0;
t=0;
do f=1 to 3; /*start the shortcut here*/
if k=0 
then do;
k=k+1;
t=t+1;
end; /*but move to this wrong place*/
else do;
k=k+2;
t=t+2;
end;
end; 
print k t;
quit;

 

 

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

Multiple Linear Regression in SAS

Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.

Find more tutorials on the SAS Users YouTube channel.

From The DO Loop
Want more? Visit our blog for more articles like these.
Discussion stats
  • 6 replies
  • 1691 views
  • 1 like
  • 3 in conversation