Galaxy notebook

Created 3 Oct 2013 • Last modified 14 Aug 2017

Initial theorizing

Basic goal

To learn about the organization of sexual preferences. In a nutshell, what sexual preferences tend to appear together within individuals?

  • How well does the gay–straight dichotomy fare empirically? What about the gay–straight–bi trichotomy?
  • Are gay men naturally divided into tops and bottoms?
  • Are BDSMers naturally divided into tops and bottoms?
  • Are straight men naturally divided into breast men and buttocks men (and leg men)?
  • How do various odd fetishes relate to each other?

Finally, while it would be nice to know how orientation identity relates to these things, I'm afraid that asking about it will induce artificial consistency between identity and preferences. This is all going to be self-report, after all, at least to begin with.

What is a sexual preference?

I've already felt a lot of skepticism about whether people have stable underlying situation-independent preferences in an economic sense (see, e.g., Ariely, Loewenstein, & Prelec, 2006). Since sexual affect is characteristically capricious, it stands to reason I should be even more skeptical of the idea of sexual preferences.

Backing up a bit, what are sexual preferences supposed to mean for behavior? How can we construe them as behavior patterns? Well, like all preferences, they should guide decisions, but decisions about what? Three domains come to mind:

  • Partner choice. "Homosexuality" ought to mean you're more likely to sexually and romantically pursue people of the same gender than the opposite gender.
    • A danger here is that we can expect people to have different partner ideals for stable relationships, for one-night stands, and for various kinds of nonsexual relationships.
    • Also, we need to be careful to include partner preferences that people have no intention of acting upon; for example, men committed to straightness finding some other men attractive. If we ask about partner preferences in a way that clearly has to do with actual partner choice (e.g., "Would you have sex with this person?"), we're going to miss these kinds of sexual attraction. Which would be bad, because that sort of thing is one of the main potential problems with the lay trichotomy. "Do you find this person sexually attractive?" is from this perspective a better question.
  • Activity choice. If you like fellatio better than coitus, you'll try to get the former more than the latter. You could certainly aim for partners with whom your preferred activities are more feasible, either because of the partner's anatomy or the partner's preferences, and indeed the main point of many fetish communities is to connect people with matching activity preferences. Usually, however, I don't think people's mate choices are driven by interest in particular activities. However much people argue that men only date women for the sex, they tend not to believe it's for a particular sexual activity. Nobody thinks most men would date men and women indiscriminately if only it weren't that they liked vaginal sex so much. On the contrary, if memory serves, most men prefer fellatio to coitus, and yet we don't see them trolling Grindr.
  • Pornography choice. When I think about it, it isn't at all clear how people's interest in seeing different things in porn relates to what they actually want to do to whom. Which, of course, makes its importance in the grand scheme of things pretty suspect.

Perhaps, then, I should try to distinguish partner preferences and activity preferences, and I should consider their interrelations as one of the chief empirical questions about sexual preferences.

A unified approach

Now, what is sexual attraction? "Patterns of partner choice" doesn't seem to suffice, because, as mentioned above, I want to allow for the possibility that people have sexual attraction they don't act on. What consequences does such sexual attraction have for behavior, then? Most importantly, in my mind, sexual attraction is what is theorized to underlie effects of sexual stimuli on non-sexual behavior, such as inspecting brassieres making men impatient (Van den Bergh, Dewitte, & Warlop, 2008). But those effects are way too indirect to define sexual attraction.

Here is another idea. Sexual attraction is people's activity-choice patterns in bizarre hypothetical situations in which they are incentivized to choose according to maximum sexual pleasure independently of other considerations, emotional or practical (e.g., "I will torture this kitten until you orgasm; pick your porn"; notice that I'm now construing porn consumption as a kind of activity). Okay, maybe that's the wrong kind of situation, considering that wanting and liking are distinct: we can't expect people to be great affective forecasters for sexual experiences any more than they are for anything else. But, surely there is some situation or combination of situations that would reveal certain activity-choice patterns independently of such other factors as people's desire to see themselves as heterosexual.

Now we can finally sort of begin to unify partner preferences, activity preferences, and porn preferences. For, in a sufficiently concrete hypothetical, people are necessarily choosing between composite stimuli (e.g., crush-fetish porn either includes female or male performers, and every performer has a hairstyle, so hairstyle could be a factor in choosing or not choosing a piece of crush porn). Different dimensions of sexual preference (e.g., hair color) are cashed out in how different dimensions of the stimuli influence choice.

This line of thinking naturally suggests a task of the following form. Subjects are asked how much they would like to do each of a big list of things, with appropriate qualifiers to ensure that subjects discount practical considerations, their wish to maintain a sexual identity, and so on; ideally, only sexual attraction should determine decisions.

  • Items related to partner preferences are of the form "Have sex with [type of person]"; the person type can be, for example, "a person who's taller than you". It should be emphasized to subjects a priori that the phrase "have sex" includes any sexual activity.
  • Items related to activity preferences are just a name or description of the activity.
  • Items related to porn preferences (if we wanted to include porn preferences) are of the form "Watch [pornography type]" or "Masturbate to [pornography type]" or something.

It would be wise to give subjects optional opportunities to mention things that are important to them but we didn't list, including qualifiers (e.g., if we have only one item about group sex, subjects could say they find some kinds of group sex a lot more attractive than others).

