A twitter storm erupted recently in response to one person’s thread about how to find a 10x engineer . Since I started programming FORTRAN with punched cards back in 1974, was an industrial engineer in the 1980s and now run a software company, I’ve worked with a few people, rightly or wrongly considered to fall into that category. So, I thought I’d weigh in on the original author’s points.

10X Engineers hate meetings

There are only two types of software developers who don’t dislike meetings. New developers don’t mind meetings too much because they have a lot of questions like “who do I talk to if I need access to this repository” or “What version of Unity was used to develop this game I’m supposed to update?” They also have specific questions about why the sound function they wrote is not working and Bob, who wrote similar functions for another game is sitting right there. Another type of developer actually likes meetings because he is complete shit at his job and it gives him an excuse not to be expected to do it.

Every other engineer I have ever met either dislikes meetings or actively hates them. The ones you think don’t dislike meetings are just pretending.

We have a 10-minute meeting every morning at 7 Generation Games. People not in the office drop in online. Everyone complains about it but we do it anyway. Why? Because, for example, I can find out that Adekola actually finished the teacher reports for Making Camp Premium before he left and see an example. Then, I can tell the people in marketing to include that in their discussions with schools. I can also tell one of the developers to take that code and modify it for Tribu Matemática , the Spanish version of Making Camp. In 3 minutes, everyone knows what the reports look like, that they are available and who is working on the next one. This leaves seven minutes for José to ask Bob about the sound function.

10X Engineers have irregular hours and work when other people aren’t around

I can’t think of any software developers who work better when other people are around. Writing code for anything complex requires having a mental model in your head of at least the part you are writing and, hopefully, some of the larger project in which it is used.

I’ve worked with a few people who were hit it out of the park better than anyone else. One definitely was a late night person and preferred to get to work when he got there. However, when crunch time came, he could work 8am to 10pm and code all that time if he had to do it. He wasn’t going to like it, though, who would?

On the other hand, about half of the really top engineers I know – both software and hardware – choose to work 9 to 5, even when telecommuting. The main reason they give is that those hours allow them to spend time with their children or spouse. Contrary to popular belief, the 10x engineers I’ve known tended to be married, although they did seem to get married a little older than the average.

10X Engineers know every line of code that has gone into production

This is just nonsense. I remember when SAS was rewritten in C (yes, I am that old) and hearing that it was something like 3,000,000 lines of code. I am assuming the author meant that these 10x engineers know every line of code WRITTEN BY THEM that has gone into production.

I don’t believe that, either, assuming what he means is that they can recall it immediately and say,

“Yes, in that function beginning on line 683, I pause the audio that’s playing, change the source file to the audio for the next scene, change the image file for the image for the next scene, increment the counter by one and restart the audio”.

If what he means is that they kind of recognize it like that person you met at a conference two years ago and are trying to remember their name, I might faintly agree.

We wrote Spirit Lake: The Game in 2012-2014. NO ONE who worked on that game remembers all of the code in it. I can say this because it was all done by me and The Invisible Developer and he is as good as you’ll ever find.

Here is an experience I share with every software engineer I have ever met, including the very best ones. I look at code and think,

“Who wrote this crap? Please don’t let it be me three years ago.”

10x engineers laptop screen background color is typically black (they always change defaults). Their keyboard keys such as i, f, x are usually worn out faster than of a, s, and e (email senders).

They always change the defaults part is true. One thing for sure all of the best engineers I ever met had in common is they like to mess with things. I only knew two people who had black backgrounds – ever. When I have time I’ll have to post about pseudo-10x engineers. Anyway, neither of those guys are anything special unless weirdness is a category.

Most of the best people I know have either pictures of their family or their favorite activity, like soccer or hiking, or a vacation photo as a background. Usually the e key gets worn out first because it is the most common letter in the English language. People usually name directories, datasets and variables something comprehensible.

My kids and one of my kid's dog. What real 10x engineers laptop backgrounds look like
Their laptop backgrounds look like this, except with their own kids, not my kids, because that would be weird

Is there anything true about a 10x engineer?

Since my 10x merit badge hasn’t come in the mail yet, I don’t have time to address all 10 points from the original thread. There were two points he made that were consistent with my experience.

Most really good engineers aren’t really good interviewers

I could only speculate about why that is true, so I will leave it as that is what I’ve observed. Maybe it’s because they are uncomfortable with exaggeration or with being asked to prove their competence.

