aiorazabala / qmethod

R package to analyse Q methodology data
GNU General Public License v2.0
34 stars 17 forks source link

Flagging Q-sorts with negative loading #376

Closed jeppebundsgaard closed 1 year ago

jeppebundsgaard commented 1 year ago

When a Q-sort loads negatively to a high degree it is flagged at that factor. Example (revision of the example in qflag()):

data(lipset)
library(psych)
loa <- unclass(principal(lipset[[1]], nfactors = 3,
               rotate = "varimax")$loadings)
loa
flagged <- qflag(loa = loa, nstat = nrow(lipset[[1]]))
flagged
        RC2         RC1         RC3

US1 0.19090031 0.76583098 -0.16829944 US2 -0.06552370 0.82578471 0.10674419 US3 0.81073850 -0.01642114 -0.09294327 US4 0.77564922 0.22983558 0.27115532 JP5 -0.83345268 0.15438190 0.02554101 CA6 0.14605752 -0.18452178 0.88487489 UK7 0.14131112 -0.34862230 0.73900317 US8 -0.08906645 0.66252588 -0.17048799 FR9 0.20377209 -0.18284105 -0.44813857

flag_f1 flag_f2 flag_f3 US1 FALSE TRUE FALSE US2 FALSE TRUE FALSE US3 TRUE FALSE FALSE US4 TRUE FALSE FALSE JP5 TRUE FALSE FALSE CA6 FALSE FALSE TRUE UK7 FALSE FALSE TRUE US8 FALSE TRUE FALSE FR9 FALSE FALSE TRUE

JPS is flagged as factor 1, even though it is loading negatively to that factor. Isn't that an error? I think it is solved by simply removing abs() in qflag: Change

 while (n <= nqsorts) {
      flagged[n, f] <- loa_sq[n, f] > (rowSums(loa_sq)[[n]] - 
        loa_sq[n, f]) & abs(loa[n, f]) > thold.05
      n <- n + 1
    }

to

 while (n <= nqsorts) {
      flagged[n, f] <- loa_sq[n, f] > (rowSums(loa_sq)[[n]] - 
        loa_sq[n, f]) & loa[n, f] > thold.05
      n <- n + 1
    }
jeppebundsgaard commented 1 year ago

And to avoid flagging more than one factor, and to take care of negative loadings, I would suggest flagged[n, f] <- loa_sq[n, f] > max(loa_sq[n,-f]) & loa[n, f] > thold.05

aiorazabala commented 1 year ago

Thank you very much for the feedback.

No, this is not an error.

Please refer to Brown (1980), page 23 and relevant explanations (https://qmethod.org/1980/01/08/brown-1980-political-subjectivity/). In a nutshell, respondents with negative factor loadings take a diametrically opposite view in that factor (which is different of course, to taking an unrelated view). These should be reversed prior to estimation of scores.

See the automatic flagging criteria on page 165 in this other document https://journal.r-project.org/archive/2014-2/zabala.pdf These criteria, as outlined in Brown and used in other main Q analysis software, look at absolute magnitude of the loadings, not at the signs, hence the abs() is necessary.

The automatic pre-flagging sould always be inspected manually (and I appreciate that a reminding note here could be useful for the uninformed user --> #378 ). In many cases, this will be left as is. But in others, such as when there is a flagged negative loading, then manual flagging needs to be done. For manual flagging (i.e. in this case, invert Q-sort loadings), see one way of doing it in 'qmethod' for R, here: http://aiorazabala.github.io/qmethod/Advanced-analysis


Regarding flagging more than one factor, Have you experienced this? (either with 'qmethod' or with other software). As far as I recall from when I coded this in 2014, mathematically the criteria would not yield more than one flag for a given Q-sort.

jeppebundsgaard commented 1 year ago

Thank you for clarifying that!

I would suggest giving a warning of some kind when some of the flags are set based on negative loading. I do accept the logic behind Browns statement, but I am not sure it will always be the case that a negative score is the same as a diametrically opposite view. Given the forced choice format, you could be very much in line with one factor, and then the remaining items would probably load negatively on the other factors. Anyways, I think it would be nice to give the user the option to not flag respondents with negative loading on a factor.

aiorazabala commented 1 year ago

Thank you. The latest version of the package now reminds users that they should inspect the flags, when flagged Q-sorts have negative loadings, as per #378 Users can always choose not to flag respondents or to change flags in any other ways, by changing the flags manually (example code in http://aiorazabala.github.io/qmethod/Advanced-analysis ).