Kinds of preferences to consider

  • very general themes
    • the partner's sexual arousal or interest
    • dominating or submitting to the partner
    • rape
    • (surely there are others worth including)
  • general activity categories (N.B. it is generally necessary to consider asymmetric roles in partnered activities separately)
    • coitus
    • anal copulation
    • oral sex (fellatio, cunnilingus, anilingus)
    • masturbation (solo or partnered)
    • frottage
    • kissing
    • hugging
    • group sex
    • misc. fetish stuff
    • sexual talk (might be fruitfully subdivided into, e.g., demeaning talk and compliments)
    • nonverbal vocalizations (moaning, etc.)
  • features of the partner
    • (We probably won't have enough detail to precisely relate this stuff to the ev-psych research regarding the details of appearance preferences, such as waist-to-hip ratio. We will not be asking people for ideal measurements.)
    • body-part variables (some of which are traditionally associated with romance rather than sex, but presumably they're still related to sexual attraction)
      • relating to genitals
        • vulva appearance
        • penis size
        • pubic hair
      • buttocks shape and size
      • breast size
      • chest muscularity
      • leg hair
      • foot size
      • eye color
      • hairstyle and hair color
    • body shapes
      • hourglass shape (waist-to-hip ratio?)
      • weight
      • height
      • muscularity
      • amputation
    • demographics
      • gender and sex (including transsexualism and transgenderism)
      • ethnicity
      • age
      • profession
      • paranormality
    • vaguer characteristics such as status, personality, etc. (although many of these probably relate more to what people want in a long-term partner than to sexual attraction)
  • porn preferences: just include some major categories of porn, but also text (e.g., romance novels)

Instrument outline

  • Demographics
    • gender ("Male", "Female", or "Other")
    • age
    • race / ethnicity
  • Preferences
  • Room for free-response qualifiers or additions?
  • Externalizing / antisociality (How do rape or other criminal sexual interests relate to the externalizing?)
    • drug use <-
    • impulsivity <-
    • condom use / safe sex <-
  • Number of sex partners in the past year ("12 months") (split by gender)
  • Sexual-orientation identity
  • [say, two repeats from preferences]
  • "How honest were you able to be?" or so

Subject filtering

bad.s = with(sb, row.names(sb)[
    minutes < 7 |
    honest < 4 |
    (abs(retest.fellatio_to) >= 3 & abs(retest.friend) >= 3)])
bad.s = c(bad.s,
  "s1209")
  # s1209 said "In the very first question I answered the questions
  # as to my own gender incorrectly. I am FEMALE, not Male." I've
  # corrected sb$gender appropriately in data.R, but the subject
  # was still asked the wrong preferences questions.
good.s = setdiff(row.names(sb), bad.s)
ggood.s = intersect(good.s,
    row.names(ss(sb, gender %in% qw(Male, Female))))
prefs.g = ss(prefs, char(s) %in% good.s)
prefwide = prefwide.all[good.s,]
1
  value
  1
c("Total N" = nrow(sb), Included = length(good.s),
  Percent = round(100 * length(good.s)/nrow(sb)))
  value
Total N 1001
Included 936
Percent 94

Basic results

d = aggregate(pref ~ item, prefs.g, function(x) table(factor(x, levels = 1:7)))
d = data.frame(
    median = tapply(prefs.g$pref, prefs.g$item, median),
    d$pref)
d[order(-tapply(prefs.g$pref, prefs.g$item, mean)),]
  median X1 X2 X3 X4 X5 X6 X7
desired 7 6 2 2 11 22 85 808
pleasure_to 7 4 1 2 22 43 91 773
in_rship 7 7 1 2 23 41 120 742
love 7 2 3 7 30 49 97 748
intimacy 7 6 3 6 38 49 127 707
coitus_m 7 18 3 2 5 10 43 384
fellatio_rec 7 7 4 4 25 21 61 343
coitus_f 7 19 5 5 13 11 49 357
kiss 7 5 5 17 76 94 158 581
mast_rec_f 7 13 5 11 34 32 62 302
persity_oh 7 10 5 14 93 136 205 473
persity_ah 7 15 4 12 103 120 191 491
semen_to_mouth 7 23 7 11 36 37 75 276
semen_to_vag 7 33 16 9 23 34 50 300
persity_nl 6 9 3 14 137 142 212 419
mast_rec_m 6 9 10 11 51 76 89 219
persity_eh 6 12 13 22 132 135 218 404
cunn_rec 7 27 17 17 44 27 49 278
persity_ch 6 12 9 20 149 154 207 385
hug 6 16 37 66 179 104 113 421
bnip_to 6 56 25 26 79 71 104 309
mast_solo_f 6 29 20 23 73 50 74 190
underwear 6 32 22 44 121 94 112 245
porn_visual 6 55 35 43 149 148 182 324
rebel 5 75 34 43 164 167 154 299
porn_video_mf 5 75 44 53 167 154 172 271
woman 7 192 56 23 71 34 62 498
porn_written 5 67 61 62 186 151 128 281
bnip_rec 6 76 57 52 89 47 90 259
roleplay 5 42 29 63 150 114 105 167
mast_solo_m 5 19 19 42 120 93 83 89
rich 5 72 50 65 225 143 129 252
semen_rec_vag 5 81 21 25 65 46 44 177
experienced 5 72 47 100 198 157 147 215
woman_fem 6 232 40 30 72 52 108 402
analpen_to_f 5 68 29 44 58 56 52 158
mast_to_f 6 215 43 35 84 89 106 364
persity_el 4 49 57 97 266 154 121 192
porn_video_ff 5 170 53 70 130 108 128 277
semen_to_anus 5 89 39 29 58 36 64 150
breasts_big 5 222 51 52 107 82 122 300
cunn_to 5 262 40 36 86 83 112 317
friend 4 152 75 90 206 115 118 180
control_rec 4 159 99 97 159 99 126 197
group_sex 4 205 69 82 152 96 107 225
man 5 369 39 22 28 23 47 408
virgin 4 170 84 92 204 82 107 197
voyeur_known 4 190 89 86 156 114 104 197
control_to 4 146 99 122 196 115 103 155
butt_big 4 170 109 113 181 107 83 173
bondage_rec 4 213 86 98 154 103 97 185
bondage_to 4 191 97 89 195 105 97 162
man_mas 4 415 21 25 49 43 97 286
voyeur_secret 4 249 101 90 144 93 98 161
objpen_to 4 279 61 82 162 103 94 155
recent_acq 4 229 105 99 162 121 84 136
breasts_small 4 266 75 78 197 101 93 126
stranger 4 265 90 84 174 100 92 131
exhibit 4 193 59 80 118 68 56 96
mast_to_m 3 381 60 39 94 71 100 191
persity_ol 3 153 149 171 231 107 51 74
persity_cl 4 175 146 140 249 107 57 62
fellatio_to 3 412 44 49 84 72 78 197
butt_small 3 181 117 174 252 94 52 66
penis_big 3 401 39 53 100 78 97 168
objpen_rec 3 362 70 68 127 77 76 156
leather 3 279 137 127 180 88 63 62
feet_small 3 261 109 128 287 73 40 38
anil_rec 2 455 107 62 100 55 62 95
feet_big 2 331 161 147 177 43 39 38
insult_to 2 425 125 96 103 66 56 65
insult_rec 2 435 117 96 108 72 46 62
persity_al 2 380 159 131 120 64 28 54
anil_to_f 1 533 90 59 68 52 50 84
semen_rec_mouth 1 571 54 55 70 28 60 98
persity_nh 2 363 191 163 116 49 24 30
pain_rec 2 451 154 88 95 69 39 40
woman_mas 2 457 129 110 115 55 36 34
semen_swallow 1 575 68 54 64 51 32 92
analpen_rec 1 581 75 53 71 50 36 70
porn_video_mm 1 584 83 53 67 34 41 74
feet 1 492 157 111 79 33 20 44
pain_to 1 515 138 85 104 43 16 35
semen_rec_anus 1 642 66 44 62 36 27 59
woman_trans 1 608 91 52 82 29 32 42
man_fem 1 601 93 64 81 34 29 34
penis_small 1 589 132 99 78 25 7 6
man_trans 1 671 84 40 70 24 24 23
urine_to 1 732 58 40 37 20 26 23
uncon 1 711 84 35 52 21 13 20
analpen_to_m 1 372 26 14 23 8 5 17
anil_to_m 1 755 56 31 28 17 20 29
rape_rec 1 739 57 41 47 20 15 17
urine_rec 1 767 41 31 37 24 15 21
age_70 1 704 106 62 38 12 8 6
rape_to 1 806 57 19 19 12 11 12
incest 1 822 33 27 32 8 7 7
age_14 1 831 38 27 17 7 3 13
age_08 1 906 16 2 6 1 3 2

Mean absolute deviations from the median:

round(d = 1, sort(dec = T, sapply(prefwide, function(v)
    mean(abs(v - median(v, na.rm = T)), na.rm = T))))
  value
man 2.7
man_mas 2.6
mast_to_m 2.3
fellatio_to 2.3
cunn_to 2.2
penis_big 2.2
woman_fem 2.1
breasts_big 2.1
mast_to_f 2.1
objpen_rec 2.1
semen_to_anus 2.0
woman 2.0
semen_rec_vag 2.0
group_sex 1.9
voyeur_secret 1.9
objpen_to 1.9
porn_video_ff 1.9
bondage_rec 1.9
analpen_to_f 1.9
voyeur_known 1.9
bnip_rec 1.9
exhibit 1.9
stranger 1.9
control_rec 1.8
recent_acq 1.8
breasts_small 1.8
virgin 1.8
bondage_to 1.8
butt_big 1.7
anil_rec 1.7
friend 1.7
control_to 1.6
leather 1.6
insult_to 1.6
insult_rec 1.6
porn_written 1.6
rich 1.5
porn_video_mf 1.5
rebel 1.5
experienced 1.5
bnip_to 1.5
mast_solo_f 1.5
anil_to_f 1.5
semen_rec_mouth 1.5
persity_cl 1.5
roleplay 1.4
persity_ol 1.4
underwear 1.4
butt_small 1.4
feet_small 1.4
persity_el 1.4
persity_al 1.4
porn_visual 1.4
hug 1.4
feet_big 1.4
pain_rec 1.4
semen_swallow 1.4
woman_mas 1.4
mast_solo_m 1.3
analpen_rec 1.3
porn_video_mm 1.3
persity_nh 1.2
cunn_rec 1.2
feet 1.2
pain_to 1.2
mast_rec_m 1.1
semen_to_vag 1.1
persity_ch 1.1
persity_eh 1.0
semen_rec_anus 1.0
woman_trans 1.0
semen_to_mouth 1.0
man_fem 1.0
persity_nl 1.0
persity_ah 1.0
persity_oh 1.0
mast_rec_f 0.8
penis_small 0.8
man_trans 0.8
kiss 0.7
urine_to 0.6
uncon 0.6
analpen_to_m 0.6
coitus_f 0.6
anil_to_m 0.6
rape_rec 0.6
fellatio_rec 0.6
urine_rec 0.5
age_70 0.5
coitus_m 0.4
intimacy 0.4
love 0.4
rape_to 0.3
in_rship 0.3
incest 0.3
pleasure_to 0.3
age_14 0.3
desired 0.2
age_08 0.1
#dwide.g = ss(dwide, char(s) %in% good.s)
prefwide.ken = cor(prefwide,
    method = "kendall", use = "pairwise.complete.obs")
prefpairs = data.frame(t(combn(pref.items, 2)))
prefpairs$kendall = sapply(1 : nrow(prefpairs), function(i)
    prefwide.ken[char(prefpairs[i, 1]), char(prefpairs[i, 2])])
# prefpairs$kendall = sapply(1 : nrow(prefpairs), function(i) cor(method = "kendall",
#      prefwide[[char(prefpairs[i, 1])]],
#      prefwide[[char(prefpairs[i, 2])]]))

Greatest-magnitude Kendall correlations:

transform(ss(ordf(prefpairs, -abs(kendall)), abs(kendall) >= .5),
    kendall = round(kendall, 2))
  X1 X2 kendall
3369 semen_rec_mouth semen_swallow 0.85
4553 man man_mas 0.82
549 analpen_to_m man 0.79
4642 woman woman_fem 0.77
4301 penis_big man_mas 0.76
763 fellatio_to mast_to_m 0.76
942 cunn_to mast_to_f 0.76
4299 penis_big man 0.75
1591 mast_to_f woman 0.74
540 analpen_to_m penis_big 0.73
1424 mast_to_m man 0.73
613 analpen_rec semen_rec_anus 0.72
481 analpen_to_m analpen_rec 0.72
822 fellatio_to man 0.72
2772 urine_to urine_rec 0.71
483 analpen_to_m fellatio_to 0.71
4186 recent_acq stranger 0.71
522 analpen_to_m semen_swallow 0.70
490 analpen_to_m mast_to_m 0.70
1592 mast_to_f woman_fem 0.69
1003 cunn_to woman 0.69
813 fellatio_to penis_big 0.69
530 analpen_to_m porn_video_mm 0.68
1415 mast_to_m penis_big 0.68
519 analpen_to_m semen_rec_mouth 0.67
271 coitus_m woman 0.67
425 analpen_to_f semen_to_anus 0.67
792 fellatio_to semen_rec_mouth 0.67
4366 breasts_big woman 0.67
1004 cunn_to woman_fem 0.65
1426 mast_to_m man_mas 0.65
551 analpen_to_m man_mas 0.65
795 fellatio_to semen_swallow 0.65
4367 breasts_big woman_fem 0.65
824 fellatio_to man_mas 0.65
362 coitus_f man 0.64
541 analpen_to_m penis_small 0.64
4396 breasts_small woman 0.63
4555 man woman -0.62
550 analpen_to_m man_fem 0.61
521 analpen_to_m semen_rec_anus 0.61
1580 mast_to_f breasts_big 0.60
4397 breasts_small woman_fem 0.60
4600 man_mas woman -0.59
1581 mast_to_f breasts_small 0.59
3082 insult_to insult_rec 0.58
1394 mast_to_m semen_rec_mouth 0.58
2301 control_rec bondage_rec 0.57
3368 semen_rec_mouth semen_rec_anus 0.57
993 cunn_to breasts_small 0.57
1397 mast_to_m semen_swallow 0.57
4624 man_trans woman_trans 0.57
4149 friend recent_acq 0.56
3474 semen_rec_anus semen_swallow 0.56
614 analpen_rec semen_swallow 0.56
611 analpen_rec semen_rec_mouth 0.55
1532 mast_to_f bnip_to 0.55
3771 porn_visual porn_video_mf 0.55
4556 man woman_fem -0.55
992 cunn_to breasts_big 0.55
2077 intimacy love 0.55
487 analpen_to_m anil_to_m 0.55
3387 semen_rec_mouth penis_big 0.55
3543 semen_swallow penis_big 0.54
3396 semen_rec_mouth man 0.54
3885 porn_video_ff woman 0.54
1567 mast_to_f porn_video_ff 0.53
979 cunn_to porn_video_ff 0.53
4150 friend stranger 0.53
3949 voyeur_known voyeur_secret 0.53
3552 semen_swallow man 0.53
1815 objpen_rec penis_big 0.52
768 fellatio_to objpen_rec 0.52
575 analpen_rec fellatio_to 0.52
4601 man_mas woman_fem -0.52
1370 mast_to_m objpen_rec 0.52
1824 objpen_rec man 0.51
944 cunn_to bnip_to 0.51
1750 bnip_to woman 0.51
1667 bnip_rec man 0.51
1751 bnip_to woman_fem 0.51
2641 bondage_to bondage_rec 0.50
587 analpen_rec objpen_rec 0.50
2506 pain_to pain_rec 0.50
3886 porn_video_ff woman_fem 0.50
1794 objpen_rec semen_rec_mouth 0.50

Biplots

item.biplot = function(gender, sideways = F)
   {pw = prefwide[sb[row.names(prefwide), "gender"] == gender,]
    items = pref.items[unname(sapply(pref.items, function(pi)
        all(!is.na(pw[pi])) &&
        var(pw[pi]) > 0))]
    pw = pw[,items]
    if (sideways)
        pw = t(pw)
    # Remove constant columns
    pw = pw[, apply(pw, 2, var, na.rm = T) != 0]
    pc = prcomp(pw, center = T, scale. = T)
    pc.scores = as.matrix(pw) %*% pc$rotation
    pc1.scores = pc.scores[,"PC1"] / max(abs(pc.scores[,"PC1"])) * max(abs(pc$rotation[,"PC1"]))
    pc2.scores = pc.scores[,"PC2"] / max(abs(pc.scores[,"PC2"])) * max(abs(pc$rotation[,"PC2"]))
    ggplot() + no.gridlines() +
        geom_segment(aes(xend = pc1.scores, yend = pc2.scores),
            x = 0, y = 0, arrow = arrow(), color = "red", alpha = .1) +
        geom_text(aes(pc$rotation[,"PC1"], pc$rotation[,"PC2"],
           label = rownames(pc$rotation)))}
1
  value
  1
item.biplot("Male")

biplot-male.png

item.biplot("Female")

biplot-female.png

item.biplot("Male", sideways = T)

biplot-sideways-male.png

item.biplot("Female", sideways = T)

biplot-sideways-female.png

Hierarchical clustering

Men

l = go.hclust.kendall.abs("Male")
dat = l[[1]]
items = colnames(dat)
dists = l[[2]]
dists.m = as.matrix(dists)
tree = l[[3]]
1
c(
    "number of subjects" = nrow(dat),
    "number of items" = ncol(dat))
  value
number of subjects 464
number of items 89
plot(tree)

hier-tree-m.png

clustertable = function(k)
   {cuts = cutree(tree, k = k)
    sapply(1 : max(cuts), function(i)
       {vnames = names(cuts[cuts == i])
        mean.abs.cor = sapply(vnames, function(v)
            mean(sapply(setdiff(vnames, v), function(v2)
                1 - dists.m[v, v2])))
        vnames = vnames[order(-mean.abs.cor)]
        cor.with.v1.is.neg = sapply(vnames, function(v)
            cor(dat[[v]], dat[[vnames[1]]], method = "kendall") < 0)
        c(
            sprintf("M %.03f, SD %.03f",
                1 - max(dists.m[vnames, vnames]),
                sdn(dists.m[vnames, vnames])),
            paste0(
                sprintf("%.02f", sort(mean.abs.cor, dec = T)),
                " ",
                ifelse(cor.with.v1.is.neg, "*", ""),
                vnames),
            rep(NA, max(table(cuts)) - sum(cuts == i)))})}
clustertable(2)
  V1 V2
1 M 0.001, SD 0.166 M 0.001, SD 0.211
2 0.24 mast_to_f 0.31 man
3 0.23 porn_video_mf 0.30 semen_swallow
4 0.22 persity_oh 0.30 analpen_to_m
5 0.22 woman_fem 0.30 fellatio_to
6 0.22 persity_eh 0.29 semen_rec_mouth
7 0.21 semen_to_mouth 0.29 analpen_rec
8 0.21 cunn_to 0.29 mast_to_m
9 0.21 coitus_m 0.29 penis_big
10 0.20 recent_acq 0.28 porn_video_mm
11 0.20 mast_rec_m 0.27 semen_rec_anus
12 0.20 pleasure_to 0.26 man_mas
13 0.20 porn_video_ff 0.26 man_fem
14 0.19 porn_visual 0.26 penis_small
15 0.19 friend 0.25 objpen_rec
16 0.19 group_sex 0.24 anil_to_m
17 0.19 voyeur_known 0.23 man_trans
18 0.19 semen_to_vag 0.22 woman_trans
19 0.19 rebel 0.20 urine_rec
20 0.18 analpen_to_f 0.20 rape_rec
21 0.18 stranger 0.19 urine_to
22 0.18 fellatio_rec 0.19 anil_rec
23 0.18 semen_to_anus 0.18 pain_to
24 0.18 woman 0.18 insult_rec
25 0.18 voyeur_secret 0.18 pain_rec
26 0.17 in_rship 0.16 incest
27 0.17 rich 0.16 feet
28 0.17 persity_nl 0.16 control_rec
29 0.17 persity_ch 0.15 bondage_rec
30 0.17 objpen_to 0.15 bondage_to
31 0.16 breasts_big 0.15 leather
32 0.16 desired 0.15 insult_to
33 0.16 experienced 0.15 woman_mas
34 0.15 love 0.15 age_70
35 0.15 persity_ah 0.14 rape_to
36 0.15 virgin 0.14 uncon
37 0.14 porn_written 0.14 control_to
38 0.14 kiss 0.13 feet_big
39 0.14 intimacy 0.13 anil_to_f
40 0.14 butt_big 0.11 age_14
41 0.13 mast_solo_m 0.10 *breasts_small
42 0.11 hug 0.10 butt_small
43   0.10 persity_cl
44   0.10 persity_al
45   0.09 *persity_nh
46   0.08 feet_small
47   0.08 age_08
48   0.08 persity_ol
49   0.07 persity_el

Vaguely, V1 seems a gynophilia cluster and V2 an androphilia cluster.

clustertable(3)
  V1 V2 V3
1 M 0.001, SD 0.166 M 0.086, SD 0.231 M 0.002, SD 0.191
2 0.24 mast_to_f 0.62 man 0.21 pain_to
3 0.23 porn_video_mf 0.60 semen_rec_mouth 0.21 insult_to
4 0.22 persity_oh 0.60 penis_big 0.20 bondage_to
5 0.22 woman_fem 0.60 fellatio_to 0.20 control_to
6 0.22 persity_eh 0.59 semen_swallow 0.20 pain_rec
7 0.21 semen_to_mouth 0.58 analpen_to_m 0.19 insult_rec
8 0.21 cunn_to 0.58 mast_to_m 0.18 urine_to
9 0.21 coitus_m 0.58 analpen_rec 0.18 bondage_rec
10 0.20 recent_acq 0.57 porn_video_mm 0.17 uncon
11 0.20 mast_rec_m 0.56 man_mas 0.17 urine_rec
12 0.20 pleasure_to 0.53 semen_rec_anus 0.17 rape_rec
13 0.20 porn_video_ff 0.52 penis_small 0.16 control_rec
14 0.19 porn_visual 0.51 man_fem 0.16 rape_to
15 0.19 friend 0.44 anil_to_m 0.16 feet
16 0.19 group_sex 0.44 man_trans 0.15 anil_rec
17 0.19 voyeur_known 0.41 objpen_rec 0.15 anil_to_f
18 0.19 semen_to_vag 0.37 woman_trans 0.15 leather
19 0.19 rebel 0.18 age_70 0.15 incest
20 0.18 analpen_to_f 0.16 woman_mas 0.14 persity_al
21 0.18 stranger   0.14 persity_nh
22 0.18 fellatio_rec   0.13 persity_cl
23 0.18 semen_to_anus   0.13 butt_small
24 0.18 woman   0.12 feet_big
25 0.18 voyeur_secret   0.12 breasts_small
26 0.17 in_rship   0.12 feet_small
27 0.17 rich   0.11 age_14
28 0.17 persity_nl   0.10 persity_ol
29 0.17 persity_ch   0.10 age_08
30 0.17 objpen_to   0.09 persity_el
31 0.16 breasts_big    
32 0.16 desired    
33 0.16 experienced    
34 0.15 love    
35 0.15 persity_ah    
36 0.15 virgin    
37 0.14 porn_written    
38 0.14 kiss    
39 0.14 intimacy    
40 0.14 butt_big    
41 0.13 mast_solo_m    
42 0.11 hug    

V2 has broken off a kink or unpleasantness factor V3.

clustertable(4)
  V1 V2 V3 V4
1 M 0.007, SD 0.169 M 0.086, SD 0.231 M 0.002, SD 0.191 M 0.152, SD 0.254
2 0.25 porn_video_mf 0.62 man 0.21 pain_to 0.38 intimacy
3 0.25 semen_to_mouth 0.60 semen_rec_mouth 0.21 insult_to 0.37 love
4 0.23 mast_to_f 0.60 penis_big 0.20 bondage_to 0.36 in_rship
5 0.23 recent_acq 0.60 fellatio_to 0.20 control_to 0.34 pleasure_to
6 0.23 friend 0.59 semen_swallow 0.20 pain_rec 0.33 kiss
7 0.23 porn_video_ff 0.58 analpen_to_m 0.19 insult_rec 0.29 desired
8 0.22 persity_oh 0.58 mast_to_m 0.18 urine_to 0.25 hug
9 0.22 porn_visual 0.58 analpen_rec 0.18 bondage_rec  
10 0.22 group_sex 0.57 porn_video_mm 0.17 uncon  
11 0.22 voyeur_known 0.56 man_mas 0.17 urine_rec  
12 0.22 woman_fem 0.53 semen_rec_anus 0.17 rape_rec  
13 0.21 analpen_to_f 0.52 penis_small 0.16 control_rec  
14 0.21 persity_eh 0.51 man_fem 0.16 rape_to  
15 0.21 rebel 0.44 anil_to_m 0.16 feet  
16 0.21 mast_rec_m 0.44 man_trans 0.15 anil_rec  
17 0.21 semen_to_anus 0.41 objpen_rec 0.15 anil_to_f  
18 0.21 voyeur_secret 0.37 woman_trans 0.15 leather  
19 0.20 stranger 0.18 age_70 0.15 incest  
20 0.20 cunn_to 0.16 woman_mas 0.14 persity_al  
21 0.20 coitus_m   0.14 persity_nh  
22 0.20 fellatio_rec   0.13 persity_cl  
23 0.20 semen_to_vag   0.13 butt_small  
24 0.20 rich   0.12 feet_big  
25 0.19 objpen_to   0.12 breasts_small  
26 0.18 breasts_big   0.12 feet_small  
27 0.17 woman   0.11 age_14  
28 0.17 experienced   0.10 persity_ol  
29 0.17 virgin   0.10 age_08  
30 0.16 porn_written   0.09 persity_el  
31 0.15 persity_nl      
32 0.15 persity_ch      
33 0.15 butt_big      
34 0.14 mast_solo_m      
35 0.12 persity_ah      

V1 has broken off a pleasantness or consent factor V4.

clustertable(5)
  V1 V2 V3 V4 V5
1 M 0.007, SD 0.169 M 0.086, SD 0.231 M 0.019, SD 0.205 M 0.152, SD 0.254 M 0.115, SD 0.254
2 0.25 porn_video_mf 0.62 man 0.27 pain_to 0.38 intimacy 0.28 persity_ol
3 0.25 semen_to_mouth 0.60 semen_rec_mouth 0.25 bondage_to 0.37 love 0.26 persity_cl
4 0.23 mast_to_f 0.60 penis_big 0.25 urine_to 0.36 in_rship 0.24 butt_small
5 0.23 recent_acq 0.60 fellatio_to 0.25 pain_rec 0.34 pleasure_to 0.24 persity_nh
6 0.23 friend 0.59 semen_swallow 0.25 insult_to 0.33 kiss 0.24 persity_el
7 0.23 porn_video_ff 0.58 analpen_to_m 0.24 urine_rec 0.29 desired 0.24 feet_big
8 0.22 persity_oh 0.58 mast_to_m 0.24 control_to 0.25 hug 0.22 persity_al
9 0.22 porn_visual 0.58 analpen_rec 0.24 insult_rec   0.22 feet_small
10 0.22 group_sex 0.57 porn_video_mm 0.22 bondage_rec   0.21 breasts_small
11 0.22 voyeur_known 0.56 man_mas 0.22 rape_rec    
12 0.22 woman_fem 0.53 semen_rec_anus 0.21 uncon    
13 0.21 analpen_to_f 0.52 penis_small 0.21 rape_to    
14 0.21 persity_eh 0.51 man_fem 0.19 control_rec    
15 0.21 rebel 0.44 anil_to_m 0.19 anil_to_f    
16 0.21 mast_rec_m 0.44 man_trans 0.19 anil_rec    
17 0.21 semen_to_anus 0.41 objpen_rec 0.19 incest    
18 0.21 voyeur_secret 0.37 woman_trans 0.19 leather    
19 0.20 stranger 0.18 age_70 0.17 feet    
20 0.20 cunn_to 0.16 woman_mas 0.14 age_14    
21 0.20 coitus_m   0.12 age_08    
22 0.20 fellatio_rec        
23 0.20 semen_to_vag        
24 0.20 rich        
25 0.19 objpen_to        
26 0.18 breasts_big        
27 0.17 woman        
28 0.17 experienced        
29 0.17 virgin        
30 0.16 porn_written        
31 0.15 persity_nl        
32 0.15 persity_ch        
33 0.15 butt_big        
34 0.14 mast_solo_m        
35 0.12 persity_ah        

V3 has broken off a cluster V5 which could be described as interest in a vulnerable partner.

clustertable(6)
  V1 V2 V3 V4 V5 V6
1 M 0.066, SD 0.191 M 0.065, SD 0.226 M 0.086, SD 0.231 M 0.019, SD 0.205 M 0.152, SD 0.254 M 0.115, SD 0.254
2 0.29 porn_video_mf 0.28 woman_fem 0.62 man 0.27 pain_to 0.38 intimacy 0.28 persity_ol
3 0.29 voyeur_known 0.26 coitus_m 0.60 semen_rec_mouth 0.25 bondage_to 0.37 love 0.26 persity_cl
4 0.28 porn_visual 0.25 persity_oh 0.60 penis_big 0.25 urine_to 0.36 in_rship 0.24 butt_small
5 0.27 group_sex 0.25 persity_eh 0.60 fellatio_to 0.25 pain_rec 0.34 pleasure_to 0.24 persity_nh
6 0.27 semen_to_mouth 0.25 woman 0.59 semen_swallow 0.25 insult_to 0.33 kiss 0.24 persity_el
7 0.27 recent_acq 0.24 persity_nl 0.58 analpen_to_m 0.24 urine_rec 0.29 desired 0.24 feet_big
8 0.27 voyeur_secret 0.22 persity_ch 0.58 mast_to_m 0.24 control_to 0.25 hug 0.22 persity_al
9 0.27 friend 0.22 breasts_big 0.58 analpen_rec 0.24 insult_rec   0.22 feet_small
10 0.27 semen_to_anus 0.22 semen_to_vag 0.57 porn_video_mm 0.22 bondage_rec   0.21 breasts_small
11 0.26 porn_video_ff 0.20 persity_ah 0.56 man_mas 0.22 rape_rec    
12 0.25 stranger 0.19 rich 0.53 semen_rec_anus 0.21 uncon    
13 0.25 analpen_to_f 0.18 rebel 0.52 penis_small 0.21 rape_to    
14 0.24 objpen_to 0.17 virgin 0.51 man_fem 0.19 control_rec    
15 0.22 mast_rec_m 0.16 butt_big 0.44 anil_to_m 0.19 anil_to_f    
16 0.22 mast_to_f   0.44 man_trans 0.19 anil_rec    
17 0.22 fellatio_rec   0.41 objpen_rec 0.19 incest    
18 0.22 porn_written   0.37 woman_trans 0.19 leather    
19 0.21 cunn_to   0.18 age_70 0.17 feet    
20 0.20 experienced   0.16 woman_mas 0.14 age_14    
21 0.19 mast_solo_m     0.12 age_08    

The old V1 has split into V1 (interest in pornography and pronographic tropes) and V2 (gynophilia). The remaining clusters have been moved to the right.

clustertable(7)
  V1 V2 V3 V4 V5 V6 V7
1 M 0.066, SD 0.191 M 0.065, SD 0.226 M 0.086, SD 0.231 M 0.104, SD 0.217 M 0.152, SD 0.254 M 0.148, SD 0.272 M 0.115, SD 0.254
2 0.29 porn_video_mf 0.28 woman_fem 0.62 man 0.30 bondage_to 0.38 intimacy 0.36 rape_to 0.28 persity_ol
3 0.29 voyeur_known 0.26 coitus_m 0.60 semen_rec_mouth 0.29 insult_to 0.37 love 0.34 uncon 0.26 persity_cl
4 0.28 porn_visual 0.25 persity_oh 0.60 penis_big 0.29 pain_rec 0.36 in_rship 0.30 age_14 0.24 butt_small
5 0.27 group_sex 0.25 persity_eh 0.60 fellatio_to 0.29 insult_rec 0.34 pleasure_to 0.28 rape_rec 0.24 persity_nh
6 0.27 semen_to_mouth 0.25 woman 0.59 semen_swallow 0.29 pain_to 0.33 kiss 0.27 incest 0.24 persity_el
7 0.27 recent_acq 0.24 persity_nl 0.58 analpen_to_m 0.28 bondage_rec 0.29 desired 0.25 age_08 0.24 feet_big
8 0.27 voyeur_secret 0.22 persity_ch 0.58 mast_to_m 0.28 control_to 0.25 hug   0.22 persity_al
9 0.27 friend 0.22 breasts_big 0.58 analpen_rec 0.26 urine_to     0.22 feet_small
10 0.27 semen_to_anus 0.22 semen_to_vag 0.57 porn_video_mm 0.26 urine_rec     0.21 breasts_small
11 0.26 porn_video_ff 0.20 persity_ah 0.56 man_mas 0.25 control_rec      
12 0.25 stranger 0.19 rich 0.53 semen_rec_anus 0.23 leather      
13 0.25 analpen_to_f 0.18 rebel 0.52 penis_small 0.23 anil_to_f      
14 0.24 objpen_to 0.17 virgin 0.51 man_fem 0.22 anil_rec      
15 0.22 mast_rec_m 0.16 butt_big 0.44 anil_to_m 0.20 feet      
16 0.22 mast_to_f   0.44 man_trans        
17 0.22 fellatio_rec   0.41 objpen_rec        
18 0.22 porn_written   0.37 woman_trans        
19 0.21 cunn_to   0.18 age_70        
20 0.20 experienced   0.16 woman_mas        
21 0.19 mast_solo_m            

The kink factor V4 has spun off its most socially proscribed items into V6. (The previous V6 is now V7.)

So at this point, we have:

  1. Pornography and pornographic tropes
  2. Gynophilia
  3. Androphilia
  4. Kink
  5. Pleasantness
  6. Socially proscribed interests
  7. Interest in vulnerable partners

Women

l = go.hclust.kendall.abs("Female")
dat = l[[1]]
items = colnames(dat)
dists = l[[2]]
dists.m = as.matrix(dists)
tree = l[[3]]
1
c(
    "number of subjects" = nrow(dat),
    "number of items" = ncol(dat))
  value
number of subjects 459
number of items 85
plot(tree)

hier-tree-f.png

clustertable(2)
  V1 V2
1 M 0.000, SD 0.149 M 0.007, SD 0.224
2 0.26 cunn_to 0.25 intimacy
3 0.25 group_sex 0.24 in_rship
4 0.25 porn_visual 0.23 love
5 0.25 porn_video_ff 0.21 kiss
6 0.25 objpen_rec 0.20 persity_nl
7 0.25 mast_to_f 0.20 persity_ah
8 0.24 woman 0.19 pleasure_to
9 0.23 breasts_big 0.19 desired
10 0.23 breasts_small 0.19 persity_ch
11 0.23 voyeur_known 0.18 *rape_to
12 0.23 woman_fem 0.17 *incest
13 0.23 objpen_to 0.15 hug
14 0.22 stranger 0.15 *age_14
15 0.22 anil_to_f 0.14 *rape_rec
16 0.22 woman_trans 0.13 *uncon
17 0.22 recent_acq 0.13 *age_08
18 0.22 porn_video_mf 0.08 persity_el
19 0.21 semen_swallow  
20 0.21 man_trans  
21 0.21 semen_rec_mouth  
22 0.21 porn_written  
23 0.21 woman_mas  
24 0.21 pain_rec  
25 0.20 bondage_to  
26 0.20 bondage_rec  
27 0.20 insult_rec  
28 0.20 insult_to  
29 0.20 voyeur_secret  
30 0.19 anil_to_m  
31 0.19 anil_rec  
32 0.19 analpen_rec  
33 0.19 rebel  
34 0.19 semen_rec_anus  
35 0.19 friend  
36 0.19 porn_video_mm  
37 0.19 leather  
38 0.19 control_rec  
39 0.18 butt_big  
40 0.18 fellatio_to  
41 0.18 pain_to  
42 0.18 mast_solo_f  
43 0.18 experienced  
44 0.17 persity_oh  
45 0.17 man_fem  
46 0.15 persity_cl  
47 0.15 control_to  
48 0.15 penis_big  
49 0.15 rich  
50 0.15 feet  
51 0.15 *mast_to_m  
52 0.15 urine_to  
53 0.14 butt_small  
54 0.14 virgin  
55 0.14 persity_eh  
56 0.14 feet_small  
57 0.13 cunn_rec  
58 0.13 semen_rec_vag  
59 0.13 feet_big  
60 0.13 urine_rec  
61 0.13 persity_nh  
62 0.12 *man  
63 0.12 *coitus_f  
64 0.12 persity_al  
65 0.11 *man_mas  
66 0.10 mast_rec_f  
67 0.10 age_70  
68 0.08 *penis_small  
69 0.07 persity_ol  

V1 is a gynophilia cluster and V2 is a consent or pleasantness cluster.

clustertable(3)
  V1 V2 V3
1 M 0.004, SD 0.162 M 0.002, SD 0.209 M 0.007, SD 0.224
2 0.27 porn_visual 0.32 cunn_to 0.25 intimacy
3 0.26 objpen_rec 0.32 mast_to_f 0.24 in_rship
4 0.26 semen_rec_mouth 0.32 breasts_small 0.23 love
5 0.26 semen_swallow 0.32 woman 0.21 kiss
6 0.25 group_sex 0.31 woman_fem 0.20 persity_nl
7 0.25 porn_video_mf 0.30 woman_trans 0.20 persity_ah
8 0.25 fellatio_to 0.29 breasts_big 0.19 pleasure_to
9 0.25 bondage_rec 0.28 woman_mas 0.19 desired
10 0.25 control_rec 0.28 man_trans 0.19 persity_ch
11 0.24 porn_written 0.28 porn_video_ff 0.18 *rape_to
12 0.24 stranger 0.28 anil_to_f 0.17 *incest
13 0.24 recent_acq 0.28 objpen_to 0.15 hug
14 0.24 voyeur_known 0.24 man_fem 0.15 *age_14
15 0.24 rebel 0.24 butt_big 0.14 *rape_rec
16 0.22 bondage_to 0.23 porn_video_mm 0.13 *uncon
17 0.22 insult_rec 0.20 anil_to_m 0.13 *age_08
18 0.22 pain_rec 0.19 anil_rec 0.08 persity_el
19 0.22 penis_big 0.19 feet  
20 0.21 semen_rec_anus 0.18 feet_small  
21 0.21 analpen_rec 0.17 urine_to  
22 0.21 insult_to 0.17 butt_small  
23 0.21 mast_to_m 0.16 persity_cl  
24 0.20 persity_oh 0.16 persity_nh  
25 0.20 leather 0.16 urine_rec  
26 0.20 voyeur_secret 0.15 feet_big  
27 0.20 mast_solo_f 0.15 age_70  
28 0.19 experienced 0.12 *penis_small  
29 0.19 friend 0.12 persity_al  
30 0.18 persity_eh 0.09 persity_ol  
31 0.18 semen_rec_vag    
32 0.18 pain_to    
33 0.18 rich    
34 0.17 control_to    
35 0.16 coitus_f    
36 0.16 cunn_rec    
37 0.14 man    
38 0.14 mast_rec_f    
39 0.14 man_mas    
40 0.12 virgin    

V1 has become pornography and pornographic tropes, and has spun off a gynophilia cluster V2. The pleasantness or consent cluster is now labeled V3.

clustertable(4)
  V1 V2 V3 V4
1 M 0.004, SD 0.162 M 0.108, SD 0.218 M 0.007, SD 0.224 M 0.047, SD 0.251
2 0.27 porn_visual 0.45 cunn_to 0.25 intimacy 0.24 feet_small
3 0.26 objpen_rec 0.44 woman 0.24 in_rship 0.23 feet_big
4 0.26 semen_rec_mouth 0.44 mast_to_f 0.23 love 0.23 persity_nh
5 0.26 semen_swallow 0.43 woman_fem 0.21 kiss 0.22 butt_small
6 0.25 group_sex 0.42 breasts_small 0.20 persity_nl 0.22 persity_cl
7 0.25 porn_video_mf 0.40 breasts_big 0.20 persity_ah 0.21 penis_small
8 0.25 fellatio_to 0.38 woman_trans 0.19 pleasure_to 0.21 persity_ol
9 0.25 bondage_rec 0.38 porn_video_ff 0.19 desired 0.19 feet
10 0.25 control_rec 0.38 woman_mas 0.19 persity_ch 0.17 persity_al
11 0.24 porn_written 0.36 anil_to_f 0.18 *rape_to 0.13 age_70
12 0.24 stranger 0.36 objpen_to 0.17 *incest  
13 0.24 recent_acq 0.33 man_trans 0.15 hug  
14 0.24 voyeur_known 0.28 porn_video_mm 0.15 *age_14  
15 0.24 rebel 0.26 butt_big 0.14 *rape_rec  
16 0.22 bondage_to 0.25 man_fem 0.13 *uncon  
17 0.22 insult_rec 0.24 anil_rec 0.13 *age_08  
18 0.22 pain_rec 0.24 anil_to_m 0.08 persity_el  
19 0.22 penis_big 0.22 urine_to    
20 0.21 semen_rec_anus 0.20 urine_rec    
21 0.21 analpen_rec      
22 0.21 insult_to      
23 0.21 mast_to_m      
24 0.20 persity_oh      
25 0.20 leather      
26 0.20 voyeur_secret      
27 0.20 mast_solo_f      
28 0.19 experienced      
29 0.19 friend      
30 0.18 persity_eh      
31 0.18 semen_rec_vag      
32 0.18 pain_to      
33 0.18 rich      
34 0.17 control_to      
35 0.16 coitus_f      
36 0.16 cunn_rec      
37 0.14 man      
38 0.14 mast_rec_f      
39 0.14 man_mas      
40 0.12 virgin      

The gynophilia cluster has broken off a desire-for-a-vulnerable-partner cluster V4.

clustertable(5)
  V1 V2 V3 V4 V5
1 M 0.054, SD 0.166 M 0.090, SD 0.249 M 0.108, SD 0.218 M 0.007, SD 0.224 M 0.047, SD 0.251
2 0.29 porn_visual 0.36 coitus_f 0.45 cunn_to 0.25 intimacy 0.24 feet_small
3 0.29 group_sex 0.35 man 0.44 woman 0.24 in_rship 0.23 feet_big
4 0.28 objpen_rec 0.32 mast_to_m 0.44 mast_to_f 0.23 love 0.23 persity_nh
5 0.28 stranger 0.32 fellatio_to 0.43 woman_fem 0.21 kiss 0.22 butt_small
6 0.27 recent_acq 0.29 penis_big 0.42 breasts_small 0.20 persity_nl 0.22 persity_cl
7 0.27 bondage_rec 0.27 semen_rec_vag 0.40 breasts_big 0.20 persity_ah 0.21 penis_small
8 0.27 voyeur_known 0.26 man_mas 0.38 woman_trans 0.19 pleasure_to 0.21 persity_ol
9 0.27 porn_written 0.23 mast_rec_f 0.38 porn_video_ff 0.19 desired 0.19 feet
10 0.26 porn_video_mf 0.20 cunn_rec 0.38 woman_mas 0.19 persity_ch 0.17 persity_al
11 0.26 control_rec   0.36 anil_to_f 0.18 *rape_to 0.13 age_70
12 0.26 pain_rec   0.36 objpen_to 0.17 *incest  
13 0.26 insult_rec   0.33 man_trans 0.15 hug  
14 0.26 semen_swallow   0.28 porn_video_mm 0.15 *age_14  
15 0.25 semen_rec_mouth   0.26 butt_big 0.14 *rape_rec  
16 0.25 bondage_to   0.25 man_fem 0.13 *uncon  
17 0.25 rebel   0.24 anil_rec 0.13 *age_08  
18 0.25 insult_to   0.24 anil_to_m 0.08 persity_el  
19 0.24 semen_rec_anus   0.22 urine_to    
20 0.23 analpen_rec   0.20 urine_rec    
21 0.23 friend        
22 0.23 leather        
23 0.23 voyeur_secret        
24 0.22 pain_to        
25 0.22 persity_oh        
26 0.21 mast_solo_f        
27 0.21 experienced        
28 0.19 control_to        
29 0.18 rich        
30 0.18 persity_eh        
31 0.14 virgin        

Now we have an androphilia cluster V2. Most of the other clusters have been pushed to the right.

clustertable(6)
  V1 V2 V3 V4 V5 V6
1 M 0.054, SD 0.166 M 0.090, SD 0.249 M 0.108, SD 0.218 M 0.031, SD 0.243 M 0.047, SD 0.251 M 0.195, SD 0.314
2 0.29 porn_visual 0.36 coitus_f 0.45 cunn_to 0.25 intimacy 0.24 feet_small 0.36 persity_ch
3 0.29 group_sex 0.35 man 0.44 woman 0.24 in_rship 0.23 feet_big 0.35 persity_nl
4 0.28 objpen_rec 0.32 mast_to_m 0.44 mast_to_f 0.24 love 0.23 persity_nh 0.33 persity_ah
5 0.28 stranger 0.32 fellatio_to 0.43 woman_fem 0.21 *rape_to 0.22 butt_small 0.20 persity_el
6 0.27 recent_acq 0.29 penis_big 0.42 breasts_small 0.21 desired 0.22 persity_cl  
7 0.27 bondage_rec 0.27 semen_rec_vag 0.40 breasts_big 0.21 kiss 0.21 penis_small  
8 0.27 voyeur_known 0.26 man_mas 0.38 woman_trans 0.20 pleasure_to 0.21 persity_ol  
9 0.27 porn_written 0.23 mast_rec_f 0.38 porn_video_ff 0.19 *incest 0.19 feet  
10 0.26 porn_video_mf 0.20 cunn_rec 0.38 woman_mas 0.18 *age_14 0.17 persity_al  
11 0.26 control_rec   0.36 anil_to_f 0.17 *rape_rec 0.13 age_70  
12 0.26 pain_rec   0.36 objpen_to 0.16 *age_08    
13 0.26 insult_rec   0.33 man_trans 0.15 *uncon    
14 0.26 semen_swallow   0.28 porn_video_mm 0.14 hug    
15 0.25 semen_rec_mouth   0.26 butt_big      
16 0.25 bondage_to   0.25 man_fem      
17 0.25 rebel   0.24 anil_rec      
18 0.25 insult_to   0.24 anil_to_m      
19 0.24 semen_rec_anus   0.22 urine_to      
20 0.23 analpen_rec   0.20 urine_rec      
21 0.23 friend          
22 0.23 leather          
23 0.23 voyeur_secret          
24 0.22 pain_to          
25 0.22 persity_oh          
26 0.21 mast_solo_f          
27 0.21 experienced          
28 0.19 control_to          
29 0.18 rich          
30 0.18 persity_eh          
31 0.14 virgin          

The pleasantness or consent cluster has broken off V6, which looks like the desire for a reliable person.

clustertable(7)
  V1 V2 V3 V4 V5 V6 V7
1 M 0.054, SD 0.166 M 0.090, SD 0.249 M 0.108, SD 0.218 M 0.138, SD 0.255 M 0.103, SD 0.289 M 0.047, SD 0.251 M 0.195, SD 0.314
2 0.29 porn_visual 0.36 coitus_f 0.45 cunn_to 0.36 in_rship 0.31 age_14 0.24 feet_small 0.36 persity_ch
3 0.29 group_sex 0.35 man 0.44 woman 0.35 intimacy 0.30 rape_to 0.23 feet_big 0.35 persity_nl
4 0.28 objpen_rec 0.32 mast_to_m 0.44 mast_to_f 0.35 love 0.27 incest 0.23 persity_nh 0.33 persity_ah
5 0.28 stranger 0.32 fellatio_to 0.43 woman_fem 0.31 pleasure_to 0.27 rape_rec 0.22 butt_small 0.20 persity_el
6 0.27 recent_acq 0.29 penis_big 0.42 breasts_small 0.31 desired 0.23 age_08 0.22 persity_cl  
7 0.27 bondage_rec 0.27 semen_rec_vag 0.40 breasts_big 0.30 kiss 0.23 uncon 0.21 penis_small  
8 0.27 voyeur_known 0.26 man_mas 0.38 woman_trans 0.24 hug   0.21 persity_ol  
9 0.27 porn_written 0.23 mast_rec_f 0.38 porn_video_ff     0.19 feet  
10 0.26 porn_video_mf 0.20 cunn_rec 0.38 woman_mas     0.17 persity_al  
11 0.26 control_rec   0.36 anil_to_f     0.13 age_70  
12 0.26 pain_rec   0.36 objpen_to        
13 0.26 insult_rec   0.33 man_trans        
14 0.26 semen_swallow   0.28 porn_video_mm        
15 0.25 semen_rec_mouth   0.26 butt_big        
16 0.25 bondage_to   0.25 man_fem        
17 0.25 rebel   0.24 anil_rec        
18 0.25 insult_to   0.24 anil_to_m        
19 0.24 semen_rec_anus   0.22 urine_to        
20 0.23 analpen_rec   0.20 urine_rec        
21 0.23 friend            
22 0.23 leather            
23 0.23 voyeur_secret            
24 0.22 pain_to            
25 0.22 persity_oh            
26 0.21 mast_solo_f            
27 0.21 experienced            
28 0.19 control_to            
29 0.18 rich            
30 0.18 persity_eh            
31 0.14 virgin            

The pleasantness cluster has broken into separate pleasantness (V4) and socially proscribed (V5) clusters.

To review, we now have:

  1. Pornography and pornographic tropes
  2. Androphilia
  3. Gynophilia
  4. Pleasantness or consent
  5. The socially proscribed
  6. Desire for a vulnerable partner
  7. Desire for a reliable partner

Bass-ackwards factor analysis

Men

go.fa = function(gender, nfactors)
   {pw = ss(prefwide, sb[row.names(prefwide), "gender"] == gender)
    items = pref.items[unname(sapply(pref.items, function(pi)
        all(!is.na(pw[pi])) &&
        var(pw[pi]) > 0))]
    pw = pw[,items]
    result = fa(pw, nfactors = nfactors, rotate = "varimax", fm = "ml",
        cor = "poly")
    punl(pw, result)}
display.loadings = function(l, cutoff = .1)
   {m = loadings(l$result)
#    peakness = apply(abs(m), 1, function(row)
#       {s = sort(row, dec = T)
#        abs(s[1] - s[2])})
    rowMaxes = apply(abs(m), 1, max)
    m = m[order(-rowMaxes), paste0("ML", 1 : ncol(m))]
    m[abs(m) < cutoff] = NA
    round(d = 2, m)}
factor.score.cors = function(l1, l2)
   round(d = 2, sapply(sort(colnames(l1$result$scores)), function(f1)
       sapply(sort(colnames(l2$result$scores)), function(f2)
           cor(l1$result$scores[,f1], l2$result$scores[,f2]))))
1
  value
  1
l.male2 = go.fa("Male", 2)
zcomb = combn(colnames(l.male2$pw), 2, simplify = F, FUN = function(iv)
    table(l.male2$pw[[iv[1]]], l.male2$pw[[iv[2]]]) == 0)
zero.prop.per.cell = mean(c(recursive = T, zcomb))
zero.prop.per.varpair = mean(sapply(zcomb, any))
round(d = 2, c(zero.prop.per.varpair, zero.prop.per.cell))
  value
  0.96 0.22
display.loadings(l.male2)
  ML1 ML2
man 0.96  
semen_rec_mouth 0.94  
fellatio_to 0.94  
penis_big 0.94  
semen_swallow 0.93  
porn_video_mm 0.93  
analpen_to_m 0.93  
man_mas 0.92 -0.15
mast_to_m 0.92  
analpen_rec 0.91  
semen_rec_anus 0.89  
anil_to_m 0.85 -0.18
penis_small 0.82 -0.16
man_fem 0.80  
man_trans 0.74 0.10
objpen_rec 0.73 0.18
woman -0.68 0.53
semen_to_mouth   0.67
coitus_m -0.65 0.58
porn_video_mf   0.65
mast_to_f -0.39 0.64
woman_trans 0.63 0.27
analpen_to_f   0.62
porn_video_ff -0.24 0.62
recent_acq 0.16 0.60
voyeur_known 0.34 0.60
semen_to_anus 0.22 0.59
voyeur_secret 0.30 0.59
cunn_to -0.33 0.59
semen_to_vag -0.38 0.58
rape_rec 0.58  
woman_fem -0.49 0.58
group_sex 0.19 0.58
objpen_to 0.18 0.58
rebel 0.15 0.58
friend 0.15 0.58
fellatio_rec -0.20 0.56
persity_oh   0.55
urine_rec 0.55 0.14
porn_visual   0.54
stranger 0.14 0.54
persity_eh   0.52
mast_rec_m   0.51
breasts_small -0.12 0.51
urine_to 0.50 0.21
rich   0.49
bondage_to 0.19 0.49
pleasure_to -0.36 0.48
anil_rec 0.48 0.28
age_08 0.48 -0.30
experienced   0.48
control_to   0.47
insult_to 0.17 0.47
anil_to_f 0.14 0.47
breasts_big -0.42 0.46
incest 0.45 0.11
porn_written 0.18 0.44
virgin   0.41
age_70 0.41  
mast_solo_m 0.23 0.40
desired -0.28 0.39
butt_big   0.38
rape_to 0.38  
persity_el   0.37
in_rship -0.26 0.36
persity_nl -0.21 0.36
control_rec 0.31 0.36
insult_rec 0.35 0.35
pain_to 0.35 0.26
persity_ch -0.17 0.35
butt_small 0.12 0.34
bondage_rec 0.24 0.34
age_14 0.34  
pain_rec 0.33 0.24
feet 0.33 0.28
leather 0.32 0.31
persity_cl   0.32
love -0.32 0.25
persity_ah -0.21 0.32
feet_big 0.32 0.18
feet_small   0.29
kiss -0.15 0.29
persity_al   0.28
woman_mas 0.28 0.27
persity_ol   0.28
uncon 0.26 0.18
intimacy -0.22 0.25
persity_nh   0.19
hug   0.13

Factor 1 seems to be interest in men, factor 2 interest in women.

l.male3 = go.fa("Male", 3)
display.loadings(l.male3)
  ML1 ML2 ML3
man 0.97    
fellatio_to 0.95    
penis_big 0.95    
man_mas 0.94   -0.11
semen_rec_mouth 0.94   -0.13
mast_to_m 0.93    
porn_video_mm 0.93   -0.11
semen_swallow 0.92 0.11 -0.14
analpen_to_m 0.91 0.11 -0.16
analpen_rec 0.88 0.13 -0.18
semen_rec_anus 0.84 0.12 -0.28
anil_to_m 0.81   -0.36
penis_small 0.78   -0.29
man_fem 0.78 0.12 -0.11
age_08 0.35   -0.77
analpen_to_f -0.20 0.70  
man_trans 0.70 0.22 -0.15
pleasure_to -0.27 0.20 0.69
in_rship -0.15   0.69
semen_to_anus 0.12 0.69  
objpen_rec 0.68 0.31 -0.14
woman -0.67 0.32 0.46
desired -0.19 0.12 0.66
love -0.20   0.66
voyeur_secret 0.22 0.64  
insult_to   0.64 -0.20
coitus_m -0.63 0.36 0.49
recent_acq   0.63  
intimacy -0.12   0.62
objpen_to 0.10 0.61  
semen_to_mouth   0.61 0.28
rape_to 0.23 0.34 -0.60
stranger   0.60  
bondage_to   0.59  
control_to   0.59  
anil_to_f   0.58 -0.12
persity_ah -0.12   0.58
woman_trans 0.58 0.37  
voyeur_known 0.30 0.58 0.22
group_sex 0.14 0.57 0.16
kiss     0.57
porn_video_mf   0.56 0.31
persity_ch   0.12 0.56
porn_video_ff -0.29 0.55 0.21
persity_eh   0.32 0.55
friend 0.11 0.55 0.20
persity_nl -0.14 0.14 0.54
rebel 0.11 0.54 0.23
age_14 0.23 0.18 -0.53
persity_oh   0.37 0.52
pain_to 0.21 0.51 -0.39
semen_to_vag -0.42 0.50 0.25
insult_rec 0.25 0.50 -0.18
woman_fem -0.49 0.41 0.42
uncon 0.12 0.45 -0.48
mast_to_f -0.39 0.47 0.43
rape_rec 0.46 0.33 -0.47
mast_rec_m   0.34 0.46
porn_visual   0.46 0.30
breasts_small -0.16 0.46 0.19
cunn_to -0.34 0.46 0.36
urine_to 0.37 0.45 -0.37
urine_rec 0.45 0.37 -0.36
breasts_big -0.44 0.36 0.25
bondage_rec 0.16 0.44  
fellatio_rec -0.19 0.40 0.43
pain_rec 0.23 0.43 -0.28
rich   0.43 0.24
incest 0.34 0.34 -0.42
virgin -0.14 0.41  
experienced   0.41 0.25
porn_written 0.16 0.41 0.19
anil_rec 0.41 0.40 -0.11
leather 0.26 0.40  
hug     0.40
control_rec 0.26 0.39  
feet 0.26 0.38  
persity_al   0.37 -0.13
persity_cl   0.35  
butt_small   0.34  
age_70 0.34 0.23 -0.26
mast_solo_m 0.24 0.33 0.25
woman_mas 0.23 0.33  
feet_small   0.32  
butt_big   0.31 0.23
persity_el   0.26 0.31
feet_big 0.31 0.18  
persity_nh   0.29 -0.19
persity_ol   0.24 0.13

Factor 1 is interest in men, factor 2 is kink, and factor 3 is pleasantness or consent.

factor.score.cors(l.male2, l.male3)
  ML1 ML2
ML1 0.98 -0.24
ML2 0.12 0.83
ML3 -0.53 0.61
l.male4 = go.fa("Male", 4)
display.loadings(l.male4)
  ML1 ML2 ML3 ML4
man 0.95     -0.18
semen_rec_mouth 0.94   -0.13  
fellatio_to 0.94 0.12   -0.15
penis_big 0.92     -0.22
semen_swallow 0.92   -0.15  
mast_to_m 0.91 0.13   -0.16
analpen_rec 0.90   -0.19  
porn_video_mm 0.90 0.10 -0.11 -0.21
man_mas 0.90   -0.10 -0.30
analpen_to_m 0.89 0.14 -0.17 -0.14
semen_rec_anus 0.87   -0.29  
man_fem 0.81   -0.12  
anil_to_m 0.78   -0.37 -0.20
penis_small 0.78   -0.29 -0.11
age_08 0.38 -0.12 -0.77  
man_trans 0.76   -0.16 0.20
objpen_rec 0.74 0.15 -0.17 0.23
recent_acq   0.73    
stranger   0.68    
friend   0.68 0.14  
in_rship -0.12   0.67 0.18
pleasure_to -0.25 0.21 0.66 0.19
cunn_to -0.22 0.18 0.32 0.66
woman_trans 0.66 0.15   0.37
love -0.19   0.66  
control_to   0.65 -0.16  
desired -0.18 0.17 0.64  
insult_to   0.63 -0.27 0.15
rape_to 0.25 0.25 -0.63 0.10
voyeur_secret 0.23 0.62   0.20
bondage_to   0.61 -0.13 0.10
semen_to_mouth   0.61 0.22 0.22
intimacy     0.61 0.12
mast_to_f -0.29 0.25 0.40 0.61
rebel 0.10 0.60 0.18  
group_sex 0.13 0.60 0.11 0.13
voyeur_known 0.30 0.59 0.17 0.13
woman -0.57 0.13 0.44 0.56
coitus_m -0.54 0.18 0.47 0.57
semen_to_vag -0.32 0.30 0.21 0.57
anil_to_f 0.14 0.31 -0.17 0.57
semen_to_anus 0.17 0.56   0.37
persity_ah -0.12 0.14 0.56  
kiss     0.56 0.15
age_14 0.25   -0.55 0.11
analpen_to_f -0.12 0.49 -0.10 0.54
persity_ch   0.18 0.54  
porn_visual   0.53 0.25  
persity_nl -0.13 0.16 0.53 0.12
rich   0.52 0.20  
uncon 0.14 0.35 -0.52 0.18
persity_eh   0.41 0.51  
insult_rec 0.25 0.50 -0.23  
rape_rec 0.49 0.22 -0.49 0.14
porn_video_mf   0.49 0.26 0.33
objpen_to 0.16 0.49   0.35
pain_to 0.21 0.49 -0.44  
urine_rec 0.48 0.24 -0.39 0.18
persity_oh   0.43 0.48 0.10
woman_fem -0.41 0.27 0.39 0.48
porn_written 0.14 0.47 0.15  
fellatio_rec -0.19 0.46 0.39 0.11
virgin -0.16 0.46    
porn_video_ff -0.22 0.41 0.16 0.45
incest 0.35 0.26 -0.45 0.12
breasts_small   0.29 0.15 0.44
experienced   0.43 0.21 0.12
leather 0.25 0.43 -0.11  
mast_rec_m   0.37 0.42 0.14
anil_rec 0.42 0.36 -0.16  
urine_to 0.39 0.37 -0.42 0.14
persity_al   0.40 -0.17  
breasts_big -0.38 0.23 0.22 0.40
bondage_rec 0.18 0.39 -0.13 0.15
hug     0.39  
persity_cl   0.38    
control_rec 0.28 0.37   0.12
pain_rec 0.25 0.36 -0.32 0.14
mast_solo_m 0.24 0.36 0.22  
age_70 0.35 0.16 -0.28  
woman_mas 0.30 0.15   0.34
butt_small   0.33   0.12
persity_el   0.31 0.28  
persity_nh   0.30 -0.22  
feet 0.30 0.27 -0.14 0.22
butt_big   0.30 0.20 0.15
persity_ol   0.29 0.10  
feet_big 0.29 0.24    
feet_small   0.26   0.16

Factors 1 through 3 look similar. Factor 4 looks like interest in women.

factor.score.cors(l.male3, l.male4)
  ML1 ML2 ML3
ML1 0.99 0.07 -0.39
ML2 -0.06 0.86 0.27
ML3 -0.38 0.00 1.00
ML4 -0.12 0.56 0.00
l.male5 = go.fa("Male", 5)
display.loadings(l.male5)
  ML1 ML2 ML3 ML4 ML5
man 0.95     -0.17  
semen_rec_mouth 0.94   -0.13    
fellatio_to 0.94 0.13   -0.14  
penis_big 0.92     -0.21  
semen_swallow 0.91 0.13 -0.15    
mast_to_m 0.91 0.15   -0.16  
man_mas 0.90   -0.11 -0.28  
porn_video_mm 0.90 0.12 -0.12 -0.20  
analpen_rec 0.90 0.12 -0.19    
analpen_to_m 0.89 0.18 -0.17 -0.14  
semen_rec_anus 0.87   -0.29    
man_fem 0.81   -0.12    
age_08 0.38 -0.11 -0.78 0.13  
penis_small 0.78   -0.30    
anil_to_m 0.78   -0.37 -0.18  
man_trans 0.75   -0.16 0.21 0.12
objpen_rec 0.72 0.26 -0.16 0.22  
pleasure_to -0.26 0.21 0.67 0.16  
in_rship -0.12   0.67 0.17  
love -0.19   0.66    
semen_to_anus 0.14 0.65   0.31  
desired -0.19 0.16 0.65    
woman_trans 0.65 0.16   0.36 0.16
control_to   0.65 -0.14   0.14
insult_to   0.64 -0.24   0.15
bondage_to   0.64 -0.11    
cunn_to -0.24 0.23 0.34 0.64  
semen_to_mouth   0.63 0.25 0.16 0.10
voyeur_known 0.28 0.62 0.19    
rape_to 0.23 0.24 -0.62   0.16
recent_acq   0.62     0.42
persity_ol         0.61
group_sex 0.11 0.61 0.13   0.11
voyeur_secret 0.20 0.61   0.14 0.19
intimacy     0.61 0.11  
persity_cl   0.19     0.60
stranger   0.60     0.35
analpen_to_f -0.15 0.59   0.49  
woman -0.58 0.11 0.46 0.53 0.10
friend   0.58 0.16   0.36
mast_to_f -0.31 0.26 0.41 0.57  
persity_nh   0.11 -0.23   0.57
persity_ah -0.12   0.56   0.20
kiss     0.55 0.14  
objpen_to 0.13 0.55   0.30  
coitus_m -0.55 0.15 0.48 0.54 0.15
age_14 0.25   -0.55 0.12 0.15
porn_visual   0.55 0.27    
anil_to_f 0.11 0.45 -0.16 0.54 -0.12
persity_ch     0.54   0.24
semen_to_vag -0.34 0.26 0.22 0.53 0.24
persity_el   0.13 0.28   0.53
persity_nl -0.13   0.53 0.10 0.22
rebel   0.52 0.20   0.33
persity_eh   0.33 0.52   0.22
insult_rec 0.23 0.51 -0.21   0.11
uncon 0.12 0.32 -0.51 0.16 0.24
pain_to 0.19 0.50 -0.42   0.12
persity_al   0.25 -0.17   0.50
porn_written 0.12 0.49 0.17    
persity_oh   0.39 0.49   0.16
rape_rec 0.48 0.21 -0.49 0.13 0.18
porn_video_mf   0.48 0.28 0.28 0.16
anil_rec 0.40 0.47 -0.15   -0.11
fellatio_rec -0.21 0.47 0.41    
urine_rec 0.46 0.35 -0.39 0.18 -0.10
urine_to 0.37 0.46 -0.40 0.11  
feet_big 0.29       0.46
leather 0.23 0.45      
incest 0.34 0.22 -0.45 0.11 0.23
woman_fem -0.43 0.22 0.40 0.44 0.20
butt_small   0.19   0.10 0.44
breasts_small   0.17 0.16 0.43 0.44
mast_rec_m   0.36 0.44 0.10  
porn_video_ff -0.25 0.43 0.18 0.40  
bondage_rec 0.16 0.43 -0.11 0.12  
rich   0.41 0.21   0.35
breasts_big -0.39 0.18 0.23 0.37 0.21
experienced   0.39 0.22   0.21
feet_small   0.15   0.15 0.39
hug     0.39    
control_rec 0.26 0.38      
virgin -0.17 0.38     0.28
woman_mas 0.29     0.34 0.38
pain_rec 0.23 0.37 -0.31 0.12 0.11
mast_solo_m 0.22 0.35 0.23    
age_70 0.35   -0.29   0.28
feet 0.28 0.28 -0.13 0.21 0.12
butt_big   0.26 0.21 0.12 0.18

Factors 1 through 4 look similar. Factor 5 is mysterious. It might be interest in a vulnerable partner as in the clustering analysis.

factor.score.cors(l.male4, l.male5)
  ML1 ML2 ML3 ML4
ML1 1.00 -0.12 -0.39 0.02
ML2 -0.05 0.94 0.18 0.17
ML3 -0.40 0.23 1.00 -0.02
ML4 0.08 -0.02 -0.08 0.99
ML5 0.07 0.36 -0.06 0.03
l.male6 = go.fa("Male", 6)
display.loadings(l.male6)
  ML1 ML2 ML3 ML4 ML5 ML6
man 0.95     -0.18    
semen_rec_mouth 0.93   -0.12      
fellatio_to 0.93     -0.15    
penis_big 0.92     -0.21    
semen_swallow 0.91   -0.12     0.14
mast_to_m 0.91 0.11   -0.16    
porn_video_mm 0.90   -0.13 -0.20    
man_mas 0.90     -0.29    
analpen_rec 0.89   -0.16     0.16
analpen_to_m 0.89 0.10 -0.15 -0.15   0.16
semen_rec_anus 0.86   -0.24     0.20
man_fem 0.81   -0.12      
penis_small 0.78 -0.11 -0.24 -0.11   0.13
anil_to_m 0.76 -0.14 -0.23 -0.24   0.35
man_trans 0.76   -0.18 0.22 0.11  
love -0.20   0.72      
objpen_rec 0.71     0.19   0.34
recent_acq   0.70 -0.12   0.36 0.12
semen_to_mouth   0.70   0.21   0.12
in_rship -0.13 0.12 0.69 0.18    
stranger   0.69 -0.21   0.28  
group_sex 0.12 0.68   0.12   0.11
friend   0.68     0.29  
intimacy -0.11   0.68      
woman_trans 0.66 0.17 -0.16 0.39 0.12  
kiss     0.65 0.12    
pleasure_to -0.26 0.30 0.64 0.18    
pain_rec 0.20       0.19 0.63
cunn_to -0.24 0.18 0.35 0.63   0.15
age_08 0.37 -0.38 -0.63   0.17 0.31
bondage_to   0.36     0.11 0.63
bondage_rec 0.13 0.12     0.10 0.62
persity_ol   0.11 0.12   0.62  
desired -0.19 0.27 0.61      
rape_to 0.23   -0.59   0.18 0.30
porn_visual   0.59 0.17     0.12
persity_ch -0.10 0.12 0.58   0.25  
mast_to_f -0.31 0.26 0.39 0.58    
voyeur_known 0.28 0.58 0.13     0.26
persity_ah -0.13 0.14 0.58   0.20  
persity_cl   0.23     0.58  
woman -0.57 0.25 0.35 0.58   -0.14
fellatio_rec -0.20 0.58 0.28 0.11    
persity_nh     -0.21   0.57  
coitus_m -0.55 0.27 0.39 0.57 0.10  
pain_to 0.17 0.21 -0.31   0.16 0.57
rebel   0.56 0.11   0.27 0.14
persity_nl -0.13 0.12 0.56   0.23  
semen_to_vag -0.33 0.32 0.14 0.56 0.21  
control_to   0.42     0.16 0.55
insult_rec 0.21 0.26     0.15 0.54
control_rec 0.23 0.12 0.21   0.14 0.54
porn_video_mf   0.54 0.17 0.32    
insult_to   0.41 -0.18   0.16 0.53
voyeur_secret 0.21 0.53   0.16 0.16 0.31
urine_rec 0.45   -0.25 0.12   0.52
persity_el   0.21 0.27   0.52  
hug   -0.13 0.51      
anil_to_f 0.10 0.19   0.51   0.48
urine_to 0.36 0.19 -0.31     0.51
semen_to_anus 0.14 0.51   0.32   0.39
persity_al   0.20 -0.15   0.50 0.17
analpen_to_f -0.15 0.45 -0.11 0.50   0.37
persity_eh   0.39 0.50   0.19  
feet_big 0.28     -0.10 0.49 0.11
age_14 0.24 -0.11 -0.49   0.18 0.21
rape_rec 0.47   -0.38   0.22 0.38
woman_fem -0.42 0.30 0.34 0.47 0.16  
uncon 0.12 0.14 -0.46 0.14 0.26 0.33
butt_small   0.13 0.12   0.46 0.17
persity_oh   0.44 0.45   0.13  
porn_video_ff -0.24 0.45   0.44   0.12
breasts_small   0.15 0.18 0.42 0.45 0.11
porn_written 0.12 0.44 0.15     0.24
leather 0.22 0.26       0.43
anil_rec 0.39 0.26       0.42
breasts_big -0.38 0.30 0.11 0.42 0.15 -0.11
feet_small       0.13 0.42 0.13
objpen_to 0.12 0.39   0.29   0.42
incest 0.34   -0.41   0.25 0.26
mast_rec_m   0.40 0.39 0.13    
woman_mas 0.29     0.31 0.40 0.14
rich   0.40 0.21   0.34 0.17
experienced   0.38 0.19   0.19 0.16
feet 0.27     0.16 0.17 0.38
virgin -0.17 0.35     0.26 0.17
age_70 0.35   -0.22   0.31 0.20
mast_solo_m 0.23 0.35 0.20     0.13
butt_big   0.29 0.16 0.14 0.15  

It seems that factor 2 has spun off kink per se into the new factor, factor 6, and is now a factor about pornography and pornographic tropes.

factor.score.cors(l.male5, l.male6)
  ML1 ML2 ML3 ML4 ML5
ML1 1.00 -0.09 -0.39 0.06 0.07
ML2 -0.27 0.82 0.56 -0.08 0.11
ML3 -0.35 0.17 0.95 -0.04 -0.08
ML4 0.01 0.09 0.03 0.98 0.01
ML5 0.13 -0.02 -0.20 0.05 0.97
ML6 0.26 0.47 -0.48 0.23 -0.06
l.male7 = go.fa("Male", 7)
display.loadings(l.male7)
  ML1 ML2 ML3 ML4 ML5 ML6 ML7
man 0.96       -0.11    
fellatio_to 0.94 0.11          
semen_rec_mouth 0.94   -0.13        
penis_big 0.93       -0.14    
mast_to_m 0.92 0.12     -0.10    
semen_swallow 0.91   -0.13     0.12  
man_mas 0.91       -0.24    
porn_video_mm 0.91 0.11 -0.14   -0.15    
analpen_to_m 0.90   -0.14 0.14 -0.17    
analpen_rec 0.89   -0.16 0.11   0.13  
semen_rec_anus 0.86   -0.24 0.13   0.15  
semen_to_anus 0.14 0.44   0.82   0.11 0.16
man_fem 0.80   -0.13   0.13    
penis_small 0.79 -0.11 -0.25        
anil_to_m 0.78 -0.16 -0.22 0.12 -0.26 0.28  
man_trans 0.75   -0.21   0.31    
love -0.20   0.73        
bondage_rec 0.13 0.15       0.73  
analpen_to_f -0.16 0.40   0.73 0.24 0.15  
objpen_rec 0.71     0.21 0.16 0.31  
in_rship -0.13 0.12 0.70   0.13    
recent_acq   0.69 -0.10     0.12 0.36
friend   0.68         0.28
intimacy -0.11   0.68        
group_sex 0.12 0.68   0.12      
pain_rec 0.21   -0.14     0.68 0.15
semen_to_mouth   0.67 0.13 0.33      
stranger   0.67 -0.19       0.29
pleasure_to -0.27 0.30 0.65   0.14    
control_rec 0.23 0.14 0.19     0.64  
woman_trans 0.64 0.21 -0.18   0.45    
persity_ol   0.10 0.13       0.64
kiss     0.64   0.13 0.11  
age_08 0.37 -0.38 -0.64 0.15   0.24 0.19
desired -0.19 0.26 0.62        
bondage_to   0.39   0.15   0.61  
woman -0.61 0.25 0.37 0.12 0.53 -0.10  
porn_visual   0.60 0.15     0.11  
voyeur_known 0.28 0.59 0.11   0.11 0.25  
rape_to 0.24   -0.59 0.20   0.20 0.21
anil_to_f   0.15   0.59 0.32 0.33  
insult_rec 0.21 0.29 -0.13     0.59  
persity_ah -0.13 0.12 0.59       0.21
rebel   0.58     0.10 0.18 0.22
persity_ch   0.13 0.58       0.25
persity_cl   0.23         0.58
coitus_m -0.58 0.27 0.41 0.16 0.51    
persity_nl -0.14 0.11 0.57       0.26
porn_video_mf   0.57 0.15   0.33 0.10  
persity_nh     -0.21       0.56
persity_el   0.20 0.29       0.55
voyeur_secret 0.20 0.55   0.12 0.14 0.27 0.16
fellatio_rec -0.21 0.55 0.31 0.18      
cunn_to -0.27 0.18 0.36 0.30 0.54 0.12  
feet_big 0.29   0.11       0.53
mast_to_f -0.34 0.27 0.39 0.20 0.52    
control_to   0.43   0.12   0.52 0.16
pain_to 0.18 0.23 -0.33 0.16   0.51 0.16
age_14 0.25   -0.50     0.15 0.19
persity_eh   0.38 0.50       0.20
hug   -0.13 0.50        
insult_to   0.42 -0.21 0.14   0.50 0.16
persity_al   0.20 -0.15     0.16 0.49
porn_video_ff -0.26 0.47     0.43 0.15  
butt_small   0.13 0.12     0.15 0.47
rape_rec 0.47   -0.40   0.11 0.38 0.20
porn_written 0.12 0.47 0.12     0.26  
woman_fem -0.45 0.32 0.33   0.47   0.11
feet_small       0.16     0.47
uncon 0.13 0.13 -0.46 0.23   0.23 0.31
breasts_small -0.12 0.17 0.17   0.46 0.15 0.40
urine_rec 0.46   -0.25 0.30   0.41  
persity_oh   0.44 0.45       0.13
semen_to_vag -0.36 0.30 0.17 0.32 0.45   0.23
leather 0.22 0.29       0.44  
anil_rec 0.40 0.20   0.44 -0.11 0.26  
incest 0.34   -0.42 0.11 0.10 0.20 0.25
woman_mas 0.27       0.41 0.21 0.33
breasts_big -0.40 0.31 0.12   0.40   0.12
mast_rec_m   0.39 0.40 0.12      
rich   0.40 0.21     0.17 0.35
objpen_to 0.12 0.39   0.24 0.23 0.36  
experienced   0.38 0.19     0.18 0.18
urine_to 0.37 0.17 -0.31 0.33   0.36  
mast_solo_m 0.22 0.36 0.19     0.13  
age_70 0.35   -0.23   0.10 0.16 0.32
virgin -0.17 0.33   0.17     0.32
feet 0.27     0.23 0.11 0.31 0.21
butt_big   0.29 0.17   0.13   0.14

Here I see:

  1. Androphilia
  2. Pornography and pornographic tropes
  3. Pleasantness and consent
  4. Butt stuff, maybe? Especially topping
  5. Gynophilia
  6. Kink and socially proscribed interests
  7. Interest in a vulnerable partner
factor.score.cors(l.male6, l.male7)
  ML1 ML2 ML3 ML4 ML5 ML6
ML1 1.00 -0.25 -0.36 -0.02 0.13 0.24
ML2 -0.23 0.99 0.38 0.05 -0.05 -0.11
ML3 -0.36 0.40 1.00 0.03 -0.16 -0.27
ML4 0.03 0.11 -0.11 0.48 -0.20 0.39
ML5 0.10 -0.05 -0.02 0.91 0.15 -0.01
ML6 0.19 -0.13 -0.19 0.00 0.15 0.93
ML7 0.10 -0.04 -0.16 0.00 0.96 0.15

Women

l.female2 = go.fa("Female", 2)
zcomb = combn(colnames(l.female2$pw), 2, simplify = F, FUN = function(iv)
    table(l.female2$pw[[iv[1]]], l.female2$pw[[iv[2]]]) == 0)
zero.prop.per.cell = mean(c(recursive = T, zcomb))
zero.prop.per.varpair = mean(sapply(zcomb, any))
round(d = 2, c(zero.prop.per.varpair, zero.prop.per.cell))
  value
  0.94 0.21
display.loadings(l.female2)
  ML1 ML2
desired   0.85
cunn_to 0.78  
porn_video_ff 0.76  
group_sex 0.74  
man   0.74
woman 0.74 -0.11
mast_to_f 0.74  
breasts_big 0.73  
in_rship   0.73
woman_fem 0.73 -0.14
intimacy -0.19 0.72
coitus_f   0.72
love -0.23 0.72
anil_to_f 0.71 -0.29
pleasure_to   0.71
incest 0.38 -0.69
voyeur_known 0.69 0.14
objpen_to 0.69 -0.13
breasts_small 0.69 -0.20
objpen_rec 0.67 0.26
woman_trans 0.67 -0.32
porn_visual 0.67 0.31
woman_mas 0.65 -0.28
kiss   0.64
man_trans 0.64 -0.26
stranger 0.63  
mast_rec_f 0.20 0.63
rape_to 0.45 -0.61
recent_acq 0.59  
pain_rec 0.58  
anil_to_m 0.58 -0.13
bondage_to 0.58 0.16
insult_rec 0.57  
anil_rec 0.57  
voyeur_secret 0.57  
insult_to 0.57 -0.13
porn_video_mf 0.57 0.35
friend 0.57  
porn_video_mm 0.57 -0.13
bondage_rec 0.56 0.28
porn_written 0.55 0.31
semen_swallow 0.54 0.25
mast_to_m 0.28 0.53
man_mas   0.53
semen_rec_anus 0.53  
butt_big 0.53  
pain_to 0.53 -0.23
semen_rec_mouth 0.53 0.27
persity_eh 0.25 0.52
age_14 0.24 -0.52
analpen_rec 0.52  
persity_nl   0.52
persity_ah   0.51
age_08 0.13 -0.50
cunn_rec 0.34 0.50
leather 0.50  
fellatio_to 0.41 0.49
uncon 0.41 -0.49
rebel 0.49 0.32
persity_ch   0.49
man_fem 0.48 -0.20
urine_to 0.48 -0.40
control_rec 0.48 0.30
rape_rec 0.47 -0.26
mast_solo_f 0.45 0.36
urine_rec 0.44 -0.44
persity_oh 0.36 0.44
penis_big 0.29 0.44
experienced 0.42 0.22
hug -0.12 0.41
control_to 0.41 0.11
semen_rec_vag 0.26 0.40
feet 0.40 -0.18
age_70 0.28 -0.39
persity_cl 0.38  
virgin 0.36  
rich 0.34 0.26
butt_small 0.34  
feet_small 0.33  
persity_nh 0.33 -0.24
persity_al 0.32 -0.13
feet_big 0.29  
penis_small 0.18 -0.18
persity_ol 0.13  
persity_el    

Looks like we have gynophilia and androphilia, respecitvely.

l.female3 = go.fa("Female", 3)
display.loadings(l.female3)
  ML1 ML2 ML3
woman 0.94    
mast_to_f 0.93    
woman_fem 0.91    
cunn_to 0.89   0.16
desired   0.84 0.15
breasts_big 0.83   0.19
porn_video_ff 0.82   0.26
breasts_small 0.79 -0.18 0.10
incest 0.21 -0.78 0.19
love -0.11 0.77  
in_rship   0.75  
intimacy -0.10 0.75  
rape_to 0.20 -0.73 0.31
semen_rec_mouth 0.14   0.70
semen_swallow 0.16   0.70
woman_mas 0.69 -0.28 0.13
pleasure_to   0.69 0.18
fellatio_to   0.31 0.69
age_14   -0.64 0.22
woman_trans 0.63 -0.35 0.21
kiss   0.62 0.12
anil_to_f 0.62 -0.35 0.29
objpen_to 0.62 -0.19 0.28
penis_big   0.26 0.61
semen_rec_anus 0.17 -0.17 0.61
uncon 0.18 -0.61 0.28
man -0.41 0.61 0.50
mast_rec_f 0.19 0.60 0.23
analpen_rec 0.18 -0.12 0.59
mast_to_m   0.37 0.59
coitus_f -0.30 0.58 0.53
control_rec 0.19 0.14 0.57
insult_rec 0.28 -0.18 0.55
semen_rec_vag   0.26 0.54
voyeur_known 0.54   0.43
urine_rec 0.23 -0.54 0.28
group_sex 0.54   0.52
recent_acq 0.29 -0.20 0.53
anil_to_m 0.26 -0.29 0.53
stranger 0.35 -0.21 0.53
bondage_rec 0.32 0.14 0.53
age_08   -0.53  
pain_rec 0.31 -0.17 0.52
persity_nl   0.52  
objpen_rec 0.47 0.14 0.52
rebel 0.24 0.18 0.52
porn_video_mf 0.36 0.23 0.52
insult_to 0.27 -0.28 0.52
urine_to 0.25 -0.52 0.33
man_trans 0.51 -0.33 0.30
persity_ah   0.51  
butt_big 0.50   0.21
porn_written 0.31 0.18 0.50
porn_visual 0.50 0.21 0.49
anil_rec 0.31 -0.13 0.49
cunn_rec 0.33 0.47 0.27
persity_ch   0.47  
rape_rec 0.17 -0.41 0.46
leather 0.25   0.46
persity_eh 0.14 0.45 0.31
man_mas -0.28 0.40 0.45
age_70 0.17 -0.44 0.14
pain_to 0.25 -0.38 0.43
friend 0.43   0.35
bondage_to 0.40   0.43
experienced 0.20 0.11 0.42
hug -0.13 0.40  
voyeur_secret 0.40   0.40
rich 0.16 0.15 0.39
control_to 0.22   0.38
porn_video_mm 0.37 -0.23 0.38
persity_cl 0.16 -0.13 0.36
man_fem 0.36 -0.26 0.25
persity_oh 0.24 0.35 0.34
persity_al   -0.25 0.35
mast_solo_f 0.35 0.30 0.34
persity_nh 0.11 -0.35 0.30
feet_big     0.34
feet 0.20 -0.29 0.31
penis_small   -0.27 0.22
butt_small 0.21   0.26
virgin 0.25   0.23
feet_small 0.21 -0.16 0.21
persity_ol   -0.12 0.19
persity_el      

Factor 1 is gynophilia. Androphilia seems to have been split between factors 2 and 3, which primarily represent [pleasantness and consent] and penis stuff, respectively.

factor.score.cors(l.female2, l.female3)
  ML1 ML2
ML1 0.74 -0.12
ML2 -0.38 0.98
ML3 0.68 0.03
l.female4 = go.fa("Female", 4)
display.loadings(l.female4)
  ML1 ML2 ML3 ML4
woman 0.94   0.15  
mast_to_f 0.92   0.13  
woman_fem 0.90   0.15  
cunn_to 0.87   0.22 0.10
breasts_big 0.81   0.27  
porn_video_ff 0.79   0.35  
intimacy -0.11 0.79    
in_rship   0.79    
love -0.10 0.78   -0.14
desired   0.78 0.24 -0.27
breasts_small 0.78 -0.13 0.11 0.22
pleasure_to   0.72 0.19  
incest 0.19 -0.71   0.36
semen_rec_mouth     0.68 0.19
fellatio_to   0.29 0.68 0.13
rape_to 0.17 -0.68 0.22 0.36
woman_mas 0.68 -0.20   0.30
semen_swallow 0.10   0.67 0.22
kiss   0.66 0.11  
penis_big -0.13 0.19 0.66  
control_rec 0.14   0.63  
mast_rec_f 0.16 0.62 0.25  
persity_ah   0.61   0.16
woman_trans 0.60 -0.25 0.15 0.40
persity_nl   0.60    
anil_to_f 0.59 -0.29 0.25 0.33
objpen_to 0.59 -0.10 0.23 0.34
coitus_f -0.35 0.50 0.58 -0.15
bondage_rec 0.27   0.58  
insult_rec 0.24 -0.23 0.58  
semen_rec_anus 0.12 -0.17 0.58 0.22
group_sex 0.49   0.58  
porn_video_mf 0.31 0.18 0.58  
stranger 0.30 -0.27 0.57  
penis_small       0.57
semen_rec_vag   0.22 0.56  
age_14   -0.56 0.11 0.35
analpen_rec 0.13 -0.11 0.56 0.21
recent_acq 0.24 -0.23 0.55 0.13
man_fem 0.32   0.11 0.55
rebel 0.19 0.15 0.55  
objpen_rec 0.42 0.13 0.55 0.12
mast_to_m -0.10 0.40 0.55 0.18
man -0.45 0.53 0.54 -0.16
porn_visual 0.45 0.18 0.54  
persity_ch   0.54    
uncon 0.15 -0.53 0.19 0.38
pain_rec 0.26 -0.19 0.53 0.14
feet_small 0.17     0.53
insult_to 0.23 -0.29 0.50 0.20
voyeur_known 0.50   0.47 0.12
man_trans 0.48 -0.19 0.19 0.50
man_mas -0.32 0.32 0.50 -0.13
porn_written 0.26 0.19 0.50 0.17
feet_big     0.20 0.48
hug -0.14 0.47    
butt_big 0.47   0.15 0.33
persity_eh 0.11 0.47 0.32  
persity_nh   -0.22 0.17 0.47
feet 0.17 -0.16 0.18 0.47
rape_rec 0.13 -0.44 0.46 0.15
anil_rec 0.27   0.45 0.25
anil_to_m 0.21 -0.22 0.44 0.39
age_08   -0.44 -0.12 0.32
urine_rec 0.20 -0.44 0.17 0.43
butt_small 0.17 0.12 0.15 0.44
persity_ol       0.44
leather 0.20   0.43 0.22
bondage_to 0.36   0.43 0.16
voyeur_secret 0.36   0.43 0.11
urine_to 0.22 -0.42 0.22 0.43
cunn_rec 0.30 0.42 0.35 -0.10
age_70 0.16 -0.32   0.41
friend 0.39 -0.13 0.40  
porn_video_mm 0.33 -0.14 0.30 0.39
rich 0.12 0.15 0.39 0.10
virgin 0.22   0.13 0.39
pain_to 0.21 -0.34 0.37 0.30
persity_oh 0.21 0.37 0.34  
experienced 0.16 0.16 0.37 0.27
persity_cl 0.12   0.28 0.36
persity_el   0.21   0.36
control_to 0.18   0.36 0.16
mast_solo_f 0.32 0.32 0.34 0.13
persity_al   -0.19 0.27 0.32

Factors 1 through 3 look the same. Factor 4 is mysterious. Maybe it's desire for a vulnerable partner.

factor.score.cors(l.female3, l.female4)
  ML1 ML2 ML3
ML1 1.00 -0.05 -0.03
ML2 -0.07 0.98 -0.17
ML3 0.12 0.06 0.93
ML4 0.10 -0.67 0.40
l.female5 = go.fa("Female", 5)
display.loadings(l.female5)
  ML1 ML2 ML3 ML4 ML5
woman 0.94     0.16  
mast_to_f 0.92     0.15  
woman_fem 0.90     0.15  
semen_rec_mouth 0.12   0.89 0.28  
semen_swallow 0.14   0.88 0.26 0.11
cunn_to 0.86     0.22  
breasts_big 0.81   0.10 0.27  
in_rship   0.79      
intimacy -0.10 0.79      
porn_video_ff 0.79   0.16 0.32  
desired   0.78   0.23 -0.25
love -0.10 0.78     -0.13
breasts_small 0.78 -0.13   0.11 0.20
pleasure_to   0.73 0.16 0.11  
incest 0.20 -0.71 0.15   0.33
woman_mas 0.68 -0.20     0.29
rape_to 0.18 -0.68 0.22 0.13 0.33
stranger 0.27 -0.29   0.67 0.12
kiss   0.66      
rebel 0.16 0.14   0.64 0.11
penis_big -0.15 0.19 0.24 0.63  
recent_acq 0.22 -0.25 0.11 0.63 0.16
mast_rec_f 0.17 0.62 0.13 0.19  
group_sex 0.47   0.14 0.61 0.12
woman_trans 0.61 -0.26   0.13 0.39
persity_ah   0.61     0.17
anil_to_f 0.60 -0.28 0.24 0.14 0.30
fellatio_to   0.32 0.60 0.42  
persity_nl   0.59      
objpen_to 0.59 -0.11   0.23 0.35
porn_video_mf 0.29 0.18 0.18 0.58  
semen_rec_anus 0.14 -0.15 0.57 0.30 0.16
man_fem 0.33 -0.11   0.12 0.56
man_mas -0.35 0.31   0.56  
age_14   -0.56 0.18   0.33
penis_small     0.12   0.56
control_rec 0.13   0.26 0.56  
feet_small 0.17       0.55
persity_ch   0.54      
uncon 0.16 -0.53 0.12 0.14 0.37
man -0.46 0.53 0.25 0.47 -0.14
porn_visual 0.43 0.18 0.20 0.53  
coitus_f -0.36 0.50 0.24 0.52 -0.13
bondage_rec 0.27 0.10 0.27 0.50  
feet_big     0.10 0.17 0.49
man_trans 0.49 -0.20 0.16 0.13 0.48
friend 0.37 -0.15   0.49  
voyeur_known 0.49   0.12 0.48 0.14
hug -0.13 0.48      
anil_to_m 0.23 -0.20 0.47 0.22 0.34
persity_ol       0.11 0.47
butt_big 0.47     0.15 0.33
analpen_rec 0.15   0.47 0.34 0.17
porn_written 0.25 0.19 0.22 0.47 0.18
persity_nh   -0.22 0.16 0.11 0.47
age_08   -0.46 -0.15   0.34
persity_eh   0.46   0.38 0.10
insult_to 0.22 -0.29 0.20 0.46 0.22
rich   0.14   0.45 0.14
objpen_rec 0.42 0.14 0.32 0.45 0.11
feet 0.18 -0.15 0.21   0.44
insult_rec 0.24 -0.21 0.37 0.44  
butt_small 0.17 0.11   0.12 0.44
rape_rec 0.14 -0.44 0.28 0.36 0.13
experienced 0.14 0.15   0.43 0.31
voyeur_secret 0.35   0.13 0.43 0.12
cunn_rec 0.29 0.43 0.12 0.33  
semen_rec_vag   0.23 0.37 0.43  
urine_rec 0.24 -0.42 0.31   0.38
bondage_to 0.35   0.11 0.42 0.19
urine_to 0.24 -0.41 0.28   0.38
mast_to_m   0.41 0.38 0.39 0.17
pain_rec 0.27 -0.17 0.41 0.36 0.11
virgin 0.22     0.15 0.41
leather 0.20   0.17 0.39 0.24
persity_cl 0.11     0.30 0.39
porn_video_mm 0.33 -0.15 0.16 0.25 0.38
control_to 0.17     0.38 0.19
persity_el   0.20     0.37
age_70 0.17 -0.32 0.19   0.37
persity_oh 0.19 0.37   0.37 0.12
anil_rec 0.29   0.36 0.27 0.22
pain_to 0.22 -0.34 0.22 0.30 0.29
persity_al   -0.19 0.11 0.27 0.33
mast_solo_f 0.31 0.32 0.17 0.32 0.13

I see:

  1. Gynophilia
  2. Pleasantness or consent
  3. Penis stuff
  4. Pornography and pornographic tropes
  5. The previous factor 4 (weird, possibly desire for a vulnerable partner)
factor.score.cors(l.female4, l.female5)
  ML1 ML2 ML3 ML4
ML1 1.00 -0.09 0.04 0.08
ML2 -0.06 1.00 0.01 -0.50
ML3 -0.05 -0.25 0.60 0.27
ML4 0.10 0.16 0.81 -0.13
ML5 0.04 -0.46 0.02 0.98
l.female6 = go.fa("Female", 6)
display.loadings(l.female6)
  ML1 ML2 ML3 ML4 ML5 ML6
woman 0.94     0.16    
mast_to_f 0.92     0.15    
woman_fem 0.90     0.15    
semen_rec_mouth 0.12   0.85 0.32 0.20 0.11
cunn_to 0.85     0.22 0.21  
semen_swallow 0.14   0.85 0.30 0.21 0.14
breasts_big 0.81     0.27    
intimacy -0.10 0.80        
in_rship   0.79        
desired   0.78   0.24   -0.24
porn_video_ff 0.78   0.12 0.33 0.13  
love   0.78     -0.11 -0.12
breasts_small 0.77 -0.13   0.11   0.22
pleasure_to   0.73 0.16 0.12    
incest 0.18 -0.71     0.19 0.31
anil_rec 0.23   0.18 0.28 0.71  
anil_to_f 0.55 -0.23   0.13 0.68 0.15
rape_to 0.17 -0.68 0.16 0.14 0.16 0.32
woman_mas 0.68 -0.21       0.32
stranger 0.26 -0.29   0.67   0.13
kiss   0.67        
rebel 0.15 0.13   0.64   0.12
penis_big -0.15 0.19 0.21 0.63    
anil_to_m 0.19 -0.17 0.31 0.23 0.63 0.23
recent_acq 0.21 -0.25   0.62 0.11 0.16
mast_rec_f 0.16 0.62 0.13 0.21    
man_fem 0.32 -0.12   0.11   0.62
group_sex 0.46     0.62   0.13
woman_trans 0.60 -0.27   0.13   0.42
persity_ah   0.60       0.19
penis_small   -0.11 0.11     0.59
persity_nl   0.59       0.11
porn_video_mf 0.29 0.18 0.16 0.58    
control_rec 0.12   0.20 0.58    
fellatio_to   0.31 0.56 0.45 0.16 0.10
man_mas -0.34 0.31   0.55    
age_14   -0.55 0.10   0.24 0.28
objpen_to 0.55     0.23 0.37 0.27
uncon 0.14 -0.54   0.15 0.17 0.34
porn_visual 0.43 0.17 0.16 0.54    
persity_ch   0.53       0.10
coitus_f -0.35 0.49 0.26 0.53 -0.11  
man_trans 0.48 -0.21 0.13 0.14   0.52
bondage_rec 0.25 0.10 0.20 0.52 0.16  
feet_small 0.16       0.17 0.52
man -0.44 0.52 0.29 0.48 -0.17  
hug -0.14 0.49     0.15  
voyeur_known 0.47     0.49 0.15 0.13
persity_nh   -0.23 0.13 0.11   0.49
persity_ol       0.10   0.48
feet_big       0.16 0.13 0.48
friend 0.36 -0.14   0.48   0.11
porn_written 0.25 0.17 0.19 0.48   0.21
insult_to 0.20 -0.29 0.12 0.47 0.19 0.19
objpen_rec 0.40 0.14 0.24 0.47 0.23  
insult_rec 0.24 -0.23 0.33 0.47 0.10  
persity_eh   0.46   0.38   0.11
analpen_rec 0.12   0.34 0.36 0.46  
rape_rec 0.14 -0.46 0.27 0.38   0.17
butt_big 0.46     0.15 0.18 0.30
semen_rec_anus 0.11 -0.14 0.46 0.34 0.41  
rich   0.14   0.45   0.16
butt_small 0.17 0.10   0.12   0.45
semen_rec_vag   0.20 0.40 0.45 -0.14 0.11
age_08   -0.44 -0.22   0.21 0.28
voyeur_secret 0.34     0.44 0.12 0.11
cunn_rec 0.29 0.43   0.34   -0.12
persity_el   0.19     -0.14 0.43
bondage_to 0.32     0.43 0.30 0.12
experienced 0.13 0.15   0.43 0.11 0.30
persity_cl 0.11     0.30   0.42
urine_rec 0.21 -0.42 0.21   0.35 0.32
mast_to_m -0.10 0.40 0.35 0.41   0.18
feet 0.16 -0.15 0.14   0.24 0.41
leather 0.18     0.41 0.17 0.21
urine_to 0.21 -0.40 0.17   0.39 0.31
virgin 0.21     0.15   0.40
pain_rec 0.26 -0.18 0.35 0.39 0.17 0.11
age_70 0.17 -0.33 0.17     0.39
control_to 0.14     0.38 0.32 0.11
porn_video_mm 0.31 -0.14   0.25 0.19 0.38
persity_oh 0.18 0.37   0.37 0.15  
persity_al   -0.20   0.27   0.35
pain_to 0.19 -0.33 0.11 0.32 0.28 0.24
mast_solo_f 0.30 0.31 0.15 0.32   0.14
  1. Gynophilia
  2. Pleasantness or consent
  3. Penis stuff
  4. Pornography and pornographic tropes
  5. Butt stuff
  6. Desire for a vulnerable partner
factor.score.cors(l.female5, l.female6)
  ML1 ML2 ML3 ML4 ML5
ML1 1.00 -0.06 0.01 0.05 0.03
ML2 -0.08 1.00 -0.23 0.15 -0.46
ML3 0.00 -0.12 0.97 -0.03 0.00
ML4 0.05 0.14 0.08 1.00 -0.07
ML5 0.12 -0.32 0.31 0.01 0.44
ML6 0.07 -0.44 0.15 -0.05 0.97
l.female7 = go.fa("Female", 7)
display.loadings(l.female7)
  ML1 ML2 ML3 ML4 ML5 ML6 ML7
woman 0.94           0.14
mast_to_f 0.92           0.11
woman_fem 0.91           0.13
cunn_to 0.86     0.12 0.19   0.19
semen_rec_mouth 0.13   0.85 0.24 0.17 0.11 0.24
semen_swallow 0.15   0.84 0.23 0.18 0.15 0.22
breasts_big 0.82     0.20     0.12
in_rship   0.81          
porn_video_ff 0.80   0.12 0.27 0.12   0.13
intimacy -0.11 0.80          
desired   0.79   0.22   -0.26  
love   0.78     -0.10 -0.13  
breasts_small 0.77 -0.11       0.22 0.19
pleasure_to   0.74 0.16        
incest 0.18 -0.70     0.16 0.33 0.12
bondage_rec 0.24 0.17 0.15 0.24     0.70
control_rec 0.12 0.14 0.16 0.31     0.70
anil_to_f 0.57 -0.23     0.69 0.17 0.18
woman_mas 0.67 -0.19       0.32 0.16
anil_rec 0.25   0.19 0.18 0.67   0.26
kiss   0.66          
rape_to 0.17 -0.65 0.15   0.10 0.33 0.29
mast_rec_f 0.17 0.62 0.13 0.18      
man_fem 0.32         0.62 0.11
porn_video_mf 0.33 0.15 0.17 0.62      
anil_to_m 0.20 -0.17 0.32 0.15 0.62 0.25 0.21
pain_rec 0.25 -0.12 0.31 0.12     0.61
penis_big -0.11 0.18 0.22 0.61     0.20
persity_ah   0.60       0.18  
woman_trans 0.60 -0.24       0.43 0.18
man_mas -0.31 0.29   0.60      
penis_small   -0.10 0.11     0.60  
stranger 0.29 -0.29   0.59   0.14 0.29
persity_nl   0.59          
insult_rec 0.23 -0.17 0.30 0.21     0.58
recent_acq 0.24 -0.26   0.57 0.11 0.17 0.23
fellatio_to   0.31 0.56 0.41 0.15 0.10 0.18
bondage_to 0.31 0.15   0.20 0.22 0.11 0.56
objpen_to 0.56     0.12 0.32 0.28 0.24
pain_to 0.18 -0.27     0.18 0.24 0.55
rebel 0.18 0.15   0.55   0.11 0.32
persity_ch   0.55          
group_sex 0.49 -0.10   0.54   0.14 0.25
porn_visual 0.46 0.15 0.18 0.53     0.12
coitus_f -0.32 0.49 0.26 0.53     0.12
man_trans 0.48 -0.18 0.12     0.53 0.23
feet_small 0.17     0.10 0.17 0.52  
age_14   -0.51   -0.13 0.18 0.29 0.29
man -0.41 0.50 0.30 0.51 -0.14    
uncon 0.14 -0.50     0.11 0.35 0.30
voyeur_known 0.50     0.46 0.15 0.14 0.15
insult_to 0.21 -0.25 0.10 0.28 0.12 0.19 0.49
hug -0.14 0.49     0.16    
feet_big       0.19 0.14 0.49  
persity_nh   -0.21 0.11     0.48 0.19
persity_ol       0.12   0.48  
butt_big 0.46     0.11 0.18 0.31  
leather 0.18     0.23   0.20 0.46
butt_small 0.18     0.15   0.46  
control_to 0.14     0.20 0.26 0.10 0.46
persity_eh 0.11 0.45   0.38      
semen_rec_anus 0.12 -0.11 0.45 0.18 0.35 0.10 0.37
voyeur_secret 0.37     0.45 0.14 0.13  
porn_written 0.27 0.17 0.19 0.45   0.21 0.19
age_08   -0.45 -0.22   0.23 0.29  
mast_to_m   0.39 0.37 0.43 0.11 0.19  
cunn_rec 0.30 0.43   0.31   -0.11 0.10
semen_rec_vag   0.20 0.41 0.43 -0.13 0.10 0.14
rape_rec 0.14 -0.42 0.25 0.21   0.17 0.42
friend 0.39 -0.15   0.42   0.12 0.19
experienced 0.15 0.14   0.42 0.12 0.30 0.11
persity_el   0.21     -0.17 0.42  
rich 0.11 0.14   0.42   0.16 0.17
persity_cl 0.12     0.26   0.42 0.16
objpen_rec 0.41 0.16 0.23 0.34 0.18   0.34
feet 0.16 -0.14 0.14   0.20 0.41 0.14
analpen_rec 0.13   0.34 0.23 0.41   0.35
age_70 0.17 -0.34 0.18     0.40  
virgin 0.21     0.10   0.40 0.12
urine_rec 0.20 -0.40 0.20   0.30 0.33 0.19
persity_oh 0.19 0.39   0.28 0.13   0.25
porn_video_mm 0.33 -0.14 0.10 0.20 0.17 0.39 0.14
urine_to 0.21 -0.39 0.17   0.35 0.32 0.19
mast_solo_f 0.33 0.29 0.16 0.36   0.14  
persity_al   -0.17   0.17   0.35 0.27
  1. Gynophilia
  2. Pleasantness or consent
  3. Penis stuff
  4. Pornography and pornographic tropes
  5. Butt stuff
  6. Desire for a vulnerable partner
  7. Kink
factor.score.cors(l.female6, l.female7)
  ML1 ML2 ML3 ML4 ML5 ML6
ML1 1.00 -0.04 0.00 0.09 0.04 0.04
ML2 -0.07 1.00 -0.13 0.15 -0.27 -0.44
ML3 0.00 -0.14 1.00 0.04 0.08 0.07
ML4 0.00 0.27 -0.12 0.88 -0.10 -0.11
ML5 0.03 -0.22 -0.01 -0.01 0.97 0.19
ML6 0.06 -0.46 0.08 -0.07 0.25 1.00
ML7 0.02 -0.24 0.29 0.45 0.26 0.11

Cluster prediction

I want a procedure that can cluster items, then use these clusters to predict unobserved values of the variables in new cases. My strategy (implemented in cluster-prediction.R) is as follows.

  • The procedure accepts a training set, in which a response is present for every item for every subject.
  • The procedure uses the training set to partition the items into clusters.
  • It then, again inside the training set, constructs a simple model predicting each item given the median value of all other (standardized) items in the cluster.
  • Given a test set, which is similar to the training set but has all new subjects and is missing some responses, the procedure predicts the missing responses using the simple model (re-applying whatever standardizing transformations it used during training).

Now, it's true that when we're trying to apply the models in the test set we in general won't have access to every other item in the cluster other than the DV. But the bigger the cluster and the more similar its items, the more accurately we can estimate the cluster median with only some of the items. Also, the median is robust enough that it should be little affected by a few missing items.

Here's a trial run with fake data.

test.clustering.d = local(
   {set.seed(20)
    n = 100
    ief = rnorm(100)
    t(sapply(1 : n, function(i)
       {f1 = rnorm(1, sd = 5)
        f2 = rnorm(1, sd = 5)
        f3 = rnorm(1, sd = 5)
        f4 = rnorm(1, sd = 5)
        c(
            x.f1.1 = f1 + rnorm(1) + ief[1],
            x.f1.2 = f1 + rnorm(1) + ief[2],
            x.f1.3 = f1 + rnorm(1) + ief[3],
            x.f1.4 = f1 + rnorm(1) + ief[4],
            x.f2.1 = f2 + rnorm(1) + ief[5],
            x.f2.2 = f2 + rnorm(1) + ief[6],
            x.f2.3 = f2 + rnorm(1) + ief[7],
            x.f2.4 = 1.5 * (f2 + rnorm(1) + ief[8]),
            x.f2.5 = 1 + f2 + rnorm(1) + ief[9],
            x.f3.p4.1 = f3 + f4/2 + rnorm(1) + ief[10],
            x.f3.p4.2 = f3 + f4/2 + rnorm(1) + ief[11],
            x.f3.p4.3 = f3 + f4/2 + rnorm(1) + ief[12],
            x.f4.p3.1 = f4 + f3/2 + rnorm(1) + ief[13],
            x.f4.p3.2 = f4 + f3/2 + rnorm(1) + ief[14],
            x.f4.p3.3 = f4 + f3/2 + rnorm(1) + ief[15])}))})
ks = 2:6
results = cached(data.frame(v = sapply(ks, function(k)
   {pred = cv.cluster.prediction(test.clustering.d, k)
    rmsd(pred, test.clustering.d)})))
results = rbind(v = sd(test.clustering.d), results)
rownames(results) = c("SD", paste("k =", ks))
rd(results)
  v
SD 5.748
k = 2 3.554
k = 3 2.226
k = 4 1.263
k = 5 1.844
k = 6 1.990

Notice that the most logical number of clusters, 4, yields the least prediction error.

Now for the real thing. Gentlemen first.

pw.m = as.matrix(remove.na.prefwide.cols(
    ss(prefwide, sb[row.names(prefwide), "gender"] == "Male")))
ks = 1:15
preds = cached(lapply(ks, function(k)
   {message("k = ", k)
    cv.cluster.prediction.prefs(pw.m, k = k)}))
results = data.frame(row.names = paste("k =", ks),
    v = sapply(preds, function(pred)
        mean(
        colMeans(abs(pred - pw.m)))))
results = rbind(
    v = mean(
        mapcols(pw.m, function(v) mean(abs(v - median(v))))),
    results)
rd(d = 2, results)
  v
v 1.10
k = 1 1.13
k = 2 1.09
k = 3 1.04
k = 4 1.03
k = 5 1.01
k = 6 1.00
k = 7 0.99
k = 8 0.98
k = 9 0.97
k = 10 0.98
k = 11 0.97
k = 12 0.97
k = 13 0.97
k = 14 0.97
k = 15 0.96
rd(d = 2, results[which.min.hastie(results$v),, drop = F])
  v
k = 5 1.01

Ladies:

pw.f = as.matrix(remove.trivial.prefwide.cols(
    ss(prefwide, sb[row.names(prefwide), "gender"] == "Female")))
preds.f = cached(lapply(ks, function(k)
   {message("k = ", k)
     cv.cluster.prediction.prefs(pw.f, k = k)}))
results = data.frame(row.names = paste("k =", ks),
    v = sapply(preds.f, function(pred)
        quantile(p = .95,
        colMeans(abs(pred - pw.f)))))
results = rbind(
    v = quantile(p = .95,
        mapcols(pw.f, function(v) mean(abs(v - median(v))))),
    results)
rd(d = 2, results)
  v
v 2.05
k = 1 1.70
k = 2 1.73
k = 3 1.70
k = 4 1.68
k = 5 1.66
k = 6 1.64
k = 7 1.61
k = 8 1.64
k = 9 1.57
k = 10 1.60
k = 11 1.61
k = 12 1.57
k = 13 1.59
k = 14 1.56
k = 15 1.57
rd(d = 2, results[which.min.hastie(results$v),, drop = F])
  v
k = 4 1.68

Criterion variables

Other variables in the dataset we might try to predict using sexual preferences include:

  • Number of sex partners
  • Condom use, and for women, pill compliance
  • Frequencies of perisexual drug use (especially drinking)
  • Externalizing
table(sb[good.s, "partners_year"])
  count
0 63
1 269
2 47
3 38
4 12
5 8
6 3
7 1
8 3
10 2
12 2
13 1
19 1
100 1

Dichotomized by whether the number of partners is 2 or more.

table(sb[good.s, "partners_year"] >= 2)
  count
FALSE 332
TRUE 119
t(sapply(condom, function(v) table(v, useNA = "always")))
  Never Rare Stimes Usual Always NA
condom_fellatio_rec 162 34 23 9 5 267
condom_coitus_m 54 47 44 50 35 270
condom_analpen_to_m 12 3 0 4 13 468
condom_analpen_to_f 46 25 19 15 26 369
condom_coitus_f 79 33 34 40 34 280
condom_fellatio_to 196 19 11 10 7 257
condom_analpen_rec 79 11 17 14 18 361

The same data with all non-Never values collapsed:

t(sapply(condom, function(v) table(v != "Never", useNA = "always")))
  FALSE TRUE NA
condom_fellatio_rec 162 71 267
condom_coitus_m 54 176 270
condom_analpen_to_m 12 20 468
condom_analpen_to_f 46 85 369
condom_coitus_f 79 141 280
condom_fellatio_to 196 47 257
condom_analpen_rec 79 60 361
table(dwide$contraceptive_pills, useNA = "always")
  count
? 1
0 25
1 1
2 1
3 4
4 45
N/A 161
NA 262

This item doesn't seem to have any variability of the kind we want.

rbind(
    alcohol = table(sb[good.s, "alcohol_freq"]),
    odrugs = table(sb[good.s, "odrugs_freq"]))
  Never Rare Stimes Usual Always
alcohol 137 142 140 21 5
odrugs 326 60 38 16 9
ggplot(sb[good.s,]) +
    geom_dotplot(aes(dinhib), binwidth = 1, stackratio = .75) +
    scale_y_continuous(breaks = NULL) +
    scale_x_continuous(breaks = seq(0, 60, 5)) +
    coord_cartesian(xlim = c(-2, 62))

dinhib-dotplot.png

Ridge regression

Here I attempt to predict some of the criterion variables with ridge regression on all of the preferences items.

For the logistic-regression models, NLL2 is the mean negative log-likelihood, base 2 (a proper scoring rule; Buja, Stuetzle, & Shen, 2005).

Drinking

Per gender:

rd(with(ss(sb[good.s,], !is.na(alcohol_freq)),
    predwithpref.bygender.logit(char(s), alcohol_freq != "Never")))
  Accuracy NLL2
Male baseline 0.696 0.886
Male model 0.700 0.882
Female baseline 0.698 0.884
Female model 0.698 0.893

Model combining both genders:

rd(with(ss(sb[good.s,], !is.na(alcohol_freq)),
    predwithpref.bothgenders.logit(char(s), alcohol_freq != "Never")))
  Accuracy NLL2
baseline 0.697 0.885
model 0.697 0.881

Failure.

Number of partners in the past year

Per gender:

rd(with(sb[good.s,],
    predwithpref.bygender.logit(char(s), partners_year >= 2)))
  Accuracy NLL2
Male baseline 0.683 0.902
Male model 0.665 0.871
Female baseline 0.800 0.722
Female model 0.805 0.639

Model combining both genders:

rd(with(sb[good.s,],
    predwithpref.bothgenders.logit(char(s), partners_year >= 2)))
  Accuracy NLL2
baseline 0.739 0.815
model 0.748 0.740

Not much.

Condom use

condom.ses = intersect(
    with(sb[good.s,], char(s)[
        gender == "Male" & partners_year_f >= 2]),
    row.names(ss(condom, !is.na(condom_coitus_m))))
c("Sample size" = length(condom.ses))
  value
Sample size 65
rd(predwithpref.onegender.logit(
    condom.ses,
    condom[condom.ses, "condom_coitus_m"] >= "Usual",
    "Male"))
  Accuracy NLL2
Male baseline 0.585 0.979
Male model 0.523 1.041

Failure: the ridge regression overfit, maybe because of the small sample size.

Externalizing

rd(with(sb[good.s,],
    predwithpref.bygender.normal(char(s), sqrt(dinhib), y.min = 0)))
  RMSE
Male baseline 1.260
Male model 1.234
Female baseline 1.380
Female model 1.292

Not much.

Gender differences in preferences

Plots

Instead of point predictions, let's consider prediction intervals. (I'd like tolerance intervals, but how am I going to get tolerance intervals for a rating scale?) Below are 50% HDIs for each gender and item.

local(
   {ses = row.names(ss(sb[good.s,],
        gender %in% qw(Male, Female)))
    gender = sb[ses, "gender"]
    pwu = pwu[ses,]
    f = function(x) data.frame(discrete.hdi(
        as.integer(na.omit(x)), p = .5))
    d = do.call(rbind, lapply(pwu.items, function(pwi) rbind(
         data.frame(item = pwi, gender = "Male", f(pwu[gender == "Male", pwi])),
         data.frame(item = pwi, gender = "Female", f(pwu[gender == "Female", pwi])))))
    d = ordf(
        transform(d, item = factor(item, levels =
            names(sort(sapply(pwu, function(v) mean(v, na.rm = T)))))),
        item, gender)
    ggplot(d) +
        geom_linerange(
           aes(
               #int(item) + ((gender == "Female") - .5)/10,
               item,
               ymin = lo - .1, ymax = hi + .1,
               color = gender),
           size = 1.25,
           position = position_dodge(height = 0, width = .2)) +
        scale_y_continuous(breaks = 1:7) +
        scale_color_manual(values = c(Male = "blue", Female = "red")) +
        theme(
            panel.grid.major.y = element_blank(),
            panel.grid.minor = element_blank()) +
        coord_flip()})

genderdiff-intervals.png

Interesting.

Here's a mosaic plot, which can be especially helpful (vs. the interval graph above) for items with ceiling or floor effects.

d = local(
   {ses = row.names(ss(sb[good.s,],
        gender %in% qw(Male, Female)))
    d = melt(cbind(ses, pwu[ses,]))
    colnames(d) = qw(s, item, v)
    d = ordf(
        transform(d, item = factor(item, levels =
            names(sort(sapply(pwu, function(v) -mean(v, na.rm = T)))))),
        s, item)
    d})
mosaicplot(dir = qw(h, h, v), las = 1, with(d, table(
    item,
    droplevels(sb[char(s), "gender"]),
    v)))

genderdiff-mosaic.png

Let's construct HDIs for within-subject differences between items that are in some sense opposite, such as bnip_rec versus bnip_to and virgin versus experienced.

opposites = qw(
    anil_to, anil_rec,
    mast_to, mast_rec,
    objpen_to, objpen_rec,
    control_to, control_rec,
    pain_to, pain_rec,
    bondage_to, bondage_rec,
    urine_to, urine_rec,
    insult_to, insult_rec,
    rape_to, rape_rec,
    porn_visual, porn_written,
    voyeur_known, voyeur_secret,
    voyeur_known, exhibit,
    stranger, in_rship,
    penis_big, penis_small,
    breasts_big, breasts_small,
    butt_big, butt_small,
    feet_big, feet_small,
    man, woman,
    man_mas, man_fem,
    woman_mas, woman_fem,
    man_trans, woman_trans,
    age_14, age_70,
    rich, rebel,
    virgin, experienced,
    persity_el, persity_eh,
    persity_al, persity_ah,
    persity_cl, persity_ch,
    persity_nl, persity_nh,
    persity_ol, persity_oh)
opprefs = do.call(rbind, lapply(seq(1, length(opposites), 2), function(i)
   {p1 = opposites[i]
    p2 = opposites[i + 1]
    minuend = (
        if (p1 == "voyeur_both")
            pmax(pwu$voyeur_known, pwu$voyeur_secret)
        else
            pwu[,p1])
    subtrahend = pwu[,p2]
    data.frame(
       s = row.names(pwu),
       item = paste(p2, "<", p1),
       v = minuend - subtrahend)}))
local(
   {ses = row.names(ss(sb[good.s,],
        gender %in% qw(Male, Female)))
    opprefs = ss(opprefs, char(s) %in% ses)
    f = function(x) data.frame(discrete.hdi(
        as.integer(na.omit(x)), p = .5))
    d = do.call(rbind, lapply(levels(opprefs$item), function(itn) rbind(
         data.frame(item = itn, gender = "Male", f(ss(opprefs, item == itn & sb[s, "gender"] == "Male")$v)),
         data.frame(item = itn, gender = "Female", f(ss(opprefs, item == itn & sb[s, "gender"] == "Female")$v)))))
     d = ordf(
         transform(d, item = factor(item, levels =
             names(sort(with(opprefs, tapply(v, item, function(v) mean(v, na.rm = T))))))),
         item, gender)
    ggplot(d) +
        geom_linerange(
           aes(
               item,
               ymin = lo - .1, ymax = hi + .1,
               color = gender),
           size = 1.25,
           position = position_dodge(height = 0, width = .2)) +
        scale_y_continuous(breaks = seq(-6, 6, 2)) +
        scale_color_manual(values = c(Male = "blue", Female = "red")) +
        theme(
            panel.grid.major.y = element_blank(),
            panel.grid.minor = element_blank()) +
        coord_flip()})

genderoppdiff-intervals.png

Interpretation

I've grouped the items according to theoretical prediction, although the description of each item here is of the sample rather than the theoretical prediction.

  • Social distance
    love
    F somewhat more likely to choose 7
    in_rship
    similar to love
    intimacy
    similar to love
    stranger
    M about uniform, F mode 1
    recent_acq
    M about uniform, F mode 1
    friend
    M higher
    group_sex
    M mode 7, F mode 1
    kiss
    F more likely to choose 7
    hug
    F higher
    mast_solo
    F mode 7, M mode 4
  • Power
    rebel
    M slightly higher
    rape_rec
    F higher
    rape_to
    M higher
    control_rec
    F mode 7, M mode 1
    control_to
    M mode 7, F mode 1 (but close to uniform for both
    bondage_rec
    F mode 7, M mode 1
    bondage_to
    F slightly higher
    exhibit
    both about uniform, but F is more polarized
    voyeur_known
    M mode 7, F mode 1 (but close to uniform for both)
    voyeur_secret
    M about uniform, F mode 1
    insult_to
    M higher
    insult_rec
    M dislike less
    urine_to
    M higher
    uncon
    M higher
    urine_rec
    M higher
    age_70
    M higher
    incest
    M higher
    age_14
    M higher
    age_08
    M higher
    pain_rec
    F dislike less
    pain_to
    M higher
  • Signs of reproductive health
    experienced
    M slightly higher
    virgin
    M mode 7, F mode 1
    feet_small
    M higher
    feet_big
    M slightly higher
    butt_big
    M mode 7, F mode 1
  • Written vs. visual porn
    porn_written
    F higher
    porn_visual
    M higher
  • Resources
    rich
    M slightly higher
  • Misc. (see below):
    desired
    M choose 6s (vs. 7s) about twice as often
    pleasure_to
    F slightly more likely to choose 7
  • Gender preferences (boring)
    woman
    M mode 7, F mode 1
    woman_fem
    F mode 7, M mode 1
    breasts_big
    M mode 7, F mode 1
    breasts_small
    M mode 4, F mode 1
    penis_small
    F higher
    penis_big
    F mode 7, M mode 1
    woman_mas
    M dislike less
    man
    F mode 7, M mode 1
    man_mas
    F mode 7, M mode
    man_fem
    F higher
    cunn_to
    M mode 7, F mode 1
    semen_rec_mouth
    F dislike less
    semen_swallow
    F higher
    semen_rec_anus
    F higher
    fellatio_to
    F mode 7, M mode 1
  • No obvious prediction a priori
    butt_small
    M dislike less
    feet
    M higher
    coitus
    M somewhat more likely to choose 7
    persity_ah
    similar
    mast_rec
    F more likely to choose 7
    persity_oh
    M slightly higher
    mast_to
    M higher
    persity_nl
    F slightly higher
    persity_eh
    M slightly higher
    persity_ch
    F slightly higher
    bnip_to
    M mode 7, F mode 1
    underwear
    M slightly higher
    bnip_rec
    F mode 7, M about uniform
    roleplay
    M slightly higher
    persity_el
    M higher
    objpen_to
    M about uniform, F mode 1
    persity_ol
    M dislike less
    persity_cl
    M dislike less
    objpen_rec
    F mode 7, M mode 1
    leather
    both about uniform, but F is more polarized
    anil_to
    M higher
    anil_rec
    both dislike, but F is more polarized
    persity_al
    M higher
    persity_nh
    M dislike less
    analpen_rec
    F higher
    woman_trans
    M dislike less
    man_trans
    F higher

Compromise data analysis

We'll do a (statistically dubious) χ2 test on the whole table (treating the interaction of gender and item as a single factor), then provide estimates with a Bayesian categorical model.

local(
   {ses = ggood.s
    d = melt(cbind(ses, pwu[ses, names(unlist(unname(itemgroups)))]))
    colnames(d) = qw(s, item, v)
    xt = with(d, chisq.test(
        droplevels(interaction(item, sb[char(s), "gender"])),
        v))
    c(xt$statistic, xt$parameter, p = xt$p.value)})
  value
X-squared 29115.16
df 486.00
p 0.00

Significant at some very small p (let's say p < .001); no big surprise there.

local(
   {ses = ggood.s
    d = melt(cbind(ses, pwu[ses, names(unlist(unname(itemgroups)))]))
    colnames(d) = qw(s, item, v)
    d = ddply(d, .(item), function(slice)
       {xt = with(slice, chisq.test(
            droplevels(sb[char(s), "gender"]),
            v))
        c(xt$statistic, xt$parameter, p = rd(d = 3, xt$p.value))})
    ordf(d, -p)})
  item X-squared df p
17 bondage_to 5.127628 6 0.528
41 pleasure_to 5.411887 6 0.492
27 age_08 8.665882 6 0.193
30 pain_to 9.041871 6 0.171
11 rebel 11.807334 6 0.066
35 feet_big 12.093654 6 0.060
12 rape_rec 13.302938 6 0.038
26 age_70 15.908568 6 0.014
5 in_rship 17.358862 6 0.008
13 rape_to 19.322632 6 0.004
18 exhibit 21.256323 6 0.002
40 desired 20.934090 6 0.002
19 voyeur_known 22.662430 6 0.001
23 urine_to 22.897185 6 0.001
24 urine_rec 23.142820 6 0.001
1 love 28.031677 6 0.000
2 intimacy 41.230457 6 0.000
3 kiss 44.654504 6 0.000
4 hug 56.160757 6 0.000
6 friend 181.558345 6 0.000
7 recent_acq 188.918032 6 0.000
8 stranger 138.987030 6 0.000
9 group_sex 105.192518 6 0.000
10 mast_solo 68.147727 6 0.000
14 control_rec 62.033867 6 0.000
15 control_to 34.232169 6 0.000
16 bondage_rec 68.609541 6 0.000
20 voyeur_secret 32.822227 6 0.000
21 insult_to 65.515668 6 0.000
22 insult_rec 25.751995 6 0.000
25 uncon 58.606553 6 0.000
28 incest 53.058759 6 0.000
29 pain_rec 28.689436 6 0.000
31 experienced 29.119596 6 0.000
32 virgin 206.483394 6 0.000
33 age_14 65.512431 6 0.000
34 feet_small 98.116940 6 0.000
36 butt_big 162.264495 6 0.000
37 porn_written 36.977414 6 0.000
38 porn_visual 42.790112 6 0.000
39 rich 25.005620 6 0.000

We now model each item and gender as an independent categorical distribution. Each is assigned a flat Dirichlet prior.

categorical.cellprobs(v, prior.α)
   {t = tabulate(v)
    t = c(t, rep(0, length(prior.α) - length(t)))
    α = t + prior.α
      # This is the posterior estimate of α, the parameter
      # of the Dirichlet distribution.
    # Now estimate the cell probabilities with the posterior
    # means. (Why means? By the law of total probability,
    # the marginal probability is the mean of the conditional
    # probabilities.)
    α / sum(α)}

Of course, writing this function only makes me realize that making this Bayesian correction to estimate the cell probabilities consists just of adding 1 to each cell before taking proportions. Works for me.

item.genderdiff.plot(good.s, prior.inc = 1) +
    theme_bw(base_size = 12) +
    theme(panel.border = element_blank())

genderdiff-grouped.png

Paper plans

  • Introduction
    • As in the proposal paper, distinguish sexual orientation from sexual preferences and argue that sexual preferences for things other than gender has received insufficient attention.
    • Discuss what theory suggests should distinguish men's and women's (at least American men's and women's) sexual preferences for things other than just gender. (The items for each category are listed above.)
      • Social distance: because of differential parental investment, women should require intimacy and commitment more than men do. Thus, compared to men, they should be more sexually interested in things implying closeness to a single partner and less in things implying distance or a lack of a committed partner.
      • Resources: Women should be sexually interested in the rich, famous, and competent because this provides evidence of being able to support a large family.
      • Power: Men should seek power over women in order to prevent being cuckolded. (Again because of differential parental investment, women don't need men to be faithful as much as men need women to be faithful.) They should also be sexually interested in expressing dominance over women in order to reinforce the general social arrangement of men dominating women (Vandermassen, 2011, describes how feminist and evolutionary theory agree here). Women, conversely, should be sexually interested in expressing submission to men to provide reassurance that they're playing along. It's in their evolutionary interests to be able to cheat when they want to, but the more they can convince a mate they're obedient, the better their chances of being able to cuckold him without him noticing (and thus trick him into raising another man's child).
      • Signs of reproductive health: In women, small feet are associated with nulliparity and large buttocks are associated with youth, so men should be attracted to these whereas women shouldn't care. Virgins are of course (without artifical insemination) nulliparious, so men should prefer virgins, too. Women by contrast may actually prefer men who are sexually experienced because this will increase their sons' sexual success more than it will hurt their own reproductive chances with this man (the sexy-son hypothesis).
      • Written vs. visual porn: Ellis and Symons (1990) argue that written porn is more popular among women and visual porn among men because women care more about emotions and context and men more about raw fertility cues.
      • Misc.
        • pleasure_to: Ogas and Gaddam (2011) p. 57 claim men are particularly concerned that women's expressed sexual pleasure is genuine in order to help ensure her faithfulness.
        • desired: Ogas and Gaddam (2011) p. 40 claim women particularly desire men to sexually interested in them in order to help ensure his faithfulness.
    • Brief high-level overview of method
  • Method
  • Results
  • Discussion

References

Ariely, D., Loewenstein, G., & Prelec, D. (2006). Tom Sawyer and the construction of value. Journal of Economic Behavior and Organization, 60, 1–10. doi:10.1016/j.jebo.2004.10.003

Backus, F. R., & Mahalik, J. R. (2011). The masculinity of Mr. Right: Feminist identity and heterosexual women's ideal romantic partners. Psychology of Women Quarterly, 35(2), 318–326. doi:10.1177/0361684310392357

Buja, A., Stuetzle, W., & Shen, Y. (2005, November 3). Loss functions for binary class probability estimation and classification: Structure and applications. Retrieved from http://www.stat.washington.edu/wxs/Learning-papers/paper-proper-scoring.pdf

Ellis, B. J., & Symons, D. (1990). Sex differences in sexual fantasy: An evolutionary psychological approach. Journal of Sex Research, 27(4), 527–555. doi:10.1080/00224499009551579

Figueredo, A. J., Sefcek, J. A., & Jones, D. N. (2006). The ideal romantic partner personality. Personality and Individual Differences, 41(3), 431–441. doi:10.1016/j.paid.2006.02.004

Fletcher, G. J. O., Simpson, J. A., Thomas, G., & Giles, L. (1999). Ideals in intimate relationships. Journal of Personality and Social Psychology, 76(1), 72–89. doi:10.1037/0022-3514.76.1.72

Lukaszewski, A. W., & Roney, J. R. (2010). Kind toward whom? Mate preferences for personality traits are target specific. Evolution and Human Behavior, 31(1), 29–38. doi:10.1016/j.evolhumbehav.2009.06.008

Ogas, O., & Gaddam, S. (2011). A billion wicked thoughts: What the world's largest experiment reveals about human desire. New York, NY: Dutton. ISBN 978-0-525-95209-1.

Van den Bergh, B., Dewitte, S., & Warlop, L. (2008). Bikinis instigate generalized impatience in intertemporal choice. Journal of Consumer Research, 35, 85–97. doi:10.1086/525505

Vandermassen, G. (2011). Evolution and rape: A feminist Darwinian perspective. Sex Roles, 64(9, 10), 732–747. doi:10.1007/s11199-010-9895-y