Reliability fails with 0 cases as each case has missing values by design
I tried to use the SPSS Reliability procedure to calculate intraclass correlations (ICCs) for a set of four raters. Each rater actually rated only a subset of the cases so that each subject was rated by only two of the four raters. Many of the possible rater pairings were observed across the subjects. There is a variable in the data set for each rater, so each subject has missing values on two of the four variables that was input to the Reliability procedure. When I ran the Reliability procedure with these 4 variables, the procedure returned the error message:
"There are too few cases (N = 0) for the analysis. This command is not executed."
How can I get Reliability to run with the two valid ratings for each case, given that these ratings are spread over four variables?
Resolving the problem
If you compress the two valid values for each subject into two new variables, you could use the two new variables as inputs to Reliabilty so that each case would have full data. The rater represented by each variable would now vary across subjects, so you would need to choose a 1-way random ICC model in Reliability. See Technote 1493847 for directions to an article that explains the ICC model choices.
Here is the command syntax to compress the 4 rating variables into 2 complete variables, followed by the Reliability command. For this example, the original variables are YRATE1 to YRATE4. (Once you create the two new variables, you could run Reliability from the menu system. Creating the new variables would be very unwieldy in the menu system and the following syntax commands are recommended for that process.)
* Yrate1 to yrate2 should have exactly 2 valid and 2 missing responses for each case
* with cases varying as to which responses are valid.
* This missing pattern is by design .
* The point of the commands is to copy the 2 valid values to 2 new variables,
* yrater1 and yrater2 , to be used by reliability (which uses listwise deletion).
* yrater1 and yrater2 are initialized to sysmis to work around a bug that involves uninitiated variables
* (i.e. variables that are never assigned a value for a case).
* These commands will fill in yrater1 and yrater2 only if there are exactly 2 valid responses in
* yrate1 to yrate4 .
* Int1 will equal 2 for cases with values copied to yrater1 and yrater2; 0 otherwise .
vector yrater (2).
DO REPEAT y = yrater1 to yrater2.
compute y = $sysmis .
compute int1 = 0.
do if nvalid(yrate1, yrate2, yrate3, yrate4) = 2.
do repeat yold = yrate1 yrate2 yrate3 yrate4.
do if not(missing(yold)).
compute int1 = int1 + 1.
compute yrater(int1) = yold.
/ICC=MODEL(ONEWAY) CIN=95 TESTVAL=0 .
The VECTOR command in the above syntax creates a set of new variables called YRATER1 and YRATER2. The number in parentheses indicates the length of the vector. Having created these variables with a VECTOR command, you can refer to variables in the vector with a subscript , as in yrater(int1) (where int1 will have been assigned a number 1 or 2), until the Execute command or a procedure (like Reliability ) is encountered. After the Execute command, the new variables are still in the active data file, but you can't refer to them as if they were a vector, i.e. with a subscript.
Suppose that you did not want to limit the transformations to cases with exactly 2 valid values in YRATE1 to YRATE4. The commands below will copy the first 2 valid values in YRATE1 to YRATE4 over to WRATER1 and WRATER2. If there is a single valid value among the 4 inputs, that will be copied to WRATER1. Of course, cases that are missing on either WRATER1 or WRATER2 will be omitted from a Reliability analysis of those variables.
* Do not limit transformations to cases with exactly 2 valid values in yrate1 to yrate4 .
* The new variables are named wrater1 and wrater2 .
* If there is only one valid value in yrate1 to yrate4, that value is copied to wrater1.
* If there are 3 or 4 valid values in yrate1 to yrate4, the first 2 valid values are copied to wrater1, wrater2 .
* If there are no valid values in yrate1 to yrate4, both wrater1 and wrater2 are sysmis.
* int2 will equal 2 if there are 2 or more valid values in yrate1 to yrate4; 1, if 1 valid value; 0, otherwise .
vector wrater (2).
DO REPEAT w = wrater1 to wrater2.
compute w = $sysmis .
compute int2 = 0.
do repeat wold = yrate1 yrate2 yrate3 yrate4.
do if (not(missing(wold)) & int2 < 2).
compute int2 = int2 + 1.
compute wrater(int2) = wold.
/ICC=MODEL(ONEWAY) CIN=95 TESTVAL=0 .
Note that a case which had only one valid value among the four original variables would be missing on one of the two new variables and would still be omitted from the reliability analysis. If a case actually had three or four valid values in the original four variables, then the first two valid values would be copied over to the two new variables. The condition "int2 < 2" in the DO IF command prevents an attempt to copy a third or fourth value to the 2-item WRATER vector. Without this additional condition, each case with 3 or 4 valid values in YRATE1 to YRATE4 would trigger one or two warnings, respectively, in the output that there had been an attempt to store a value into an element of the vector with an invalid subscript