Tuesday, April 02, 2013

Stata Tips - Stata Journal

Stata Tips of The Stata Journal etc.

Blog: Resources and Other Tips
Stata Blogs
The Tips from Stata Journal: 

Monday, April 01, 2013

Indulge in a Mille Crêpe Cake for Dessert

Maple Mille Crêpes Cake
source: pbs.org

mille-crepe640x360
Gâteau Mille Crêpes is a classic French cake recipe. The crêpes are layered with maple-scotch pasty cream and covered in caramelized sugar. Food blogger Marc Matsumotoexplains the technique for making crêpes in a full post on the Fresh Tastes blog.

Ingredients

  • For crêpes
  • 4 tablespoons unsalted butter, melted, then slightly cooled
  • 4 large eggs
  • 1 cup all bread flour
  • 1 cup milk
  • 1/4 cup grade B maple syrup
  • 1/4 teaspoon sea salt
  • Butter for the pan
  • For pasty cream
  • 1 1/2 cups whole milk
  • 3 whole eggs
  • 1/2 cup grade B maple syrup
  • 1/4 cup cornstarch
  • 1 tablespoon Scotch whiskey
  • 1/2 cup whipping cream
  • 1/2 tablespoon powdered sugar
  • To finish
  • 2 tablespoons granulated sugar

Directions

  1. Put the melted butter and eggs into a blender and blend until emulsified. Add the flour, milk, maple syrup and salt to the blender and blend until smooth. Refrigerate overnight.
  2. Heat a heavy bottomed 9” non-stick pan over medium low-heat until hot. Butter the pan, then use a paper towel to wipe out the extra butter. The surface of the pan should be slick but there shouldn’t be any pools of butter.
  3. Add 2 tablespoons of batter to the center of the pan, and then quickly swirl the batter around to make a crêpe the size of the bottom of the pan. If the batter solidifies before you’re able to spread the batter out, your pan might be too hot. Try keeping the pan off the heat for a few second before you add the batter.
  4. When the crêpe no longer appears wet on top it's ready to flip. Use the corner of a spatula to peel up an edge, and then carefully use your fingers and spatula to peel away and flip the crêpe. The edge of the crêpe should be dry enough that it shouldn't be too hot, but be careful not to burn yourself on the pan.
  5. The crêpe should only need 15-20 seconds on the second side to cook through. Transfer the cooked crêpe to a plate (stack the crêpes on top of each other to prevent them from drying out), and then continue making the rest of the crêpes. If the non-stick coating on your pan isn’t damaged you shouldn’t need to butter the pan again, but if the crêpes start sticking to the pan, keep buttering the pan.
  6. Make the custard while you wait for the crêpe to cool completely. Add the milk, eggs, maple syrup and cornstarch into a blender and blend until smooth. Pour the mixture into a heavy bottomed pot and heat over medium low heat while string constantly until it thickens (160 degrees F or 71 degrees C). Immediately remove the custard from the heat and then stir in the Scotch.
  7. Let the custard cool completely. You can speed this up by placing the pot in a bowl of ice water and stirring the custard.
  8. Whip the cream, and then add the powdered sugar when the cream starts holding soft peaks. Continue whipping until it holds firm peaks, but be careful not to over whip the cream or the fat will start to separate.
  9. Gently fold the whipped cream into the cooled custard using a spatula. If the pastry cream is loose, place it in the fridge to firm up.
  10. To assemble the cake, put a crêpe down on a flat plate or serving platter, then spread an even layer of cream about the thickness of the crêpe. If you make the layer too thin, there won't be enough cream in the cake. If you make it too thick, the cake won't hold its shape when you go to cut it. There should be plenty of pasty cream, so don’t worry about running out, but don’t try to use it all.
  11. Continue layering, saving the best-looking crêpe for the top layer. Once your cake is assembled, cover and refrigerate it for at least 4 hours or overnight to allow the moisture from the pasty cream to redistribute into the crêpes.
  12. To finish the cake, sprinkle 2 tablespoons of granulated sugar on top of the cake in an even layer (passing it through a wire sieve makes this easier). Use a kitchen torch to brûlée the sugar. It’s important that you do this quickly otherwise the cream below will start melting. Hold the torch at a 90 degree angle to the top of the cake, then use a small circular motion working your way around the cake to evenly caramelize the sugar without burning the cake.
  13. Slice and serve immediately.

