홀짝 일관성 지표의 개념에서 더 나아가, 무작위 하위 척도 쌍(randomly drawn halves of subscales)을 활용하여 개인 신뢰도(individual reliability)를 더욱 정확하게 측정하는 방법이 있다. 이것이 바로 재표집된 개인 신뢰도(RIR)이며, 하위 척도 쌍의 선택이 무작위로 이루어진다는 것이 주요한 특징이다(Curran, 2016)¹. 예를 들어, 6개 항목 척도의 경우 항목 1, 4 및 5가 하나의 하위 척도에 속하고 항목 2, 3 및 6이 두 번째 하위 척도에 속할 수 있다. 이 접근의 기본 가정은 나뉜 하위 척도의 구성에 본질적으로 고유한 것이 없기 때문에 무작위로 선택된 하위 척도에서 유사한 점수가 생성된다는 점이며, 이러한 RIR 지수를 계산함으로써 불성실 응답을 탐지할 수 있다(Curran, 2016). 이 기법은 홀짝 일관성 지표와 마찬가지로 다른 응답자들의 결과에 따른 영향을 받지 않기에 대부분의 응답자가 성실할 것이라는 가정이 전제되지 않더라도 적용될 수 있다. 또, 홀짝 일관성 지표와 달리 하위 척도가 홀수 개수의 문항을 가진 경우에도 사용될 수 있다. 상관관계를 계산하는 단계에서 하나의 문항은 여전히 누락될 것이나 무선적 재표집 과정의 반복을 통해 특정 문항이 반드시 제외될 것이라고 기대되지 않기 때문이다. 한편, 일반적으로 사용되는 cutoff 점수는 .30이다.
한편, 홀짝 일관성 지표와 마찬가지로 동일한 잠재 구성 개념을 측정하는 문항들은 개인 내에서 정적으로 상관된다는 전제에서 출발하는 기법으로 전체 설문이 개별적인 독립된 문항들로 구성된 설문에서는 적절하지 않다.
Bevans et al(2020)²의 연구에서 사용된 함수를 활용하여 분석하였다. 사용자 지정 함수로 지정해야 할 함수는 resampledConsistency <- function(df, scaleLookup, iterations = 100, columns = NULL)
이며, 해당 함수를 사용하기 위해서는 함수에 대한 설명을 입력 및 실행해줘야 한다. 입력해야 할 내용은 다음과 같다.
resampledConsistency <- function(df, scaleLookup, iterations = 100, columns = NULL) {
#기본적으로 iteration은 100으로 설정됨. Columns를 통해 RIR이 실행될 열을 특정할 수 있음.
if(!is.null(columns)) df <- df[, columns]
#is.null() 함수를 통해 df에서 선택된 columns들만을 이용해 다시 df를 정의함.
scales <- unique(scaleLookup[[1]])
#scaleLookup의 첫번째 요소를 선택하여 고유한 것들만 추출하여 scales에 할당함.
out <- c()
for(i in 1:nrow(df)) {
progress <- round(seq(nrow(df) / 20, nrow(df), length.out = 20))
if(i %in% progress) print(paste0(round(100 * i / nrow(df)), "% complete"))
cors <- c()
for(n in 1:iterations) {
a <- c()
b <- c()
for(k in 1:length(scales)) {
values <- as.numeric(df[i, names(df) %in% scaleLookup[[2]][scaleLookup[[1]] %in% scales[k]]])
#i행에서 scale[k]에 해당하는 항목의 값을 숫자형으로 저장한 ‘values’ 벡터를 생성함.
index <- 1:length(values)
#1부터 values벡터의 길이 만큼의 정수 시퀀스를 index라는 벡터에 저장.
index.a <- sample(index, floor(length(index)) / 2, replace = F)
index.b <- index[!index %in% index.a]
#index에서 절반은 index.a벡터에, index.a에 없는 절반은 index.b 벡터에 저장.
a[k] <- mean(values[index.a], na.rm = T)
b[k] <- mean(values[index.b], na.rm = T)
#values 벡터에서 index.a/b에 해당하는 값들을 선택해 평균을 계산함.
}
cors[n] <- cor(a, b)
}
out[i] <- mean(cors)
}
return(out)
}
위와 같은 내용을 입력 및 실행하게 되면 function이 생성되므로 이후에는 function 실행문인 resampledConsistency <- function(df, scaleLookup, iterations = 100, columns = NULL)
만 입력하여 사용하면 된다. 하지만 홀짝 일관성 지표와 마찬가지로 미리 정리해야 한다. 사용할 데이터의 첫 행이 단순한 문항 번호(ex. 1,2~50)가 아닌 ‘요인+번호’ 형태로 정리되어야 하는데 예를 들어 A요인을 측정하는 5개 문항은 ‘A1’부터 ‘A5’의 형태로 정리할 수 있다. 단, 요인 별로 문항들을 모아서 정렬할 필요는 없다.
또한 다른 데이터 파일로 scaleLookup
파일을 만들어야 한다. 코드 내에 매개변수로 입력될 해당 파일은 두 열로 만들어야 하며, 첫번째 열에는 요인을 순서대로 나열하고 두번째 열에는 요인 별 문항 이름을 나열해야 한다. 엑셀에 입력하여 해당 파일을 만든 예시는 아래 이미지와 같다.
실제 데이터로 분석 시의 과정과 결과를 예시를 통해 설명하고자 한다. 1번 데이터의 Big5 성격 측정 척도 50문항을 역코딩한 자료를 사용했다. R 매뉴얼에서 설명한 것처럼, 사용 전 데이터를 정리하였다. 사용할 데이터의 첫 행을 단순한 문항 번호(ex. 1,2~50)가 아닌 ‘요인+번호’ 형태로 정리했는데, 우리의 데이터는 외향성(EX), 원만성(AG), 성실성(CO), 정서적 안정성(NE), 경험에 대한 개방성(OP)의 5개 요인으로 이루어져 있어 EX1, AG1, CO1 …(이하 생략) 과 같은 형태로 행을 전개하였다. 또한 다른 데이터 파일로 scaleLookup파일 또한 따로 만들었다. 해당 파일은 두 열로 이루어져 있으며 첫번째 열에는 요인을 순서대로 나열하고 두번째 열에는 요인 별 문항 이름을 나열하였다. 실제로 적용해본 코드와 그에 따른 결과는 다음과 같다.
big5_RiRval <- resampledConsistency(big5_RIR, big5_scalelookup, iterations=100, columns =NULL )
id | big5_RiRval |
---|---|
1389 | -0.9534726 |
1622 | -0.913135 |
538 | -0.9069854 |
47 | -0.8732586 |
… | |
620 | 0.29832755 |
1293 | 0.29859532 |
1908 | 0.29986225 |
963 | 0.30057446 |
662 | 0.30117713 |
… | |
708 | 0.97776706 |
522 | 0.98007822 |
1 | N/A |
2 | N/A |
3 | N/A |
71 | N/A |
85 | N/A |
246 | N/A |
369 | N/A |
427 | N/A |
432 | N/A |
566 | N/A |
573 | N/A |
(N/A값 이하 생략) |
위에서 설명한 사용자 지정 함수를 입력해두었다면 간단한 코드 한 줄로 재표집된 개인 신뢰도를 구할 수 있다. 재표집된 개인 신뢰도 분석에서 주의할 점은 매 시행마다 무작위 추출이 진행되기에 그 결과가 계속 바뀔 수 있다는 점이다. 또, 무작위 추출 과정에서는 한쪽 응답 열이 모두 같은 값으로 정해질 경우 상관 관계가 계산되지 않아 위 결과처럼 결측치가 발생할 수 있다. 이는 여러 번의 코드 실행을 통해 응답자들의 결과 양상을 확인하는 것이 신중히 불성실 응답을 탐지하는 방법일 수 있음을 시사한다. 위 결과는 최초 시행 결과로 0.3의 이하의 값을 보여 불성실 응답으로 탐지된 응답자는 409명으로 전체 응답자 수의 약 16.19%였다.