10x engineers rarely job hunt

I have found this totally to be true and it makes sense. If you have someone that good in your organization and your management is not made up of complete morons, they are doing all they can to hang on to their best people. Usually, unless they work for morons, people that good are hard to hire away, too, because their current company is doing its best to keep them.

How would I find a 10x engineer?

I wouldn’t, because we are a small company and we can’t afford to pay what someone like that is worth. On rare occasions, we have been super lucky to be able to catch someone great for a short term contract that they just wanted to take for personal reasons.

We find good people and we develop them to be at the top of their field. I think the best way to identify a good software developer in an interview is take a look at their code. Ask them to bring something to the interview and explain how they solved particular problems in the code. Ask why they made the choices they did. If it is a project they know well and are proud of, you’ll get a lot of information. If they say, “I don’t know” a lot, that’s a bad sign. I’ve also found that people who typically “don’t interview well” forget about the interview part, focus on the project and become interested in telling you all about it.

Oh , and for all those people on twitter who said, “I wish you all got as exercised about diversity and inclusion as you do about 10x engineers “

Well, I am way ahead of you, sister. I have a lot to say about women in tech and over on our 7 Generation Games blog, too.

One thing I like about our company a lot is none of our developers fit the stereotype of the 10x coder asshole. Don’t get me wrong, we have more than our share of people who are absolutely great at their jobs. What we don’t have is the arrogant attitude of:

What do you mean you don’t know how to integrate 3-D scenes from Unity with web pages? I knew how to do that when I was in the third grade!

First of all, I bet most of those people are liars and if you found their third-grade teacher she would say,

Oh, little Larry? I vaguely remember him. Wasn’t the brightest crayon in the box, now was he?

The fact is that all programmers make mistakes, including really dumb ones. As we get older, we may catch these before we hit the commit or run button, but, then again, maybe not.

Why is this code not working?

data fixdata ;
set fix1;