Wednesday, March 27, 2013

GEE or MLM


Generalized estimating equations (GEE) or multilevel models (MLM)
Source: Andrew Gelman

[YCheng: This is a informative Q & A from the Andrew Gelman's website.]

Diana S. Grigsby-Toussaint writes,
I recently came across your “Statistical Modeling, Causal Inference, and Social Science” website in my attempt to determine the best analysis for my research. As there were some inquiries about whether GEE is a better approach than multilevel modeling, I was hoping you could help with my dilemma.
I am interested in neighborhood (defined as census tract) influences on childhood diabetes risk in the city of Chicago. Although I have a little over 1200 cases, ~40% of my tracts have only 1 case, and the average number of cases per tract is 5. GEE has been suggested as the better approach to HLM, but I am not getting much support for this option….any suggestions for the best approach or articles that might provide some insight?
My quick response: see here.

My longer response:
I think of GEE and multilevel (hierarchical) models as basically the same thing, with the main difference being that GEEs focus on estimating a nonvarying (or average) coefficient in the presence of clustering, whereas MLMs (HLMs) focus on estimating the aspects of the model that vary by group.

Looking further, there are differences in taste: GEEs appeal to people who don’t like distributional assumptions, whereas MLMs appeal to people who like generative models. I prefer MLMs because I like to set up an explicit model for the data; others prefer GEEs because they like to have a procedure that estimates parameters in the absence of assumptions for how the coefficients vary. To give myself the last word on this: I like MLMs because they are expandable to more complex models, and also because often I actually am intersested in the varying coefficients (particuarly varying slopes, as here).

Technical issues
To get to your technical question: there is no problem whatsoever in fitting MLMs when most of your groups have only 1 case, and the average number of groups per case is 5. No problem at all, and I have no idea why anyone would say otherwise. (See Section 12.9 of our new book for more on this, in particular the second full paragraph on page 276.)
You also might be interested in this article, which compares GEE and hierarchical logistic regression.


YCheng: Other articles:

Tuesday, March 26, 2013

Ecological fallacy & atomistic fallacy

Ecological fallacy & atomistic fallacy

As epidemiologists, usually we are told to avoid ecological fallacy, which is making a incorrect inference at lower level (individual) using the information at higher level (group); However, we may think little about the opposite fallacy, atomistic fallacy, which is making a incorrect inference at higher level (group) using the information at lower level (individual). Even worse, some may think the individual level information are only gold standard for policy making.

References

Thursday, March 14, 2013

10 tips for making your R graphics look their best

10 Tips for making your R graphics look their best
Source: Revolutions - David Smith

[Y Cheng: FYI, I ususally use Daniel's XL Toolbox, a free, open-source add-in for Excel, to export figures of Excel into high publishable figures. Hope you like it as well.]

So you've spent hours slaving over the code for a beautiful statistical graphic in R, and now you're ready to show it to the world.  You might be printing it, embedding it in a document, or displaying it on the web.  Don't do your graph a disservice by causing it to look anything less than perfect in its final venue. Here are 10 tips to help make sure your graphic will always look best.

1. Call the right device driver from a script

It's tempting to just create graphics to the on-screen device (such as X11 on Linux or Quartz on MacOS) and then just use "Save As..." from the menu.  However, this doesn't allow you to explicitly set the options for the device, and on some platforms, you don't even get to choose the file format.  Also, if you resize the graphics window after you create the graph, you can get some unexpected results (such as circles that look like ovals). Avoid using dev.copy for the same reason, despite its convenience.

The best practice is to create a script file that begins with a call to the device driver (usually pdfor png), runs the graphics commands, and then finishes with a call to dev.off().  For example:
png(file="mygraphic.png",width=400,height=350)
plot(x=rnorm(10),y=rnorm(10),main="example")
dev.off()
Not only will you often get better-looking results, but you'll have the means to recreate the graphic file six months down the line, when you've long forgotten how you did it manually.

2. If you're printing, use PDF

If you plan to print your graphic, you want to use a vector-based format.  This means that the graphic is represented in a scale-independent format, and it can be recreated in any size small or large without resulting in jagged lines or pixellated text.  When you print it on a printer, lines will appear smooth and text will be clear, even if the graphic has been enlarged or reduced and regardless of the DPI (dots-per-inch) rating of the printer.

PDF (via the pdf() driver) is the best choice: because PDF viewers are ubiquitous these days, your graphic can easily be viewed on Windows, MacOS and Linux machines.  It's also easy to create a high-quality printout of a PDF file on almost any printer.

PDF is also the best choice whenever you want to send the graph as a file via email, and the recipient needs the best quality possible.

3. For Web display, use PNG

PDF files aren't conveniently embedded in Web pages, so you'll need to use a pixel-based format instead.  GIF was the most popular format for many years, but it has several limitations (not least, graphs using many colors -- like image plots -- might not look correct in GIF format).  These days, the best choice is the PNG format, generated by the png() driver. Most browsers these days can display PNG graphics without trouble.

The main choice you need to make when using png() is the dimensions of the graphic in pixels. (This is specified with the width= and height= arguments to png). The choice of the X dimension is the most important: ideally, you want the whole graph to fit on the screen at once, and you definitely don't want the viewer to have to scroll horizontally to see your whole graph in all its beauty.

Almost every display is more than 800 pixels wide these days, so width=800 is a good choice for a full-screen graphic.  If your graph needs to fit into a column (for a blog-entry, say), you might want to cut that down to 400 pixels.  Choose the Y dimension based on your desired aspect ratio (see #6, below) -- for most purposes I find choosing a slightly smaller Y-dimension (about 85-90% of X) works well.

If you're not sure in advance how large the graphic will be on the Web page, a simple trick is to create it at high resolution (more than 1200 pixels in either direction), and use the height= ORwidth= options (but not both, to preserve aspect ratio) for the img tag in HTML to shrink it down to size. This can make your page slower to load than necessary, but most browsers these days are good at preserving image quality when resizing images. (See #5 for some caveats when generating high-resolution PNG files.)

Remember, though: the lower the display resolution, the fewer fine details will be visible on the final graph.  Some graphics just have to be displayed big for the full effect.

4. For documents or for detail, go hi-resolution

If you're inserting a graphic into a document like Word or Powerpoint, a vector format like PDF would in theory be the best, since it's independent of scale.  In practice though, Microsoft products don't handle embedded vector graphics reliably: with some effort you can make it look OK when printed, but it can be a pain to edit or review a document that includes a vector graphic. (Open-source LaTeX handles this much better, where embedded PostScript is the best choice.)

In this situation the best compromise is to stick with PNG as with the Web example, but at MUCH higher resolution.  In Word you can resize the graphic to an appropriate size, but the high resolution gives you the flexibility to choose a size while not compromising on the quality.  I'd recommend at least 1200 pixels on the longest side for standard printers. If your graphic is being professionally printed (in a book or on a poster, for example), check with your print shop for their recommendations (they'll probably want a PostScript file or a very high-resolution TIFF file).

5. Choose your dimensions carefully

R always has a concept of the real-world dimensions of your graphic measured in inches, independent of the number of pixels used to render a PNG or the actual size a PDF may be enlarged or reduced to when printing. The choice of physical dimensions is important whenever you use text on graph -- which is almost always, since tick labels, axis labels and titles are all examples of text.  

R uses the number of graph inches on the X and Y axis to determine the actual width and height of letters drawn on the page. As a general rule, as the graph size in inches gets large, the size of the text relative to the graphic gets smaller; conversely, for smaller graphics the text gets large relative to the graph elements.  You can correct for this using the cex option to the text-plotting commands, but this gets real fiddly real fast.

For PDF graphs this is easiest to deal with, where you specify width and height in inches anyway.  Even if you plan to display your graph on a huge poster, it's best to stick with human-scale dimensions of 7-10 inches per side.  This is a size that would fit comfortably when printed on Letter (US) or A4 (metric) paper. Since PDF is scalable, you can zoom up the graphic for whatever side you need, and the text will stay at a comfortable size relative to the data.
 
For PNG graphs, it's a bit tricker. By default, R assumes 72 pixels to the inch, so when you increase the pixel dimensions you're also increasing the implicit size of the graph area.

Here's an example of a 400x350 graphic with the default settings:
 
png(file="animals72.png",width=400,height=350,res=72)
plot(Animalslog="xy"type="n"main="Animal brain/body size")
text(Animalslab=row.names(Animals))
dev.off()

Animals72 
R is assuming the graph area is 5.55 inches across, so the default text size is large relative to the graph itself.  You can correct this with the res= argument to png, which specifies the number of pixels per inch.  The smaller this number, the larger the plot area in inches, and the smaller the text relative to the graph itself.  Let's see what happens when you drop this down to 45/inch:

png(file="animals45.png",width=400,height=350,res=45)
plot(Animalslog="xy"type="n"main="Animal brain/body size")
text(Animalslab=row.names(Animals))
dev.off()

Animals45
Note the title is smaller, and the text labels are smaller too, making for a less-crowded plot.  I like to choose a resolution that gives me an X dimension in the 8-10 inches range (here 400/45 = 8.33 inches).
6. Think about aspect ratio
R's PDF graphics driver by default gives a 7x7inch square surface, and it's tempting to choose equal X and Y pixel dimensions for PNGs.  But some graphs lend themselves to displays much wider than they are tall (like time series), and others look better as tall, thin graphs (lattice graphs, for example). 

Consider the aspect ratio when choosing the dimensions of your PDF or PNG graphic, and choose an X-height to Y-height ratio that serves the data best.  Whatever you do, don't stick with a square default and resize the graphic to a new aspect ratio for display.  This will result in stretched text elements and other unpleasant artifacts.

Also, remember that the graph dimensions you set up in the pdf or png call include all the outer margins around the graph itself, and by default they're not the same size on all sides. You'll either want to adjust the graph size accordingly, or reset the margins as shown in the next tip.

7. Remove the outer margins, if you're not using them

R reserves space at the top of the graph for the title, and space on the bottom and left side for the axis labels.  If your graph doesn't include any such labels, it's a good idea to tell R to use this space for the graphic, instead.  This makes it easier to embed your graph into a Web page or document without having to futz with clipping or spacing.  It also makes things a bit easier if you later have to reproduce your graph in smaller dimensions, where the space reserved for the labels can take up a significant portion of the plot area.

To remove the space reserved for labels, use par(mar=...).  For example
png(file="notitle.png",width=400height=350)
par(mar=c(5,3,2,2)+0.1)
hist(rnorm(100),ylab=NULL,main=NULL)
dev.off()
The four numbers in the call to par are the number of lines of text reserved on the bottom, left, top and right, respectively.  The default is to leave 4.1 lines at the top; in the example above I've reduced it to 2.1, which is a sensible minimum to leave a small buffer of whitespace around the graph. On the left side I reduced it to 3.1 (from a default of 4.1), leaving enough room for the y-axis tick labels. This is the result (with a surrounding box to show the dimensions of the graph area):

Notitle   

Compare to the result using default margins by eliminating the call to par in the script above:

Notitle-default

8. Make sure anti-aliasing is enabled

When a diagonal line is displayed on a computer screen, the points on the line don't line up exactly with the rectangular grid on the screen. This causes the line to look jagged, as if it's taking a series of steps up (with each row of pixels on the screen) instead of smoothly ascending.  This visual effect is alleviated with anti-aliasing, which uses automatically uses grey pixels where the line doesn't quite fill an on-screen pixel, lessening the "jaggie" effect and generally making lines, text, and other elements look smoother on the screen. 

You don't need to worry about this with PDF graphics (the PDF viewer handles this for you), but it can be an issue with PNG graphics.  On most systems R will use anti-aliasing automatically, but on some (those without X11), it's not available.  Here's a graphic (from the R graph gallery) created without anti-aliasing:
Graph_72 
Antialiasing is enabled on my system, so here's what it looks like when I recreate it (typo and all):
Coal-antialias-on 
In this version, the text is much easier to read and the lines appear smoother.

If you don't have anti-aliasing on your system (and can't recompile R to enable it), you can use the poor-man's anti-aliasing trick: generate the graph in double the resolution, and display it at half the size. The browser will handle the anti-aliasing, at the expense of additional bandwidth for your graphic.
 
9. Don't use JPEG, ever

You might be tempted to use the JPEG (aka .JPG) graphics format for the final product on the Web, but this is almost certainly a bad idea.  JPEG works fine for photograph-like images, but introduces blurry artifacts around lines and letters for the typical R graph.  You might save a few kilobytes in the file size by using the jpeg device driver or converting your PNG into .JPG, but only at a significant expense in quality.
 
10. Be creative

Of course, the most important tip for making your graph look good is: make a good-looking graph! Graphical display of quantitative data is in some ways more art than science, but as a general rule it takes time and effort to make a truly effective display that lets your data tell the story it needs to tell. Fortunately, R provides you with all the tools you need to pull out all the details, make the right comparisons, and make the results pleasing to the eye.  Don't be satisfied with the "stock" graphs from the top-level functions like plot or hist. Make liberal use of the annotation functions like text and line, and experiment with choices of color, layout, and size.

There are many good resources for learning about making good graphical displays, but my favorite is Tufte's classic: The Visual Display of Quantitative Information. Not only is it chock-full with wonderful examples and sensible guidelines for displaying data, it makes a beautiful coffee-table book to show your non-statistician friends that Statistics is about more than just numbers.

If you want to download the scripts that generated the graphs in this article, you can get them here:

Wednesday, March 06, 2013

The logic operation with %IF

The logic operation with %IF of SAS Macro

I have used the SAS for many years; I use the simplified statement for logic comparison in the data step without any problem; the codes, for example, can be IF 18 <= age <= 80 instead of IF age >=18 AND age <=80. However, today I've used hours to figure out a logic problem when I use %IF in the same for SAS macro codes. To get the correct answer of logic operation using %IF, we must use the more standard way (age is a macro variable in the following example): %IF &age>=18 AND &age<=89 %THEN %DO; ......; %END.

Relative articles:

Tuesday, February 12, 2013

Thin Asians at Risk for Diabetes Due to Hidden Body Fat

Thin Asians at risk for diabetes due to hidden body fat
Source: MedScape.come by Lisa Nainggolan

Type 2 diabetes, usually associated with obesity, can occur in many seemingly thin people from ethnic minorities, physicians told attendees here at the Excellence in Diabetes 2013 meeting last week.

Researchers showed that Japanese American women are twice as likely to be diagnosed with diabetes as whites, despite having lower body-mass indexes (BMIs). Epidemiologist Gertraud Maskarinec, MD, from the University of Hawaii Cancer Center, Honolulu, presented the findings, which cover a number of studies from her group, in a poster.

She told Medscape Medical News: "Diabetes risk is higher in all ethnic groups than in whites, and of course some of this is just due to body weight, but evidence is now building that people of many races may be at increased risk of diabetes and cancer before they are even considered conventionally overweight."

In communities where there are a lot of Asians, "I think it's on everybody's radar already," said Dr. Maskarinec. "If an Asian walks in, you don’t have to wait until they weigh hundreds of pounds to do a diabetes test." The World Health Organization (WHO) has worked on the idea to lower the "at-risk" BMI to 23 kg/m2 for certain ethnic groups, she adds, but "not everybody has adopted it."

Meanwhile, Chittaranjan Yajnick, MD, from King Edward Memorial Diabetes Unit, Pune, India, also gave a talk on what makes Indians so susceptible to diabetes. "We have seen that Indians are often diagnosed with diabetes 10 years earlier and 5- to 10-units BMI thinner than whites," he noted.

Both believe the explanation lies in "hidden" visceral fat found inside the body, between organs, in Asians and probably other ethnic groups too, but not in whites. This in turn affects the levels of adipokines secreted, such as leptin and adiponectin, which can have adverse metabolic effects. ...full text ...

Friday, January 18, 2013

Janelia Automatic Animal Behavior Annotator


The Janelia Automatic Animal Behavior Annotator (JAABA) an open-source program, is a machine learning-based system that enables researchers to automatically compute interpretable, quantitative statistics describing video of behaving animals. It may be a good tool for low-cost science projects of middle/high school students.

More information: