Skip to content

Converting SAS Code

14 messages · Andrew Harmon, Tobias Fellinger, Michael Dewey +10 more

#
Hello all,

My statistical analysis training up until this point has been entirely done
in SAS. The code I frequently used was:

*Yield Champagin;

data yield;

set stress;

if field='YV' then delete;

if field='HB' then delete;

if barcode='16187DD4015' then delete;

if barcode='16187DD6002' then delete;

if barcode='16187DD2007' then delete;

if barcode='16187DD5016' then delete;

if barcode='16187DD8007' then delete;

if barcode='16187DD7010' then delete;

if barcode='16187DD7007' then delete;

if barcode='16187DD8005' then delete;

if barcode='16187DD6004' then delete;

if barcode='16187DD5008' then delete;

if barcode='16187DD7012' then delete;

if barcode='16187DD6010' then delete;

run; quit;



Title'2016 Asilomar Stress Relief champagin yield';

proc mixed method=reml data=yield;

class rep Management Foliar_Fungicide Chemical_Treatment;

model Grain_Yield__Mg_h_ =Management|Foliar_Fungicide|Chemical_Treatment
Final_Stand__Plants_A_ / outpred=resids residual ddfm=kr;

random rep rep*Management rep*Management*Foliar_Fungicide;

lsmeans Management|Foliar_Fungicide|Chemical_Treatment / pdiff;

ods output diffs=ppp lsmeans=means;

ods listing exclude diffs lsmeans;

run; quit;

%include'C:\Users\harmon12\Desktop\pdmix800.sas';

%pdmix800(ppp,means,alpha=0.10,sort=yes);

ods graphics off;

run; quit;

proc univariate data=resids normal plot; id Barcode Grain_Yield__Mg_h_
pearsonresid; var resid;
proc print data=resids (obs=3);run;

Can someone please help me convert my code to R? Any help would be much
appreciated.


Thanks,


Andrew Harmon
#
Hello, 

in my experience the most direct path of converting SAS code to R is by
using dplyr. dplyr provides the filter function, the first part of your
code could look like this, assuming your datasets are stored as
data.frames:

library(dplyr)

yield <- filter(stress,
  field != "YV",
  field != "HV",
  barcode != "16187DD4015",
  barcode != "16187DD6002")

(and so on for the other barcodes.)

For mixed effects look into the lme4 package, lmer should use the reml
criterion per default, the model specifications work very different in
R. Look into the vingette [1] of the lme4 package chapter 2.1. gives an
explanation of the used model formulas.

You should get the coeficients of the fitted glmer model with the coef
function. 

The Plots and univariate statistics work very different in R, have a
look at the functions group_by and summarise provided by the dplyr
package for calculating univariate statistics by groups, and the ggplot
2 package for plotting. 

Tobi

[1] https://cran.r-project.org/web/packages/lme4/vignettes/lmer.pdf
On Fri, 2017-09-29 at 07:47 -0500, Andrew Harmon wrote:
#
You might get better answers if you

1 - break this down into separate issues
2 - tell us what you want to achieve in words rather than SAS, we all 
read English but few of us speak SAS
3 - post in plain text not HTML as HTML mangles your post
On 29/09/2017 13:47, Andrew Harmon wrote:

  
    
  
#
Regarding point 3, as a moderator I have been helping Andrew get this 
post out to the list over the past week. His previous attempts were 
encoded in some way that the listserv rejected. He sent me the post via 
his gmail account and viewing the source I saw it had at least both 
plain test and HTML an I said it was worth a try to post it. Certainly 
on my mail client his post displays acceptably with the notice that the 
HTML alternative was removed.

Kevin
On 09/29/2017 09:51 AM, Michael Dewey wrote:

  
    
#
I will offer an opinion, with which others may fairly take issue.