*** FIXES RECORDS WITH WRONG USERNAME ;
username = trim(username);
if username = "" then delete;
pos = index(username,'-') + 1;
username2 = substr(username,pos);
if upcase(index(username,'test)' > 0 then delete ;

Three mistakes with SAS in the code

I made all three of these mistakes lately (though not all the same day).

The first two SAS will catch for you if you read your log. Also, I cheated you here by not including the color coding that you’ll see in the SAS editor just to make it harder for you.

First of all, I have an unmatched parenthesis.

if upcase(index(username,'test)' ) > 0 then delete ;

This still doesn’t work because I have the closing quote in the wrong place.

if upcase(index(username,'test')) > 0 then delete ;

The hardest errors to find are when your code is running but still wrong

Now my log shows no errors but it’s still not working. I still have more users in the file than I should. The hardest kind of errors to find are logic errors. SAS will usually find the coding ones for you.

What I want to do is delete any usernames that have the word “test” in them, whether written as TEST, Test or test – or any other weird combination people might come up with, like TestAM or TestGarbanzoBeans12.

The problem here is that I used the UPCASE function after I had already searched for the value of “test” in the username. The INDEX function returns a number, which is the position at which the first character of the first occurrence of a string occurs.

NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column). 74:12

Here is what I really need to do

if index(upcase(username),'TEST') > 0 then delete ;

I needed to change a few things. First, I need to put the UPCASE function inside the arguments passed to the INDEX function so that the first thing that happens is that username is set to upper case. Next, I need to change the string it’s matching to “TEST” since I set the username to uppercase. Now, finally, I pass that to an INDEX function and see if the string exists. If so, I delete the record.

This is a relatively simple bug to fix when presented like this. However, when it is hidden in hundreds of lines of code and all I know is that the number of records doesn’t match what I should have, it’s not so obvious, particularly when there are no errors showing in your SAS log. Did the username2 throw you off? Well, imagine hundreds more lines like that.

My points, and I do have more than one …

  1. Everyone makes mistakes, no matter how experienced they are.
  2. A bug fix may seem obvious after you have found it or if it’s been pointed out to you, but buried in hundreds or thousands of lines of code, it’s not so easy. An argument for modular development.
  3. READ THE NOTES! If you are deluded into thinking that if there is nothing in red in your SAS log all is good, get over that notion now.
  4. The enhanced editor is your friend. The incorrect quotation mark you could have picked up in the editor if you noticed that the closing parenthesis was in purple. In this particular case, it wasn’t so obvious because it was only off by one character. However, if you see a whole bunch of purple, meaning it is quoted, or green, for comments, it can be a tip right away that something is off.

One last thing – the SAS Enhanced Editor with color coding – I remember when it was brought up as a new, improved version of SAS and I laughed.

“Really? That’s what you’ve got? Color-coding? I mean, I’m sure it might help someone their first week on the job but we are all professionals here .. ha ha ha.”

Yeah, that was stupid, too. That enhanced editor has helped me catch so many bugs in code as I was writing it!

Random fact about me – I host a podcast

Yes, yes I do. It’s called More than Ordinary. This week’s co-host is Drew Kim who co-founded and runs an esports company with his mom. (Yes, you read that right.) Next week will be the continuation of a discussion of all things judo with Jason Harai of Ippon Dojo, in Washington. Basically, it’s all about having guests who are doing something out of the ordinary.

What are reusable blocks and why do you want to use them?

This can best be explained by an example. Over at 7 Generation Games, we have a new project under way to create organize the hundreds of videos, presentations and activities we’ve developed with our games into a teacher resource site. Most of these fall into one of a few categories. For example, we have 19 math videos from Fish Lake.

Whenever a lot of posts have the exact same structure, you have a use for reusable blocks.

Take a look at this post on the Fractions on a Number Line video.

  1. It has a subheading (h3 tag) with the main point of the video.
  2. This is followed by a short paragraph describing the video, with a background color of light blue.
  3. Next is the video. IMPORTANT – although Gutenberg does allow you to just enter a url and hit return for a video to be shown in a regular post, I found this did NOT work for reusable blocks. When I used embed instead, it worked fine.
  4. After the video is a heading (h2 tag) telling you this video is from an awesome game we make.
  5. Next are two links, one for getting the game for computers,
  6. Another link for the app store for iPads.
  7. Then there is an image from the game and
  8. A short paragraph describing the game.

How to create a reusable block

Select everything you want in the reusable block. In my case, it is all 8 of those blocks listed above. Then, click on the 3 dots at the top of the block menu and in the drop down menu select ADD TO Reusable blocks.

Give it a name, save it and now you have a reusable block.

How to use a reusable block

A reusable block as “copy-and-paste”

You have two options. The first is to just use the block as-is. Say, I just wanted to include an ad in blog posts, or some call to action, like signing up for our newsletter. Then, I could just insert that block like I do any other block – paragraph, image, etc. and this would be pre-populated with the content. Done.

Reusable blocks as templates

The more common option for me is going to be to modify that block, using it as a template. So, I insert the block just like I do any other block. Then, I click on the block I just inserted and select convert to regular block.

Don’t forget to convert to regular block or your edits will be made everywhere you used that block!

Now that I have it converted to a regular block, I can change the first heading, the description and paste in the url for the new video. My post is done. Not only does this save me time, but if I want to hand the task off to someone else, say a new intern, they have a ready-made format.

Another advantage is if I do need to change something everywhere, I can do it with one click. A few years ago, the site we had been using to sell our Mac and Windows games went out of business. It would have been really helpful to have had something like this so that I did not have to go in and change every page where there was a link to the old site.

So, yeah, reusable blocks have converted me to Gutenberg. (Converted , get it? Oh, never mind.)

Fish Lake fractions game with Native American girl stepping on stones across a creek

Like math? You’ll love this game.

Get Fish Lake here for Mac or Windows

or … want Fish Lake for iPad ? Get it in the app store

Around our office, there are a lot of haters of the Gutenberg editor. However, I’ve found quite a few new features that are hard not to like. Here are just a few of them.

The cover block type

Say you’d like to have a background image for your text, like the one below. Just use the COVER block. Well, when I do that and put in the text and hyperlink it, the text is blue which is a hard color to read against that background color. So, I select the text and in the Color Settings in the right block settings, I pick white. Voila! Click the box below and check out AzTech: The Story Begins.

If you change your mind and transform the cover block back to a regular old image, then the text overlaid becomes the caption for the image, but where’s the fun in that?

You can change all kinds of attributes of the background images, for example, the opacity here was set to 60% and for the next image below to 40%.

The button block type

The button block does exactly what you might guess, it creates a button, with an optional link. You can easily change the background and text color just by selecting from the right panel under block settings (as in panel on your right, not as in correct panel, well, actually, that, too. I think this would be even more useful if you could combine it with the cover block, but, as of now, alas, that is not an option.

Sadly, buttons are not allowed here )-:

The columns block type

It’s funny given how much people made fun of me for using tables in my websites way back when we were making them with GoLive, that now we are back to something approximating tables. Also, you can see from the example below that you can get some pretty slick designs just with the Gutenberg editor out of the box. In the past, you’d need to do backflips with additional CSS to get the layout exactly how you wanted it.

Here is the new teacher resource site I’m working on

With the columns block, you can specify the number of columns, and you can even split some of the columns. If I wanted, I could split my English as a Second Language block above into two, Spanish and Lakota.

Of course, the nice thing about columns is that they, hopefully, are more responsive than tables. I say hopefully because the theme I am working with turns this into a very nice layout with all the blocks underneath each other for phones, but for smaller iPads it shows two sets of two boxes and then the last two underneath each other with a bunch of white space on the side. Oh well, nothing is perfect – yet.

Change is hard, but the new editor promises to be worth it

There are quite a few other new types in Gutenberg that I haven’t needed to use yet, but I am sure I will in the future, and some older features that seem to be significantly improved. If, like most of us in the office, found yourself swearing at WordPress because you’re existing site was working just fine and now you have to learn all this new $#@! when you really don’t have time, you might want to re-think that position.

I had more than the two tips on becoming a better programmer than I gave in the last post but I had run out of margarita. Now, being replenished with tequila and fresh lime by The Invisible Developer, here are two more. He often tells me that I should refer to myself as a developer and not a programmer because that is beneath me. I have never pretended to be cool. I started with punched cards as a programmer and a programmer I will remain. At least until the second margarita.

margarita
It’s Friday!

If you aren’t familiar with github, you could have gone to Chris Hemedinger’s super demo at SAS Global Forum. We use github for version control and it is indispensable for that. When you have several people working on the same program, I can edit files, you can, too, and we all upload and download the latest versions without copying over each other’s code. If you are on a project with more than one developer, once you have used a git repository, you’ll fight anyone who tries to take it away.

Because it is so good for sharing, github is used a lot for open source projects and for people just making their code publicly available.

The main thing I learned that I didn’t know is that there is a https://github.com/sassoftware

I had just assumed since SAS is a private company and definitely not open source that there would not be much available. I was wrong.

Whatever language you use, there is probably a github for it.

Here is a funny thing. When I first started learning JavaScript, I scavenged github to find examples of people making simple games like tic-tac-toe , Memory or mazes. I’d modify the code to do what I wanted and I thought all of these people were so much smarter than me.

After I learned a bit more, sometimes I saw functions or libraries in the code that didn’t do anything and I realized that a lot of these people had done the exact same thing as me – copied someone else’s code and modified it for their purposes.

Start by copying code from github, but don’t stop there

If you ask me – and even if you don’t, I’m going to tell you anyway – it is absolutely fine to download code from someone else’s repository on github and tweak it a little for your own purposes. However, don’t stop there! Dive into it. Figure out what each function does, try to understand their logic.

A better person than me would have their own public git repository. Oh well, I have a bucket of private ones for work and I’ve been writing this blog for 11 years, so that will have to do. YOU should definitely have public repository, though. Changing the subject here …

Git Repositories that are NOT python, R or Viya

The top repositories almost all entail either integrating SAS and Python (not surprising because it is open source) or Viya or Visual Analytics (presumably because it is expensive and SAS wants to promote it). There are also a smattering of SAS-and-R repositories in the top hits and repositories for SAS and iOS and SAS and Android. I’m not interested in any of that at the moment.

Right now, I am super-swamped but I should have some free time over the summer, so here are my personal interests I am marking for later. With 116 repositories, any SAS aficionado should find something of interest, and remember, this is just the sassoftware repository. There are additional repositories of individual users, like the last one I noted below

SAS Studio Tasks is an area I’d like to learn more about, as in writing your own custom tasks.

Data mining is an area I am ALWAYS wanting to brush up on more . This library of flow diagrams for specific data mining topics looks really cool.

Not a SAS Institute repository, this one from Michael Friendly is on macros and looks super cool.

As I mentioned above, I started using github for JavaScript code and there are TONS of repositories for just about any language that would tickle your fancy (what exactly IS a fancy, anyway?)

I have more tips but it will have to wait for another margarita and since my grandchildren are spending the weekend and just invaded my office, that will have to wait.

I did a random sample of presentations at SAS Global Forum today, if random is defined as of interest to me, which let’s be honest, is pretty damn random most of the time. 

Tip #1 Stalk Interesting People

I don’t mean in a creepy showing up at their hotel room way. If you see someone presenting either in person or referenced in twitter, blogs, etc. , check out what else that person has freely available on the web, in published proceedings, etc.

Let me give you an example that applies even if you are not into logistic regression. (You’re not? Feel shame.)

The first session I attended was a Super Demo in the exhibit hall which for some reason I don’t understand is always called the Quad. 

In a nutshell, logistic regression is usually 

  • binary, which is where I started out, modeling mortality studies, you’re either dead or alive
  • multinomial, that is, multiple categories, like college major or religion or 
  • ordinal , like someone is a subscriber, contributor, editor or administrator on a group blog, which are progressively higher levels of involvement

What if the data fit the proportional odds model for some of the explanatory variables and not others? You can do a partial proportional odds model. 

Line plots on slide
Graphing your data is a great way to see if the proportional odds model makes sense. You can see that it does for the variable on the right, but for the left, not so much.

Unfortunately, the super demos do not have a paper published in the app or proceedings, however, the presenter, Bob Derr from SAS mentioned he had presented a paper on this topic in 2013 (way to play hard to get, Bob – not!)

Paper reference on slide (also below in blog)

I skipped the next presentation to read it (and to write this post). If you are at all interested in multinomial and ordinal logistic regression, you should, too. You can find it here in the SAS Global Forum 2103 proceedings. http://support.sas.com/resources/papers/proceedings13/446-2013.pdf

It’s an outstanding paper and I am going to require it for my course next year. I think the students will find it far more accessible than some of the readings we have been using. They don’t complain loudly, but I know, I know. 

Tip #2 Read the Documentation (No, seriously, keep reading)

People who answer comments with LMGTFY (let me Google that for you) or RTFM (read the fucking manual), just so you know, that quit being funny around 1990. However, SAS documentation really is a treasure trove. It’s not just SAS, the same could be said about jQuery documentation or the WordPress Codex but we’re not talking about those today, are we? Please try to stay on topic. 

The SAS documentation runs many, many thousands of pages. It’s far better and more detailed than you would think. Let me give you an example a very helpful person named Michael pointed out in the Quad (what the hell is it with that name?) today. As I’ve mentioned several times lately, my students often struggle with repeated measures ANOVA. He suggested checking out the page on longitudinal data analysis.

http://support.sas.com/rnd/app/stat/procedures/LongitudinalAnalysis.html

It gives four different procedures (none of which are GLM, I noted, but that’s a discussion for another day). 

Related to that, I recommend when you are learning procedures just running some of the code examples. For example, here is one for repeated measures with PROC MIXED. http://documentation.sas.com/?docsetId=statug&docsetTarget=statug_mixed_examples02.htm&docsetVersion=15.1&locale=en. (Yes, I really do have that on my mind lately)

Think about this, though. Once you graduate from whatever your last degree turns out to be, you don’t have anyone checking your work and telling you if it is right or not. You just write your code and hope for the best. That sucks, huh?

When you are learning a new procedure, you can write code using the data shown in the SAS documentation and see if your results match. Like an answer key for life! I always wanted one of those.

Since the last few posts detailed errors in repeated measures with PROC GLM , I thought I should acknowledge that people seem to struggle just as much with PROC MIXED.

Forgetting data needs to be multiple rows

This is one of the first points of confusion for students. When you do a PROC MIXED, you need multiple records for each person. So, thinking back to my previous example with three time points, with PROC MIXED, and two options for treatment, my dataset needs to look like this:

SubjectExamTreatmentScore
1PreTalk43
1PostTalk46
1FollowTalk45
2PreDrug39

With GLM, you’d have 3 variables, named Pre, Post and Follow, for example (you *did* read the last post, right?). In PROC MIXED, your dataset has to be structured so that you have one variable, in this case, named “exam”, and it takes on one of three possible values.

Let’s start with the simplest case. I’d like to know, just like before, if there was a change from pre to post-test and if it was maintained at follow-up. In other words, my question is, “Was there a difference between the pretest and post-test and a difference between pretest and follow-up six months later?” I am not particularly interested in the post-test/ followup difference as such. Here is one way to code it:

Proc mixed data = example ;
class subject exam;
model score = exam ;
random subject ;
contrast “pre vs post” exam 1 -1 0 ;
contrast “pre vs follow” exam 1 0 -1 ;


The PROC GLM code from this post will give you the exact same results as the code above, but only if you have your data structured so that you have three variables instead of three records for each person.

I have a lot to say about CONTRAST statements, which I love, and random effects, about which I am neutral, and nested effects, that are not relevant to this example but could be. However, I am trying to not work past 9 pm and it’s already an hour later so … until next time.

Also, if you’re at SAS Global Forum, be sure to meet up and say “Hey!”

This is my day job …

Check it out. I make games that teach math, including, of course, statistics. Play AzTech: Meet the Maya – the only statistics game with Honduran fruit bats.

As I said in my last post, repeated measures ANOVA seems to be one of the procedures that confuses students the most. Let’s go through two ways to do an analysis correctly and the most common mistakes.

Our first example has people given an exam three times, a pretest, a posttest and a follow up and we want to see if the pretest differs from the other two time points.

proc glm data = example ;
model pre post follow = /nouni ;
repeated exams 3 contrast (1) /summary printm ;

Among other things, this will give you a table of Type III Sum of Squares that tells you that you have a significant difference across time. It will also give you contrasts between the 1st treatment and each of the other two.

You can see all of the output produced here.

This is using PROC GLM and so it requires that you have multiple VARIABLES representing each of the multiple times you measured people. This is in contrast to PROC MIXED which requires multiple records for each subject. We’ll get into that another day.

One thing that throws people all of the time is they ask, “Where did you get the exams variable?” In fact, I could have used any valid SAS name. It could have been “Nancy” instead of “exams” and that would have worked just as well. It’s a label we use for the factor measured multiple times. So, as counterintuitive as it sounds, there is NO variable named “exams” in your data set.

Let’s try a different example. This time, I have a treatment variable. I have administered two different treatments to my subjects. I want to see if treatment has any effect on improvement.

proc glm data =example ;
class treatment ;
model pre post follow = treatment/ nouni ;
repeated exams 3 /summary ;

The fixed effect does *not* go in your REPEATED statement

In this case, I do need a CLASS statement to specify my fixed effect of treatment. A really common mistake that students make is to code the REPEATED statement like this:

repeated treatment 3 /summary ; *WRONG! ;

It seems logical, right? Why would you use a completely made up name instead of one of your variables? If you think about it for a minute, though, treatment wasn’t repeated. Each subject only received one type of treatment.

When you are asking whether one group improved more than the other(s) what you are asking is, “Is there an interaction effect?” You can see by the table of Type III Sums of Squares produced below that there was no interaction effect.


A significant effect for the repeated measure does not mean your treatment worked!

A common mistake is to look at the significance for the repeated measure and because a significant change was found between times 1 and 3 to say that the treatment had an effect. In fact, though, we can see by the non-significant interaction effect that there was not an impact of treatment because there was no difference in the change in exam scores across the levels of treatment.

There are a lot of other common mistakes but I need to go back to work so those will have to wait for another blog.

When I teach students how to use SAS to do a repeated measures Analysis of Variance, it almost seems like those crazy foreign language majors I knew in college who were learning Portuguese and Italian at the same time.

I teach how to do a repeated measures ANOVA using both PROC GLM and PROC MIXED. It seems very likely in their careers my students will run into both general linear models and mixed models. The problem is that they confuse the two and the result is buggy code.

Let’s start with mistakes in PROC GLM today. Next time we can discuss mistakes in PROC MIXED.

Let’s say I have the simplest possible analysis – I’ve given the same students a pre- and a post-test and want to see if there has been a significant increase from time one to time two.

This will work just fine:

proc glm data =mydata.fl_pre_post ;
model pretest posttest = /nouni ;
repeated time 2 ;

Coding the repeated statement like this will also work

repeated time 2 (1 2) ;

So will

repeated time ;

It almost seems as if anything or nothing after the variable name will work. That’s not true. First of all,

repeated time 2 (a b) ; IS WRONG

… and will give you an error – Syntax error, expecting one of the following: a numeric constant, a datetime constant.

“Levels gives the number of levels associated with the factor being defined. When there is only one within-subject factor, the number of levels is equal to the number of dependent variables. In this case, levels is optional. When more than one within-subject factor is defined, however, levels is required,”

SAS 9.2 Users Guide

So, this explains why you can be happily using your repeated statement without bothering to specify the number of levels for a factor and then one day it doesn’t work. WHY? Because now you have two within-subject factors and you need to specify the number of levels but you don’t know that. This is why, when teaching I always include the number of levels. It will never cause your program to fail, even if it is unnecessary sometimes.

One more cool thing about the repeated statement for PROC GLM, you can do a planned contrast super easy. Let’s say I have done 3 tests, a pretest, a post-test and a follow-up. I want to compare the posttest and followup to the pretest.

proc glm data =mydata.fl_tests ;
model pretest posttest follow = /nouni ;
repeated test_time 3 contrast (1) /summary ;

What this will do is compare each of the other time points to the first one. A common mistake students make is to use a CONTRAST statement here with test_time. This will NOT work, although it will work with PROC MIXED, but that is a story for another day.

I cannot believe that it’s been over two months since I’ve written a post. That is the longest I’ve gone in the ten years I have been writing this blog. I read somewhere that the average blog has the lifespan of a fruit fly – after 31 days most people give it up.

That seems to lead to a cottage industry in taking over dormant sites. This site isn’t exactly stagnant even when I am not blogging because people use it for reference.

I started getting emails about “a somewhat embarrassing page”. At first I was aghast that hackers had redirected clients to a porn site.

Fortunately, no, it was just a failed re-direct attempt that ended up breaking a link so you get a 404 page that literally says, “Well, this is somewhat embarrassing.”

The Invisible Developer spent a good bit of time while we were in New York deleting malware from the site. At first, I was feeling very guilty because I thought my cavalier attitude toward security issues with PHP was the reason, but we did clean up most of the problems pointed out in those comments years ago, so that wasn’t the culprit. I should admit here that Paul and Clint were right and I was wrong. Although we have no data of particular value to anyone on this site, hackers are interested in re-directing sites to get links and for other nefarious purposes.

As near as we can tell it was a plugin on another site that was hosted by us that had not been updated in years. We had several more or less abandoned domains of content we had created for clients over the years. They paid us, we created the content for their course or other purpose, and then just left it up. Kind of like all of that stuff you have in your closets that you just shove to the back because you have room.

That’s all cleaned up now. The site, not the closets. Those are still chaos. For all I know, there is an entire new civilization developing in that closet under the stairs. Or maybe Harry Potter lives there.

As for me, I have been teaching two courses during the past 3 months, where I usually only teach one in a year. After landing back in the U.S. in February, I have been criss-crossing the country. Since the beginning of the year, I think I’ve been in 11 cities, 3 states and 2 countries but I may have forgotten a few.

We also released two new games, Fish Lake Adventure , for the iPad, and a new version of AzTech: Meet the Maya, also for the iPad.

Get it in the app store

My lovely daughter, Ronda, headlined this show called Wrestlemania, which is why we were in New York. We have chosen very different careers , my daughters and I. The Perfect Jennifer, or, as she likes to call herself, “the normal one”, is a middle school history teacher, in case you were wondering. The Spoiled One is currently doing a semester abroad in London. She will be back in the U.S. next month and needs a summer internship. Her talents include Instagram, shopping and soccer. If your company doesn’t need any of those skills, she’s also a good writer. Darling Daughter Number One, is 7 Generation Games CEO, she’s also a good writer, having co-authored a New York Times best seller, but she’s not looking for an internship.

So, anyway, I am back, well for a couple of weeks. Next, I head to SAS Global Forum in Texas for a few days to give a couple of presentations on biostatistics and career advice . You’d think my career advice might be to study biostatistics but, maybe not…

Then, I come home for a couple more weeks and am off to a Tech Inclusion conference in Melbourne, Australia. My talk there is going to be, well – different than most – and that’s all I’m going to say about that.

So, now, I’m back to blogging. I have a few things to say about the infinite number of ways people can incorrectly code a repeated measures ANOVA , subdomains and number needed to treat. Between the next game, new website, two conferences and two grant proposals all coming due before June, I’m sure I’ll fit it in there somewhere.

← Previous PageNext Page →