LEGACY CONTENT. If you are looking for Voteview.com, PLEASE CLICK HERE

This site is an archived version of Voteview.com archived from University of Georgia on May 23, 2017. This point-in-time capture includes all files publicly linked on Voteview.com at that time. We provide access to this content as a service to ensure that past users of Voteview.com have access to historical files. This content will remain online until at least January 1st, 2018. UCLA provides no warranty or guarantee of access to these files.

POLS 6386 MEASUREMENT THEORY
Sixth Assignment
Due 11 March 2003


  1. The aim of this problem is for you to get some practice visualizing eigenvectors. Download the following R Program:

    R Program to Perform SVD on Bivariate Normal

    Below is a listing of the program and the graph that it creates:
    #
    #  Program to Illustrate Singular Value Decomposition
    #
    #      Draws n points from bivariate normal distribution
    #         and draws graph of points along with the 
    #         Singular Vectors
    #
    nrow <- 1000
    ncol <- 2
    #
    #  Create Variance-Covariance Matrix
    #
    #         1.0  0.9
    #         0.9  1.0
    #
    Sigma <- matrix(c(1,.9,.9,1),2,2)
    #
    #  Call Bivariate Normal with zero mean and 
    #   Sigma Var-Cov Matrix, Place in X
    #
    X <- mvrnorm(n=nrow,rep(0,2),Sigma)
    #
    #  Perform Singular Value Decomposition
    #
    xsvd <- svd(X)
    #
    #  The Two Lines Below Put the Singular Values in a
    #    Diagonal Matrix -- The first one creates an 
    #    identity matrix and the second command puts
    #    the singular values on the diagonal
    #
    Lambda <- diag(ncol)
    diag(Lambda) <- xsvd$d
    #
    #  Compute U*LAMBDA*V' for check below
    #
    XX <- xsvd$u %*% Lambda %*% t(xsvd$v)
    #
    #  Do basic plot with two line title
    #
    #
    plot(X[,1],X[,2],asp=1,xlab="First Dimension",ylab="Second Dimension",xlim=c(-3,3),ylim=c(-3,3),col="blue")
    mtext(side=3,line=1.5,"Bivariate Normal Random Draw: Correlation = .9 \nEigenvectors Shown in Red",font=2)
    #
    #  Draw arrows for the Singular Vectors -- To make the
    #   plot look good, set the length of the first
    #   singular vector = 2.5, and the second singular
    #   vector = (LAMBDA_2/LAMBDA_1)*2.5.  This preserves
    #   the ratio of the first two singular values and
    #   graphs the singular vectors in terms of their
    #   importance.
    #
    rat11 <- 2.5
    rat22 <- (sqrt(xsvd$d[2])/sqrt(xsvd$d[1]))*rat11
    sval1 <- xsvd$v[1,1]*rat11
    sval2 <- xsvd$v[2,1]*rat11
    arrows(0.0, 0.0,sval1,sval2,length=0.1,lwd=3,col="red")
    sval1 <- xsvd$v[1,2]*rat22
    sval2 <- xsvd$v[2,2]*rat22
    arrows(0.0, 0.0, sval1, sval2,length=0.1,lwd=3,col="red")
    #
    #  Rotate Matrix to its Principle Axes and Decompose it Again
    #
    YY <- XX %*% xsvd$v
    ysvd <- svd(YY)
    #
    #  These Two Lines draw arrows for the Singular Vectors --
    #    They will point along the first and second axes
    #
    arrows(0.0, 0.0, ysvd$v[1,1], ysvd$v[2,1],length=0.1,lwd=3,col="black")
    arrows(0.0, 0.0, ysvd$v[1,2], ysvd$v[2,2],length=0.1,lwd=3,col="black")
    #
    #
    # Compute Fit of SVD -- This is just the sum of squared
    #  error -- Note that ssesvd should be zero!
    #
    #
    i <- 0
    j <- 0
    ssesvd <- 0
    while (i < nrow) {
      i <- i + 1
      j <- 0
      while (j < ncol) {
         j <- j + 1
         ssesvd <- ssesvd + (X[i,j] - XX[i,j])**2
      }
    }
    


    In order for the program to run you will have to load in the MASS package. To do this click on "Packages" on the toolbar and then select "Load Package". You will get a simple drop down list. Highlight "MASS" and click "OK".

    1. Reproduce the graph above and report the measure of fit -- ssesvd. Note that your graph will not look exactly the same since R is drawing randomly! If the arrows do not show up well in black and white simply change col="red" to col="black" in the arrows(...) command. You can also increase the thickness of the arrows by increasing lwd=3 to lwd=4 or lwd=5.

    2. Use Epsilon to change the correlation to -0.9, 0.5, and 0.0, respectively, and turn in all the graphs. Be sure that you change the titles appropriately!

    3. For each of the above graphs, after you print out the graph, at the R prompt type:
      
      plot(YY[,1],YY[,2],asp=1,xlab="Rotated First Dimension",ylab="Rotated Second Dimension",xlim=c(-3,3),ylim=c(-3,3),pch=16,col="blue")
      mtext(side=3,line=1.5,"Bivariate Normal Random Draw:  Correlation = .9 \nConfiguration Rotated to Principle Axes",font=2)
      Turn in these graphs as well with the appropriate titles.

  2. The aim of this problem is to familarize you with the Aldrich-McKelvey scaling program. Download the program and the 1968 data and "control card" files:

    Aldrich-McKelvey scaling program

    1968 NES Data

    Urban Unrest Control Card File

    Vietnam Control Card File

    and place them in the same folder on a WINTEL machine. Read the Aldrich-McKelvey scaling program page to see how to run the program.

    Here are the first three lines of OLS68A.DAT.
    
     1681  0 10  1  1  1  1  1 63  4  4  5  7  1  2  2  3  7  1  1
     1124  0 10  1  0  0  0  1 82  1  1  4  4  1  1  1  1  4  1  5
       78  5 10  1  0  1  1  1 78  2  1  5  7  4  5  5  6  6  7  5
    
    The variables, in order, are:
    
        RESPONDENT ID      = unique 4 digit number
        PARTY ID           = 0 to 6 -- 0 = Strong Democrat
                                       1 = Weak Democrat
                                       2 = Lean Democrat
                                       3 = Independent
                                       4 = Lean Republican
                                       5 = Weak Republican
                                       6 = Strong Republican
        RAW INCOME         = **do not use**
        FAMILY INCOME      = income quintile 1 - 5
        SEX                = 0 Man, 1 Woman
        RACE               = 0 White, 1 Black
        SOUTH              = 0 North, 1 South
        EDUCATION          = 1 High School or less, 2 Some College, 3 College
        AGE                = In Years
        URBAN UNREST SCALE = Johnson, Humphrey, Nixon, Wallace, Self-Placement
        VIETNAM SCALE      = Johnson, Humphrey, Nixon, Wallace, Self-Placement
        VOTED              = 1 Voted, 5 Did Not Vote
    
    1. Run the Aldrich-McKelvey scaling procedure using both the urban unrest and vietnam files. Save the coordinate output files. Graph the scaled stimuli coordinates against each other using R -- that is, use the Vietnam coordinates as the horizontal axis and the Urban Unrest coordinates as the vertical axis. Use the names of the candidates and label the graph and the axes appropriately. Why do you think the plot looks the way it does?

    2. Use Epsilon to merge the party ID variable from OLS68A.DAT into the coordinate output file. For example, here are the first few lines of the coordinate output file for the urban unrest scale:
      
       LINE #  CASE # R POS   ALPHA    BETA    SCALED POS     RSQ
            1   1681   1.0   -2.6243    0.5249   -2.0994    0.9994    0.9997
            2   1124   1.0   -0.8831    0.3532   -0.5298    0.6790    0.8240
            3     78   4.0   -0.9588    0.2557    0.0639    0.8992    0.9483
            4    553   4.0   -1.2302    0.2895   -0.0724    0.6460    0.8037
      The second column is the respondent ID number. Use the respondent ID number to match OLS68A.DAT with the output file and insert the party ID code into the output file. After you have inserted the party code you can delete all the columns except the party code, BETA (you will need that for graphing), and the Scaled Position. If you have done everything correctly the first few lines of your file should look like this:
      
        0     0.5249   -2.0994
        0     0.3532   -0.5298
        5     0.2557    0.0639
        1     0.2895   -0.0724
        1     0.2763    0.6907
        1     1.3930   -0.3482
        0     1.0597   -0.5298
        0     0.2322   -0.3482
        0     0.4371   -0.8742
        5     0.3901    0.6827
        0     0.0033    0.0050
        0     0.2119   -0.5298
        1     0.2624    0.2624
        2     0.2938   -0.5142
        1     0.2745    0.1373
             etc.
             etc.
             etc.
      Turn in the Epsilon macro you write that inserts the party variable into the coordinate file. In the macro, use a split screen and place the coordinate file in the top screen and OLS68A.DAT in the bottom screen.

    3. Read the above file into R and make smoothed histograms of the scaled positions of the respondents by party ID. To do this, read the file with the command:

      T <- matrix(scan("D:/R_Files/uuheck_1.txt",0),ncol=3,byrow=TRUE)

      To make a smoothed histogram of just the strong democrats:
      
      strong.democrat <- T[T[,1]==0 & T[,2] > 0,3]  This selects only the strong
                                                    Democrats with Postive Betas From
                                                    the 3rd column of T
      plot(density(strong.democrat),xlab="Scaled Value Urban Unrest",main="Strong Democrat",xlim=c(-3,3),type="l",lwd=3)
                                                    This does the smoothed histogram.
                                                    Note that type="l" is "l" as in Line not
                                                    the number "1"!!!
      To make a similar plot for all Democrats with Positive Betas you have to define the variable with:
      
      all.democrat <- T[(T[,1]==0 | T[,1]==1 | T[,1]==2) & T[,2] > 0,3]
                                 If party is 0 or 1 or 2 AND Beta is Positive,
                                 Select column 3
      To make the smoothed histogram simply change the arguments in the plot command above.

      To make a smoothed histogram of both the strong Democrats and the strong Republicans use the commands:
      
      plot(density(strong.democrat),xlab="Scaled Value Urban Unrest",main="Strong Party Identifiers",xlim=c(-3,3),type="l",lwd=3,col="red")
      lines(density(strong.republican),lwd=3,col="blue")  This is the trick to get
                                                          a second line in the plot! 
      text(1,1.3,"Red = Strong Democrats\nBlue = Strong Republicans") This puts in
                                                                      a simple legend
      Make smoothed histograms showing strong Democrats and strong Republicans, all Democrats and all Republicans, Independents by themselves, and strong Democrats, strong Republicans, and Independents. Also report the number, mean, and standard deviation for each variable you graph (put them in a nice, neat table!!). To get the number simply use the "length" command; for example:

      ndem <- length(strong.democrat)

      Recall that the commands to get the mean and standard deviation of a variable in R are simply mean(..) and sd(..), respectively.

    4. Replicate (c) with the Vietnam Scale.

  3. The aim of this problem is to familarize you with my Optimal Classification (OC) program. Download the program and the "control card" file:

    Maximum Classification Scaling Program

    Control Card File

    107th Senate Roll Call Data

    and place them in the same folder on a WINTEL machine. PERFSTRT.DAT looks like this:
    
    SEN107KH.ORD
    NON-PARAMETRIC MULTIDIMENSIONAL UNFOLDING OF 107TH SENATE
        1  633   20   36   10
    (36A1,3900I1)
    (I5,1X,36A1,2I5,50F8.3)
    The first line is the roll call data file, the second line is the title, the third line, in order, is the number of dimensions, the number of roll calls, the number of iterations (leave as is), the number of "characters" to read off the front of each legislator's record (leave as is), and the record number of a Senator that you believe is on the "Left" (this just sets "liberal" on the left -- lower ranks or negative values on the first dimension if the scaling is in two or more dimensions -- and "conservative" on the right). The last line is the format for the coordinate output file.

    1. At the command line type

      PERFL

      The program should only take a few seconds to run and it produces three output files -- PERF21.DAT, PERF23.DAT, and PERF25.DAT. Turn in a copy of PERF21.DAT. It should look something like this:
      
       21 FEBRUARY  2003  13.59.33.79.
       RANDOM NUMBER SEED    116300
      SEN107KH.ORD                                                    
      NON-PARAMETRIC MULTIDIMENSIONAL UNFOLDING OF 107TH SENATE                       
          1  633   20   36   10
      (36A1,3900I1)                                                   
      (I5,1X,36A1,2I5,50F8.3)                                         
       ******************************************************************************
        1 ROLL CALLS   1    4102   48745  0.08415  0.91585  0.73739
        2 LEGISLATORS  1    4044   48745  0.08296  0.91704  0.74110  0.99787
        3 ROLL CALLS   1    3995   48745  0.08196  0.91804  0.74424
        4 LEGISLATORS  1    3981   48745  0.08167  0.91833  0.74513  0.99903
        5 ROLL CALLS   1    3953   48745  0.08110  0.91890  0.74693
        6 LEGISLATORS  1    3946   48745  0.08095  0.91905  0.74738  0.99922
        7 ROLL CALLS   1    3935   48745  0.08073  0.91927  0.74808
        8 LEGISLATORS  1    3935   48745  0.08073  0.91927  0.74808  0.99996
        9 ROLL CALLS   1    3931   48745  0.08064  0.91936  0.74834
       10 LEGISLATORS  1    3932   48745  0.08066  0.91934  0.74827  0.99999
                            13.59.33.92.
       ELAPSED TIME OF JOB  13.59.36.06.
      The sixth column reports the correct classification. For the 107th Senate the algorithm quickly converges to 0.91934 (91.9%).

    2. The file PERF25.DAT contains the output coordinates for the Senators and the roll calls. In one dimension, this is reported as a rank ordering. The first part of the file shows the Senators in rank order and then in the order that they appear in the roll call file with their ranking:
      
       21 FEBRUARY  2003  14.05.20.15.
          1 1074930925 0WISCONS 10001FEINGOLD      75  498   0.849   1.000
          2 1074010133 0MINNESO 10001DAYTON        19  486   0.961   2.000
          3 1074010412 0NEW JER 10001CORZINE       33  495   0.933   3.000
          4 1074910133 0MINNESO 10011WELLSTONE      6  484   0.988   4.000
          5 1071501171 0CALIFOR 10001BOXER         23  481   0.952   5.000
          6 1071303952 0MARYLAN 10001SARBANES      14  498   0.972   6.500
          7 10729142 5 0RHODE I 10001REED          22  497   0.956   6.500
          8 10710808 3 0MASSACH 10001KENNEDY, ED   25  480   0.948   8.000
          9 1071502121 0ILLINOI 10001DURBIN        24  496   0.952   9.000
         10 1071423031 0IOWA    10001HARKIN        29  488   0.941  10.000
         11 10714213 1 0CONNECT 10001DODD          25  483   0.948  11.000
                       etc.
                       etc.
                       etc.
        100 1071490853 0OKLAHOM 20001NICKLES, DO   30  495   0.939 100.000
        101 1071462849 0TEXAS   20001GRAMM, PHIL   24  480   0.950 101.000
        102 1071542961 0ARIZONA 20001KYL           25  495   0.949 102.000
       ******************************************************************************
          1 1079991099 0USA     200  BUSH           2   63   0.968  70.500
          2 1074970041 0ALABAMA 20001SESSIONS      54  481   0.888  65.000
          3 1079465941 0ALABAMA 20001SHELBY        55  488   0.887  63.500
          4 1071490781 0ALASKA  20001MURKOWSKI     26  459   0.943  70.500
          5 1071210981 0ALASKA  20001STEVENS       27  452   0.940  62.000
          6 1071542961 0ARIZONA 20001KYL           25  495   0.949 102.000
          7 1071503961 0ARIZONA 20001MCCAIN       124  478   0.741  57.000
          8 1072930642 0ARKANSA 20001HUTCHINSON,   47  484   0.903  66.000
          9 1072930542 0ARKANSA 10001LINCOLN       33  495   0.933  47.000
         10 1071501171 0CALIFOR 10001BOXER         23  481   0.952   5.000
                     etc.
                     etc.
      
      Use Epsilon to combine the rank ordering of the Senators with the W-NOMINATE coordinates and the KYST coordinates you estimated for Homework 3 Q.2. Read the combined file into R and compute the correlations between the rank ordering with the first dimension of W-NOMINATE, the first dimension of the KYST two dimensional coordinates, and the KYST one dimensional coordinates. Graph the rank ordering (horizontal axis) against the first dimension of W-NOMINATE with the appropriate titles and labels and graph the rank ordering (horizontal axis) against the first dimension of the two-dimensional KYST coordinates with the appropriate titles and labels.

    3. The file PERF23.DAT has some miscellaneous diagnostics for the program including the eigenvalues of the double-centered agreement score matrix. Here is the relevant portion of the file:
      
                  etc.
                  etc.
       PERFORMANCE INDEX EIGENVALUE/VECTOR ROUTINE=    1  102    0     0
         1    9.1091   70.3239   70.3239   11.4572   57.7452   57.7452
         2    0.2922    2.2557   72.5796    0.7181    3.6190   61.3642
         3    0.2525    1.9493   74.5289    0.4965    2.5023   63.8665
         4    0.1772    1.3683   75.8973    0.3837    1.9337   65.8002
         5    0.1557    1.2019   77.0992    0.3225    1.6256   67.4258
         6    0.1430    1.1040   78.2032    0.2785    1.4038   68.8296
         7    0.1300    1.0040   79.2071    0.2561    1.2906   70.1203
         8    0.1068    0.8245   80.0317    0.2247    1.1327   71.2530
         9    0.0918    0.7090   80.7407    0.1989    1.0023   72.2553
        10    0.0783    0.6041   81.3448    0.1915    0.9650   73.2203
        11    0.0752    0.5806   81.9254    0.1813    0.9138   74.1341
        12    0.0684    0.5280   82.4534    0.1648    0.8306   74.9647
        13    0.0654    0.5049   82.9582    0.1565    0.7889   75.7537
        14    0.0583    0.4503   83.4086    0.1531    0.7714   76.5251
        15    0.0562    0.4336   83.8422    0.1435    0.7232   77.2483
        16    0.0500    0.3857   84.2279    0.1412    0.7118   77.9600
        17    0.0468    0.3614   84.5893    0.1402    0.7066   78.6667
        18    0.0441    0.3405   84.9298    0.1333    0.6719   79.3385
        19    0.0407    0.3146   85.2444    0.1293    0.6519   79.9904
        20    0.0388    0.2999   85.5443    0.1216    0.6129   80.6032
                    etc.
                    etc.
      The second column with a first entry of 9.1091 are the eigenvalues. Make a graph of the eigenvalues like the one you did for Homework 3 Q.2.

    4. Use Epsilon to change the number of dimensions from 1 to 2 in PERFSTRT.DAT and run PERFL again (be sure to save the output files from the one-dimensional run first!!!! -- they will be overwritten by the new ones!). PERF21.DAT should look something like this:
      
       21 FEBRUARY  2003  14.54.27.96.
       RANDOM NUMBER SEED     87600
      SEN107KH.ORD                                                    
      NON-PARAMETRIC MULTIDIMENSIONAL UNFOLDING OF 107TH SENATE       
          2  633   20   36   10
      (36A1,3900I1)                                                   
      (I5,1X,36A1,2I5,50F8.3)                                         
       ******************************************************************************
        1 ROLL CALLS   2    3723   48745  0.07638  0.92362  0.76165           0.00000
          LEGISLATORS  2    3654   48745  0.07496  0.92504  0.76607  0.00000
        2 ROLL CALLS   2    3594   48745  0.07373  0.92627  0.76991           0.99244
          LEGISLATORS  2    3574   48745  0.07332  0.92668  0.77119  0.99799
        3 ROLL CALLS   2    3552   48745  0.07287  0.92713  0.77260           0.99702
          LEGISLATORS  2    3546   48745  0.07275  0.92725  0.77298  0.99808
        4 ROLL CALLS   2    3540   48745  0.07262  0.92738  0.77337           0.99653
          LEGISLATORS  2    3539   48745  0.07260  0.92740  0.77343  0.99991
        5 ROLL CALLS   2    3534   48745  0.07250  0.92750  0.77375           0.99849
          LEGISLATORS  2    3533   48745  0.07248  0.92752  0.77382  0.99995
        6 ROLL CALLS   2    3531   48745  0.07244  0.92756  0.77394           0.99821
          LEGISLATORS  2    3531   48745  0.07244  0.92756  0.77394  0.99985
        7 ROLL CALLS   2    3528   48745  0.07238  0.92762  0.77414           0.99989
          LEGISLATORS  2    3527   48745  0.07236  0.92764  0.77420  0.99955
        8 ROLL CALLS   2    3525   48745  0.07232  0.92768  0.77433           0.99918
          LEGISLATORS  2    3525   48745  0.07232  0.92768  0.77433  0.99999
        9 ROLL CALLS   2    3524   48745  0.07229  0.92771  0.77439           0.99882
          LEGISLATORS  2    3524   48745  0.07229  0.92771  0.77439  0.99999
       10 ROLL CALLS   2    3524   48745  0.07229  0.92771  0.77439           0.99867
          LEGISLATORS  2    3524   48745  0.07229  0.92771  0.77439  1.00000
       11 ROLL CALLS   2    3523   48745  0.07227  0.92773  0.77446           0.99994
          LEGISLATORS  2    3523   48745  0.07227  0.92773  0.77446  1.00000
       12 ROLL CALLS   2    3523   48745  0.07227  0.92773  0.77446           0.99910
          LEGISLATORS  2    3523   48745  0.07227  0.92773  0.77446  1.00000
       13 ROLL CALLS   2    3522   48745  0.07225  0.92775  0.77452           0.99808
          LEGISLATORS  2    3522   48745  0.07225  0.92775  0.77452  1.00000
       14 ROLL CALLS   2    3521   48745  0.07223  0.92777  0.77458           0.99778
          LEGISLATORS  2    3521   48745  0.07223  0.92777  0.77458  1.00000
       15 ROLL CALLS   2    3521   48745  0.07223  0.92777  0.77458           0.99715
          LEGISLATORS  2    3524   48745  0.07229  0.92771  0.77439  1.00000
       16 ROLL CALLS   2    3521   48745  0.07223  0.92777  0.77458           0.99721
          LEGISLATORS  2    3521   48745  0.07223  0.92777  0.77458  1.00000
       17 ROLL CALLS   2    3521   48745  0.07223  0.92777  0.77458           0.99768
          LEGISLATORS  2    3521   48745  0.07223  0.92777  0.77458  1.00000
       18 ROLL CALLS   2    3521   48745  0.07223  0.92777  0.77458           0.99691
          LEGISLATORS  2    3520   48745  0.07221  0.92779  0.77465  0.99999
       19 ROLL CALLS   2    3520   48745  0.07221  0.92779  0.77465           0.99727
          LEGISLATORS  2    3520   48745  0.07221  0.92779  0.77465  0.99999
       20 ROLL CALLS   2    3434   48745  0.07045  0.92955  0.78015           0.99401
          LEGISLATORS  2    3431   48745  0.07039  0.92961  0.78035  0.99948
       MEAN VOLUME LEG.   0.0047   0.0068   3.6961   6.7777  -0.0264
       MACHINE PREC.   2    3430   48745   0.07037   0.92963
                            14.54.28.01.
       ELAPSED TIME OF JOB  14.56.17.40.
      The correct classification is now 92.963% (0.92963). The first few lines of PERF25.DAT should look very similar to this:
      
       21 FEBRUARY  2003  14.54.27.96.
          1 1079991099 0USA     200  BUSH           1   63   0.984   0.063   0.208   0.280
          2 1074970041 0ALABAMA 20001SESSIONS      50  481   0.896   0.002   0.224  -0.178
          3 1079465941 0ALABAMA 20001SHELBY        44  488   0.910   0.007   0.181   0.200
          4 1071490781 0ALASKA  20001MURKOWSKI     21  459   0.954   0.004   0.198   0.140
          5 1071210981 0ALASKA  20001STEVENS       32  452   0.929   0.003   0.177   0.157
          6 1071542961 0ARIZONA 20001KYL           23  495   0.954   0.002   0.285  -0.359
          7 1071503961 0ARIZONA 20001MCCAIN        62  478   0.870   0.002   0.130  -0.665
          8 1072930642 0ARKANSA 20001HUTCHINSON,   45  484   0.907   0.012   0.199   0.187
          9 1072930542 0ARKANSA 10001LINCOLN       27  495   0.945   0.002  -0.112   0.327
         10 1071501171 0CALIFOR 10001BOXER         22  481   0.954   0.012  -0.275  -0.115
      The last two columns are the two-dimensional coordinates. Make a two-dimensional plot of the coordinates using R. Use the names of the Senators and label the axes and the plot appropriately.

    5. Make a two-dimensional plot of the 107th Senate with "D" representing non-Southern Democrats, "S" representing Southern Democrats, "R" representing Republicans, and "P" representing President Bush. You can modify my R program:

      R Program to Plot 107th Senate
      Data For R Program to Plot 107th Senate

      to do this. Note that you will have to add a line to the program to display the "P" for President Bush. Be sure to correctly label the graph.