If you are coming from SAS and wish to learn R, you should forget about SAS
entirely; it is ancient and convoluted. But more to the point, as others
have already suggested, you will only confuse and hamstring yourself trying
to convert the programming paradigms of one language into another. Better
to consider the **tasks** you wish to accomplish and learn how to approach
them in the new language. I would add that this especially includes
learning about R's varied data structures for which there is no cognate in
SAS I think (correction requested if I'm wrong about this).

If this is a one-off, just finding a local resource to do the job for you
might be the best approach.

Cheers,
Bert





Bert Gunter

"The trouble with having an open mind is that people keep coming along and
sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )

On Fri, Sep 29, 2017 at 10:21 AM, Kevin E. Thorpe <kevin.thorpe at utoronto.ca>
wrote:

  
  
#
I wish to second this approach to learning R. 

I tried for several years to translate other stat programs  or provide 
parallel analyses with R. 
This dabbling-in-R approach did not work
. 
When a transferred to a research unit  that could ill afford commercial 
software, I devoted my entire time to doing everything in R. 
This was a difficult learning process, but I eventually became proficient 
in R. 

The conceptual paradigm for R is only marginally commensurate with that of 
standard statistical software. 
You must immerse yourself in R to become proficient. 

Good luck,
Joe
 


Bert Gunter <bgunter.4567 at gmail.com> 
Sent by: "R-help" <r-help-bounces at r-project.org>
09/29/2017 02:09 PM

To
"Kevin E. Thorpe" <kevin.thorpe at utoronto.ca>, 
cc
R-help <r-help at r-project.org>, Andrew Harmon <andrewharmon42 at gmail.com>
Subject
Re: [R] Converting SAS Code






I will offer an opinion, with which others may fairly take issue.

If you are coming from SAS and wish to learn R, you should forget about 
SAS
entirely; it is ancient and convoluted. But more to the point, as others
have already suggested, you will only confuse and hamstring yourself 
trying
to convert the programming paradigms of one language into another. Better
to consider the **tasks** you wish to accomplish and learn how to approach
them in the new language. I would add that this especially includes
learning about R's varied data structures for which there is no cognate in
SAS I think (correction requested if I'm wrong about this).

If this is a one-off, just finding a local resource to do the job for you
might be the best approach.

Cheers,
Bert





Bert Gunter

"The trouble with having an open mind is that people keep coming along and
sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )

On Fri, Sep 29, 2017 at 10:21 AM, Kevin E. Thorpe 
<kevin.thorpe at utoronto.ca>
wrote:
post
in
client
was
=Management|Foliar_Fungicide|Chemical_Treatment
much
______________________________________________
R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide 
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
#
All HTML emails have a plain text part along with the HTML part... but it is usually invisible to the author and is automatically generated by the email composing software and some software is better than others at that job (by a lot). However, without a doubt, sending the email in text form at least means the sender saw the plain text part before it was sent, which removes a potentially huge barrier to communication.  And GMail definitely can send plain text.
#
Hi,

I would echo Bert's comments below.

The last thing that you want to try to do is to convert SAS code to R code on a "line for line" basis. The programming paradigm of R, which is built upon vectorized operations, takes a "whole object" approach for efficiency. SAS does not, since it is generally based upon 1970's era, main frame style, programming techniques using macros, etc.

If this is not a one off and something that you might find yourself doing with some frequency, you might consider investing in Bob Muenchen's book, R for SAS and SPSS Users:

  https://www.amazon.com/gp/product/1461406846/ <https://www.amazon.com/gp/product/1461406846/>

While it is now a few years old, it is still relevant in terms of pointing you in the direction of basic and conceptual linkages between the languages.

Regards,

Marc Schwartz

  
  
#
On 30/09/17 07:45, JLucke at ria.buffalo.edu wrote:
<SNIP>
Fortune nomination.

cheers,

Rolf
#
For the initial data step, assuming a data frame named stress already exists, and using base R, you can start with something like this:

