Sunday, November 14, 2010

AHIP Answers

I use Google Analytics to observe the trends on my site, including this blog. Searches including the term AHIP (America's Health Insurance Plans) have a high hit rate, including the following phrases:
  • AHIP certification test questions
  • AHIP course [material | answers]
  • AHIP final exam questions
  • AHIP fundamentals of health insurance part a [answer | exam | tips]
  • AHIP practice test questions
  • AHIP questions
  • AHIP study [guide | material]
  • AHIP test [answers | help | tips]
  • answers [for AHIP | to the AHIP exam]
  • how to study for AHIP test
  • passing the AHIP test
  • sample questions of the AHIP
  • what is hardest part of the AHIP test in 2010
Long list, right? It would seem there are people desperate to find answers on AHIP examinations. Well, I would like to tell everyone what the answer to every AHIP exam question is:
  1. Read the material!
It's as simple as that. All the answers and how to study them are there. To help, you could take notes, make flash cards, use the provided study guide, etc., which are all basic study skills. Trying to avoid reading the material is not only lazy, but deceitful, and rather defeats the purpose of the AHIP courses and exams: to educate people about the American insurance system, especially targeted for those people who work in the system. Now why would you want to cheat your way through that? Isn't the system broken enough? Do you really need to contribute to it by cheating on a simple test?

Now, if you're reading this and you have an exam coming up, turn off the screen, pick up the book, and start reading.

    Sunday, October 24, 2010

    2010 Goals Revisited

    Earlier this year, I wrote about goals for 2010. Here are the goals I documented:
    • Complete all tasks as assigned for HEDIS 2011
    • Submit HEDIS 2010 measures to NCQA
    • Complete any post-HEDIS analyses
    • Complete an internal leadership course
    • Coordinate two projects to completion
    • Complete another AHIP course
    • Complete another SAS course (advanced macros or programming 3)
    • Share SAS tools (e.g., macros, autoexecs) with other users
    Obviously, these goals were very tied to my previous position at the local health insurance company, Dean Health Plan. Since then, I have accepted a new position at a clinical practice organization, the UW Medical Foundation, so my goals had to change significantly. I'm still in the process of familiarization, but I have completed several projects already. So what should my goals look like? Here's an attempt at a revision:
    • Complete all tasks related to assigned quality-of-care measures for submission to Wisconsin Collaborative for Healthcare Quality (WCHQ)
    • Complete any ad-hoc analyses
    • Automate and update assigned production reports and processes (e.g., bulk emails)
    • SAS: Document setup; organize user group to share knowledge, processes, and macros; and implement security procedures for stored Oracle passwords
    • Provide support for other projects as needed
    • Familiarize with organization structure, including existing process/data/knowledge silos, and begin the communication process to reduce such silos
    I have already completed some of these goals, including a submission to WCHQ, ad-hoc requests, automating several reports/processes, and the SAS list. Next year, I should be sufficiently familiar with my position and the organization to have a more in-depth understanding of what I can help the organization with aside from my assigned duties.

    Sunday, October 17, 2010

    The Serial Comma

    This morning I was wandering through Wikipedia when I stumbled on "The Oxford Comma". I looked it up, and realized I had read about it before - the serial comma: the final comma that is followed by an and or an or, which is controversial in whether it should be used. In reading the arguments for and against, I realized that one argument for the usage was left out, and that much of the ambiguity in using it or not using it seem to be related to inconsistent noun usage. Let me explain.

    The argument for the serial comma that I would like to add is for those people who convert our human languages into computer languages. It is much clearer what is desired of a computer when all commas are specified, for example: XYQ report needs names, jobs and titles. Does that mean two distinct fields: name and job/title; or three distinct fields: name, job, and title. Clarification is necessary, and at that point the original communication regarding the need would have been less useful.

    One of the examples of ambiguity on the Wikipedia article was the following: They went to Oregon with Betty, a maid, and a cook. To a programmer, this statement mixes different fields up. The origin of the issue is not using a serial comma, but mixing Names with Jobs. In a database, there would two fields: Names and Jobs. No one would set up a database mixing the two because it would cause much confusion and conflict (e.g., if you find someone's name but the field is already occupied by their title, where do you put the name?), and language should follow the clarity of such a database structure.

    That is to say that the original statement should use all names, all jobs, or both. For example: They went to Oregon with Betty, a nurse; Jenny, a maid; and Jim, a cook. Or: They went to Oregon with Betty, a maid, and Jim, a cook. Or: They went to Oregon with Betty, who is both the maid and cook. These statements are clearly about three people, two people, and one person, respectively. The original statement was confusing because of the mix of descriptions: Names and Jobs.

    Back to the first part: In actual code, it is necessary to separate items in a list with commas every time. (Of course, there usually isn't an and separating items...) I wrote a query in SAS using spaces to separate items and then passed it to Oracle, but Oracle generated an error. Oracle required the commas, whereas SAS implies the separation of items by spaces alone. For example: I need the names of people who do the following jobs: journalist, lawyer, and accountant; so I would write the following criteria (let's ignore the possible issue of case-sensitivity):

    where job in ('Journalist', 'Lawyer', 'Accountant')

    Each item requires the comma separator. Now had the report required the names of people who eat eggs, toast and jam, I would be confused. Would that be 'eggs', 'toast and jam' or 'eggs', 'toast', 'jam'? A better way to say it, whichever way was meant would be: eggs, toast, and jam; or eggs, and toast with jam. I would have to figure out whether the database recorded 'toast with jam' or 'toast and jam' or some other variant ('jammed toast'?), but either revision would be much clearer.

    In the end, if the serial comma creates confusion, revise the statement altogether; otherwise, use the serial comma!

    Saturday, September 25, 2010

    Thursday, August 12, 2010

    CheckLog: A Utility for Reviewing the SAS Log

    At my previous job, I worked on a SAS program that was intended to be run by someone who did not know SAS. So I needed a utility to tell the user whether the program completed successfully. The final result was a macro called CheckLog that checks a specified log, directory of logs, or the current log for error, warning, invalid, and other messages related to issues in a SAS program.

    In order to accomplish this, I first needed a way to export the SAS log to a file so I could read it back in as a SAS data set and search for the terms and phrases associated with issues in the SAS program. Fortunately, there was already a utility available at work that exported the log to a file. The statement that exports the file is a simple DM statement, for example:

    dm log "file 'C:\Directory\File.log' replace;" wpgm;

    The next step required reading in the log into a data set. Initially, I used the import procedure (i.e., proc import) to import the text file into SAS. However, I needed to specify a delimiter that would not actually delimit the file. I wanted the file to be one large column. So I looked through the SAS font and found a character not common in English, the cedilla ( ¸ ). This character is also not usually found alone, even in languages that use it (like French). At least, I hope it isn't!

    The last part is a continuing effort - identify and search for words and phrases associated with issues. The keywords were easy: error, warning, invalid, and uninitialized. The phrases, however, are elusive and open to interpretation. Sometimes phrases like "the data set has 0 observations" may be intended, and therefore should not be searched for. On the other hand, after completing an import, a data set with 0 observations is probably not intended. This type of issue requires the programmer to identify the problem.

    Otherwise, the CheckLog macro can identify many common issues of varying levels of importance. Issues like the statement "numeric values have been converted to character values" or the statement "the query requires remerging summary statistics back with the original data" should be identified and resolved to avoid unintended consequences.

    The macro includes several options. First, the macro can review a specified log, a directory of logs, or the current SAS log. As long as the file ends with ".log", it can be reviewed with this macro. Second, To enhance reviewing non-SAS logs, I added an argument to add additional keywords, like the word "caution" or "alert". Users could implement user-specified issues (instead of using put statements with the word ERROR or WARNING).

    Third, the output can be renamed, with a default of "Log_issues". (When reviewing multiple logs from a directory, this option does not take effect, and the output is named "Logs_w_issues".) Fourth, an option to change the behavior of the pop-up message: always, never, and only when issues are found. Finally, an option to abort the currently executing SAS program if an issue is discovered. This allows the user to run code in production and end it prematurely if issues arise, so the code does not continue to execute with issues.

    Readers interested in the macro can join a user group (see below) hosted by Google Groups to download the macro, view documentation, and receive emails when I updated the code. And please, send feedback! I would like to know if the macro works well and whether it checks for all of the issues users require.



    CheckLog Site

    CheckLog User Group

    Description:

    This group is a forum for the users of the SAS CheckLog macro to receive updates, ask questions, and post feedback. The CheckLog macro checks the SAS log(s) for issues, including lines with error, warning, invalid, or uninitialized messages. Additionally, other phrases associated with issues are checked, and specific phrases are ignored. The macro can also be used with non-SAS logs, as long as the log uses the same issue keywords.

    Subscribe by Email:

    Saturday, July 3, 2010

    New Transitions

    I have been working with an insurance company for almost two years, and I primarily worked with insurance claims to evaluate the effectiveness of care for our members and to discover patterns in care. Last week I accepted a new position with a physician clinical practice organization. The new position will provide experience on the other side of the health care industry, working with data from the doctor's office rather than the insurance company.

    My wife, Kyra, is also looking for a new job. She's been having a rough time at her current child care center with the way it's being run. Last weekend she started submitting applications, and she's already had two interviews. She hopes to have a new job very soon, we hope with a daycare center where Luca can enroll and Kyra can seek state teaching certification. One day she would like to teach in an elementary school.

    My son, Luca, has been growing rapidly. He's very talkative and he really seems to know what he wants. He enjoys going to school and visiting his friends. On the weekends, he's been taking swimming lessons and he loves the water! A bit too much actually--he really wants to swim on his own, but I'm sure he'd sink like a rock! Soon he will be two, and we hope to have a big birthday party for him.

    So we're all undergoing changes. It may be a turbulent summer, but I hope we all end up a little older, a little wiser, and a little happier with these new transitions.

    Friday, May 7, 2010

    Open Last Table in SAS

    I've been trying to find a way to open the last table created in SAS by using a keyboard shortcut. It's taken a while and many online searches to find it, but I finally figured out a good way to do it. I created a macro and set the macro to a keyboard shortcut. Here's the entire macro:

    %macro OpenTable(table=&syslast) / des="Open a table";

    dm "vt %sysfunc(compress(&table))" vt;

    %mend OpenTable;

    Set the macro to a keyboard shortcut by typing the following code into the keyboard shortcut editor window (F9):

    gsubmit '%opentable;'

    By default, the macro opens the last table created, and the argument can be modified for any table.

    I'm so glad I found a way to do this! This should save a lot of time!

    Update:

    I added more to the macro code in case the table doesn't exist. Here's the new code:

    %macro OpenTable(table=&syslast) / des="Open a table";

    /* Check if table exists */
    %if %sysfunc(exist(&table))=1 %then %do;

    dm "vt %sysfunc(compress(&table))" vt;

    %end;

    /* Otherwise pop-up a message that it does not exist. */
    %else %do;

    dm 'postmessage "The specified table does not exist."';

    %end;

    %mend OpenTable;

    Update Update:

    I've developed a rather complex macro now that does the same thing:

    OpenTable.sas

    Sunday, April 25, 2010

    Electronic Task Management

    I have a lot of things to do, and sometimes I have trouble remembering it all. At home, I use my computer to do remember and remind me of many tasks. At work, I use a combination of paper and the computer. Since documents from my PC or the network are not always available, it is still useful to retain a copy of certain tasks on paper. Nonetheless, I still use a few computer tools, at home and work, to help remember all of these tasks and make task management easier.

    My wife and I planned our wedding using a number of Google's online office applications, including Docs, Calendar, and Notebook. We also used RememberTheMilk (RTM), an online task management application. Managing our tasks online provided the opportunity to travel and retain access to our tasks, as well as keep an eye on tasks while at work. Gmail and Microsoft Outlook also provide some useful tools for managing tasks.

    For our wedding, my wife and I kept a few documents for the wedding in Google Docs, including the guest list and a service provider comparison spreadsheet. In Google Notebook, we had song lists, service providers and costs, a long to do list, and all sorts of ideas in a shared notebook. (Unfortunately, Notebook is not longer supported, so I transferred our notes to Google Docs and have been using that application since.) For specific projects at work (for example, HEDIS), I keep a task list in an electronic document, and I usually archive the tasks as I go forward, keeping newer items at the top.

    My wife and I also used RememberTheMilk for managing tasks. I used this quite a bit and shared to-do items with my wife. We went back and forth between our to-do list in Notebook, which was a long-term list, and RTM, which was a short-term list. I still use RememberTheMilk for short- and moderate-term tasks, and Google Docs for long-term tasks. RTM, Google Calendar, and Outlook's task feature are useful for scheduling a task with a reminder and a specific due date. Calendar was also useful for sharing events with my wife as well as managing our to-do list and making appointments.

    I associate many tasks with emails. Using Gmail at home and Microsoft Outlook at work, I flag specific emails with varying levels of priority. Gmail has a "lab" feature that enables various flags or "stars" that users can associate with anything. I have flags for immediate tasks, "important" tasks (due soon), "assigned" tasks (due later), items to read or review, and items to monitor. Gmail also has a Task list feature. I have not used this feature extensively, since I have been using RememberTheMilk for some time, and it appears that RTM has more features (e.g., scheduling tasks, associating a task with a URL).

    I hope these tips and strategies are useful to someone out there. If you have any novel and efficient ways of managing tasks, feel free to share them in a comment!

    Tuesday, February 9, 2010

    Checking for Issues in SAS

    I've been working on a macro program to check the SAS log for specific "issue" keywords, including "error", "warning", "invalid", and "uninitialized". Typically these are associated with issues in the program. I'm considering adding the following statements as well:
    • "The query requires remerging summary statistics back with the original data"
    • "Numeric values have been converted to character values"
    • "Character values have been converted to numeric values"
    The above statements may not always be associated with issues; however, there are better ways to write the program then to allow these statements to occur. For example, if the programmer wants to set a character variable to the text value of a numeric variable, it is better to use a put statement then to allow SAS to do it, as it may convert it incorrectly. Here's an example:

    data _null_;
        today=today();
        call symput('today',today);
    run;
    %put NOTE: Today is &today;

    The example sets today's date as a macro variable called today. However, the output is just a number. Depending on how the macro variable is used, this may be okay. Here's a better way to write it:

    data _null_;
        today=today();
        call symput('today',compress(put(today,8.)));
    run;
    %put NOTE: The date value of today is &today;

    Or, even simpler:

    data _null_;
        today=today();
        call symputx('today',today);
    run;
    %put NOTE: The date value of today is &today;

    Adding the "x" to the call symput statement will automatically set the numeric variable to character and remove spaces.

    If the programmer actually intends to write out the date in a date format, then the following code will work. (Note that the date format can be whatever format desired. I like the YYMMDDN8 format since it sorts better.)

    data _null_;
        today=today();
        call symput('today',put(today,yymmddn8.));
    run;
    %put NOTE: Today is &today;

    The macro program I've written can identify these types of issues so they can be corrected. I've also recently discovered that other SAS users have created such log checking utilities, and they include more phrases that would indicate issues within various procedures that I do not use frequently. Once I have time to review these statements, I will include them in my program as well.

    In addition to identifying these issues, I'm filtering out common issues that occur with the above keywords that are probably not associated with issues in the program. For example, a libname error from an autoexec program may not be an error for the program if it is not used. If it is used, there will be subsequent errors that would identify the issue.

    This type of non-issue occurs at work frequently. We have a generic autoexec that runs when SAS is started, and it includes libnames that are located in directories I do not have the security rights to view. Therefore, every time I start SAS there are errors in the log. When I check the log for issues, I do not want these generic issues to appear.

    How do you check for issues in a SAS program? Do you have a utility for doing so? What do you check for?

    Saturday, January 30, 2010

    Goals for 2010

    At work, upper management set corporate and division goals, and asked everyone to submit personal goals that align with the corporate and division goals. Here are my official goals:
    • Complete all tasks as assigned for HEDIS 2011
    • Submit HEDIS 2010 measures to NCQA
    • Complete any post-HEDIS analyses
    • Complete an internal leadership course
    • Coordinate two projects to completion
    In addition, I have these goals:
    • Complete another AHIP course
    • Complete another SAS course (advanced macros or programming 3)
    • Share SAS tools (e.g., macros, autoexecs) with other users
    I would really like to increase the communication between SAS users at work, so we can share processes, tips and tricks, macros, and programming methodologies. In part, this would enhance my skills as a SAS programmer, and it would also help make our SAS programs more standardized, increasing consistency, efficiency, and competitive edge.

    What goals do you have for 2010?