barcodes.to.delete <- c('16187DD4015', '16187DD6002',   {complete the comma-delimited vector of barcodes you don't want}  )

yield <- subset(stress,  !(barcode %in% barcodes.to.delete) )
yield <- subset(yield , !(field %in% c('YY','HB') )

## the above three lines could be done in a single line, but it would be long, ugly, hard to read, and hard to validate.
## easier to split it into a few steps

## another way, still using base R, and with a different syntax for the subsetting
records.to.drop <- stress$barcode %in% barcodes.to.delete | stress$yield %in% c('YY', 'HB')
yield <- stress[ !records.to.drop , ]

I think these are examples of doing it "the R way", not thinking in terms of directly translating SAS code to R code.

I used to use SAS a lot, but I don't know what the line
  *Yield Champagin;
does.

--
Don MacQueen
Lawrence Livermore National Laboratory
7000 East Ave., L-627
Livermore, CA 94550
925-423-1062
Lab cell 925-724-7509
On 9/29/17, 5:47 AM, "R-help on behalf of Andrew Harmon" <r-help-bounces at r-project.org on behalf of andrewharmon42 at gmail.com> wrote:
Hello all,
    
    My statistical analysis training up until this point has been entirely done
    in SAS. The code I frequently used was:
    
    *Yield Champagin;
    
    data yield;
    
    set stress;
    
    if field='YV' then delete;
    
    if field='HB' then delete;
    
    if barcode='16187DD4015' then delete;
    
    if barcode='16187DD6002' then delete;
    
    if barcode='16187DD2007' then delete;
    
    if barcode='16187DD5016' then delete;
    
    if barcode='16187DD8007' then delete;
    
    if barcode='16187DD7010' then delete;
    
    if barcode='16187DD7007' then delete;
    
    if barcode='16187DD8005' then delete;
    
    if barcode='16187DD6004' then delete;
    
    if barcode='16187DD5008' then delete;
    
    if barcode='16187DD7012' then delete;
    
    if barcode='16187DD6010' then delete;
    
    run; quit;
    
    
    
    Title'2016 Asilomar Stress Relief champagin yield';
    
    proc mixed method=reml data=yield;
    
    class rep Management Foliar_Fungicide Chemical_Treatment;
    
    model Grain_Yield__Mg_h_ =Management|Foliar_Fungicide|Chemical_Treatment
    Final_Stand__Plants_A_ / outpred=resids residual ddfm=kr;
    
    random rep rep*Management rep*Management*Foliar_Fungicide;
    
    lsmeans Management|Foliar_Fungicide|Chemical_Treatment / pdiff;
    
    ods output diffs=ppp lsmeans=means;
    
    ods listing exclude diffs lsmeans;
    
    run; quit;
    
    %include'C:\Users\harmon12\Desktop\pdmix800.sas';
    
    %pdmix800(ppp,means,alpha=0.10,sort=yes);
    
    ods graphics off;
    
    run; quit;
    
    proc univariate data=resids normal plot; id Barcode Grain_Yield__Mg_h_
    pearsonresid; var resid;
    proc print data=resids (obs=3);run;
    
    Can someone please help me convert my code to R? Any help would be much
    appreciated.
    
    
    Thanks,
    
    
    Andrew Harmon
    
    
    ______________________________________________
    R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
    https://stat.ethz.ch/mailman/listinfo/r-help
    PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
    and provide commented, minimal, self-contained, reproducible code.
#
Nothing. It's a comment...
#
On Fri, Sep 29, 2017 at 2:32 PM, peter dalgaard <pdalgd at gmail.com> wrote:
Fortune nomination!

Peter
#
On 9/29/2017 3:37 PM, Rolf Turner wrote:
For newer list members wondering what Rolf is talking about try:

library(fortunes) fortune() to get a flavor! There are many pearls of 
wisdom.

  
  
#
Also, to get roughly back on topic, try

fortune("SAS")

several times, or more quickly

fortune("reverse the procedure")
fortune("Poalis")

-pd