1 Load data

#load 

facedata <- read.csv("face_analyses_data_finalsample_correctedNAs.csv", header=TRUE) %>%
  mutate(EarningslastyearinCordobas = ifelse(is.na(EarningslastyearinCordobas),0,EarningslastyearinCordobas),
         EarningslastyearinDollars = ifelse(is.na(EarningslastyearinDollars),0,EarningslastyearinDollars)) %>%
  mutate(income = EarningslastyearinCordobas/34 + EarningslastyearinDollars) %>%
  mutate(rural = ifelse(village == 0,0,1)) %>%  # village0 = Managua
  mutate(rel = ifelse(CohabitingLivingwithSomeone0yes1no == 0,1,0)) %>%
  mutate(sex = Sex0male1female) %>%
  mutate(educ = Totalyearseducation)  %>%
  mutate(TV = HowmanyhoursTVlast7days,
         TV_ln = (log(HowmanyhoursTVlast7days+1))) %>%
  mutate(MascPref_MF = MASCprefs_malefaces)  %>%
  mutate(MascPref_FF = MASCprefs_femalefaces)  %>%
  mutate(educ = Totalyearseducation)  %>%
  mutate(locrank = recode(village, '0'= 1, 
                          '4' = 2,
                          '1' = 3,
                          '3' = 4,
                          '7' = 5,
                          '2' = 6))

#   mutate(eth_mest = ifelse(Ethnicbackground==2,1,0)) %>%  #Mestizo dummy variable - not needed as now hand coded including ther 'other' column comments

#create composite status score
facedata$status <- scale(facedata$EarningslastyearinCordobas)+scale(facedata$Totalyearseducation)

2 Descriptives

2.1 Summary of continuous variables

options(width = 900)

facedata_continuous <- facedata %>%
 select("Age","Yearsofmariage","Howmanychildren","income",
        "educ","TV","Acculturation",
        "MascPref_MF","MascPref_FF")


psych::describe(facedata_continuous)
#table1 <- psych::describe(facedata_continuous)
#write.csv(table1,file="table1_nic_masc.csv")

2.2 Categorical variables and Figure 1 code

facedata_cat <- facedata %>%
 select("Sex0male1female","Married0yes1no","Engaged0yes1no",
        "CohabitingLivingwithSomeone0yes1no","Divorced0yes1no","DatingMultiple","DatingJustOne",
        "NotCurrentlyInvolvedwithAnyone0yes1no","Widowed0yes1no","Children",
        "Ethnicbackground","Partnerethnicbackground",
        "Occupation","Schoollevel","Televisioninhouse")

#Note cohabiting includes those married and cohabiting
#create combined relationship variable for summary plot
facedata_cat$Relationship <- (1-facedata_cat$CohabitingLivingwithSomeone0yes1no)*4-(1-facedata_cat$NotCurrentlyInvolvedwithAnyone0yes1no)

facedata_cat$Relationship[facedata_cat$Relationship == 4] <- "Cohabiting"
facedata_cat$Relationship[facedata_cat$Relationship == 3] <- "Dating"
facedata_cat$Relationship[facedata_cat$Relationship == 0] <- "Dating"
facedata_cat$Relationship[facedata_cat$Relationship == -1] <- "Single"

#Set ethnicity labels
facedata_cat$Ethnicbackground[facedata_cat$Ethnicbackground == 0] <- "Miskitu"
facedata_cat$Ethnicbackground[facedata_cat$Ethnicbackground == 1] <- "Garifuna"
facedata_cat$Ethnicbackground[facedata_cat$Ethnicbackground == 2] <- "Mestizo"
facedata_cat$Ethnicbackground[facedata_cat$Ethnicbackground == 3] <- "Other"
facedata_cat$Ethnicbackground[facedata_cat$Ethnicbackground == 4] <- "Other"
facedata_cat$Ethnicbackground[facedata_cat$Ethnicbackground == 5] <- "Other"
facedata_cat$Partnerethnicbackground[facedata_cat$Partnerethnicbackground == 0] <- "Miskitu"
facedata_cat$Partnerethnicbackground[facedata_cat$Partnerethnicbackground == 1] <- "Garifuna"
facedata_cat$Partnerethnicbackground[facedata_cat$Partnerethnicbackground == 2] <- "Mestizo"
facedata_cat$Partnerethnicbackground[facedata_cat$Partnerethnicbackground == 3] <- "Other"
facedata_cat$Partnerethnicbackground[facedata_cat$Partnerethnicbackground == 4] <- "Other"
facedata_cat$Partnerethnicbackground[facedata_cat$Partnerethnicbackground == 5] <- "Other"
facedata_cat$Partnerethnicbackground[facedata_cat$Partnerethnicbackground == ""] <- NA

#Set education labels
facedata_cat$Schoollevel[facedata_cat$Schoollevel == 0] <- "1-Some ES"
facedata_cat$Schoollevel[facedata_cat$Schoollevel == 1] <- "2-All ES"
facedata_cat$Schoollevel[facedata_cat$Schoollevel == 2] <- "3-Some HS"
facedata_cat$Schoollevel[facedata_cat$Schoollevel == 3] <- "4-All HS"
facedata_cat$Schoollevel[facedata_cat$Schoollevel == 4] <- "5-More"
facedata_cat$Schoollevel[facedata_cat$Schoollevel == 5] <- "0-None"
#Set TV labels
facedata_cat$Televisioninhouse[facedata_cat$Televisioninhouse == 0 ] <- "In my house"
facedata_cat$Televisioninhouse[facedata_cat$Televisioninhouse == 1 ] <- "In house I visit"
facedata_cat$Televisioninhouse[facedata_cat$Televisioninhouse == 2 ] <- "In house I don't visit"
facedata_cat$Televisioninhouse[facedata_cat$Televisioninhouse == 3 ] <- "No TV in village"
#Set gender labels
facedata_cat$Sex0male1female [facedata_cat$Sex0male1female == "0" ] <- "Male"
facedata_cat$Sex0male1female [facedata_cat$Sex0male1female == "1" ] <- "Female"

#Set remaining binary variables
facedata_cat [facedata_cat == "0"] <- "Yes"
facedata_cat [facedata_cat == "1"] <- "No"


table(facedata_cat$Sex0male1female)
## 
## Female   Male 
##    156    155
barplot(table(facedata_cat$Sex0male1female), main = "Gender")

par(mfrow=c(2,2))
barplot(table(facedata_cat$Relationship), main = "Relationship status")
barplot(table(facedata_cat$DatingMultiple), main = "Dating multiple partners")
barplot(table(facedata_cat$Ethnicbackground), main = "Ethnicity")
barplot(table(facedata_cat$Partnerethnicbackground), main = "Partner ethnicity")

#barplot(table(facedata_cat$Occupation), main = "Occupation")
par(mfrow=c(2,1))
barplot(table(facedata_cat$Schoollevel), main = "Education level")
barplot(table(facedata_cat$Televisioninhouse), main = "TV access in village")

hist(facedata$Age, main="Age distribution")

2.3 Zero-order associations between variables

# Correlations between continuous variables
apa.cor.table(facedata_continuous)
## 
## 
## Means, standard deviations, and correlations with confidence intervals
##  
## 
##   Variable           M      SD      1            2            3            4           5           6            7            8          
##   1. Age             27.74  11.57                                                                                                       
##                                                                                                                                         
##   2. Yearsofmariage  10.41  12.22   .74**                                                                                               
##                                     [.63, .82]                                                                                          
##                                                                                                                                         
##   3. Howmanychildren 3.14   2.74    .68**        .54**                                                                                  
##                                     [.60, .74]   [.37, .68]                                                                             
##                                                                                                                                         
##   4. income          745.29 2362.50 .11          -.07         -.13                                                                      
##                                     [-.01, .21]  [-.27, .14]  [-.26, .01]                                                               
##                                                                                                                                         
##   5. educ            6.72   4.66    -.28**       -.20         -.31**       .13*                                                         
##                                     [-.38, -.18] [-.40, .00]  [-.43, -.19] [.02, .24]                                                   
##                                                                                                                                         
##   6. TV              8.90   10.28   -.16**       .02          -.20**       .05         .44**                                            
##                                     [-.26, -.04] [-.19, .22]  [-.33, -.06] [-.06, .16] [.35, .53]                                       
##                                                                                                                                         
##   7. Acculturation   2.80   1.03    .02          .05          -.03         .16*        -.00        .16*                                 
##                                     [-.11, .15]  [-.19, .28]  [-.19, .14]  [.03, .29]  [-.13, .13] [.04, .29]                           
##                                                                                                                                         
##   8. MascPref_MF     0.43   0.26    -.01         -.24*        -.01         .06         -.11        -.07         -.05                    
##                                     [-.12, .10]  [-.43, -.03] [-.14, .13]  [-.05, .17] [-.22, .01] [-.18, .05]  [-.18, .08]             
##                                                                                                                                         
##   9. MascPref_FF     0.48   0.25    .05          -.13         .08          .08         -.08        -.15**       -.21**       .11        
##                                     [-.07, .16]  [-.33, .08]  [-.05, .22]  [-.04, .19] [-.19, .04] [-.26, -.04] [-.33, -.08] [-.00, .22]
##                                                                                                                                         
## 
## Note. M and SD are used to represent mean and standard deviation, respectively.
## Values in square brackets indicate the 95% confidence interval.
## The confidence interval is a plausible range of population correlations 
## that could have caused the sample correlation (Cumming, 2014).
##  * indicates p < .05. ** indicates p < .01.
## 
# Checking if age and socioeconomic status are associated with relationship status. No connection with SES but single individuals tend to be younger than partnered/dating individuals. As age is controlled in those models, this doesn't represent an issue.
summary(lm(Age ~ NotCurrentlyInvolvedwithAnyone0yes1no, data=facedata))
## 
## Call:
## lm(formula = Age ~ NotCurrentlyInvolvedwithAnyone0yes1no, data = facedata)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -14.526  -6.707  -3.526   3.474  52.293 
## 
## Coefficients:
##                                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                             23.707      1.127  21.045  < 2e-16 ***
## NotCurrentlyInvolvedwithAnyone0yes1no    5.819      1.365   4.262  2.7e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 11.21 on 308 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.05568,    Adjusted R-squared:  0.05262 
## F-statistic: 18.16 on 1 and 308 DF,  p-value: 2.701e-05
summary(lm(income ~ NotCurrentlyInvolvedwithAnyone0yes1no, data=facedata))
## 
## Call:
## lm(formula = income ~ NotCurrentlyInvolvedwithAnyone0yes1no, 
##     data = facedata)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##   -929   -659   -571     76  35071 
## 
## Coefficients:
##                                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                              929.3      237.9   3.907 0.000115 ***
## NotCurrentlyInvolvedwithAnyone0yes1no   -270.2      288.3  -0.937 0.349469    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2367 on 308 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.002843,   Adjusted R-squared:  -0.0003948 
## F-statistic: 0.8781 on 1 and 308 DF,  p-value: 0.3495

3 Running analyses

#create squared age term
facedata$Age2 <- facedata$Age*facedata$Age

#create age groups
facedata <- mutate(facedata, Agegroup = ifelse(Age<20,"young adult",(ifelse(Age>45, "older adult","adult"))))

#effect code binary variables
facedata$sex <- facedata$sex -.5   #positive = female
facedata$eth_mest <- facedata$eth_mest -.5   #positive = Mestizo
facedata$eth_misk <- facedata$eth_misk -.5   #positive = Miskitu
facedata$eth_gar <- facedata$eth_gar -.5   #positive = Garifuna
facedata$eth_creo <- facedata$eth_creo -.5   #positive = Creole
facedata$rel <- facedata$rel -.5    #positive = in a relationship


#create rural and gender filters
facedataW <- subset(facedata, sex==.5)
facedataM <- subset(facedata, sex==-.5)
facedataR <- subset(facedata, rural==1)
facedataRW <- subset(facedataR, sex==.5)
facedataRM <- subset(facedataR, sex==-.5)

3.1 Comparing overall means to other samples - Figure 2

Present urban and rural means/sd for M and F in a table with those from Batres & Perrett, DeBruine/Marcinkowska LatAm samples, DeBrine/Marcinkowska overall means

library(readxl)
## Warning: package 'readxl' was built under R version 4.0.4
LatAm_Data <- read.csv( "LatAmData.csv" , header=TRUE)

fig2dat <- facedata %>% select(rural, village_code, MascPref_MF,MascPref_FF)%>%
  gather(FaceSex, Value, MascPref_MF,MascPref_FF) %>%
  mutate(FaceSex = recode(FaceSex, 'MascPref_FF'="Female", 'MascPref_MF'="Male"))%>%
  mutate(rural = recode(rural, '0'="Urban", '1'="Rural"))

figcolours <- c("#FFCC33","#0072B2" )

f2a <- ggplot(aes(FaceSex, Value), data=fig2dat) + geom_violin(aes(fill = as.factor(rural)), alpha=.6) + 
  geom_boxplot(width=.1, aes(fill = as.factor(rural)), position=position_dodge(.9), outlier.shape = NA) +
  labs(x = "Face Sex", y = "Masculinity preference", fill = "Sample Type - current study") +
  scale_fill_manual(values=figcolours)

f2a + geom_point(mapping = aes(x=FaceSex, y=Value, shape=SampleType,color=SampleType),  size=3, position="dodge",  alpha=.75, data=LatAm_Data)  +
  labs(color = "Sample Type - other studies", shape= "Sample Type - other studies")+
  scale_color_manual(values=figcolours)
## Warning: Removed 22 rows containing non-finite values (stat_ydensity).
## Warning: Removed 22 rows containing non-finite values (stat_boxplot).
## Warning: Width not defined. Set with `position_dodge(width = ?)`

#   stat_summary(fun.y = "mean", geom = "point", color=aes(as.factor(rural)), position = position_dodge(.9)) + 

3.2 Hypothesis 1 - Compare Mestizo vs other groups

3.2.1 H1 Main test - women’s preferences for men

#Main test
h1 <- lm(MascPref_MF~eth_mest + Age,facedataRW)
summary(h1)
## 
## Call:
## lm(formula = MascPref_MF ~ eth_mest + Age, data = facedataRW)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.48491 -0.23589 -0.03422  0.15410  0.55076 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.492946   0.066937   7.364 1.82e-11 ***
## eth_mest     0.030663   0.046587   0.658    0.512    
## Age         -0.001669   0.002372  -0.704    0.483    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2676 on 130 degrees of freedom
##   (4 observations deleted due to missingness)
## Multiple R-squared:  0.006533,   Adjusted R-squared:  -0.008751 
## F-statistic: 0.4274 on 2 and 130 DF,  p-value: 0.6531

3.2.2 H1 Planned exploratory tests

#Exploration 1 - female faces and male participants
h1xff <- lm(MascPref_FF~eth_mest + Age,facedataRW) #women judging women's faces
h1xmm <- lm(MascPref_MF~eth_mest + Age,facedataRM) #men judging men's faces
h1xmf <- lm(MascPref_FF~eth_mest + Age,facedataRM) #men judging women's faces

h1cols <- c("Women judging male faces","Women judging female faces","Men judging male faces","Men judging female faces")
#stargazer(h1,h1xff,h1xmm,h1xmf, type="text",column.labels=h1cols, ci=TRUE, report="vcp")
tab_model (h1,h1xff,h1xmm,h1xmf, dv.labels = h1cols, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  Women judging male faces Women judging female faces Men judging male faces Men judging female faces
Predictors Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p
eth_mest 0.03 0.05 0.512 -0.00 0.04 0.965 -0.06 0.05 0.221 -0.09 0.04 0.048
Age -0.00 0.00 0.483 0.00 0.00 0.904 -0.00 0.00 0.491 0.00 0.00 0.771
Observations 133 133 127 127
R2 / R2 adjusted 0.007 / -0.009 0.000 / -0.015 0.016 / -0.000 0.032 / 0.016
#Exploration 2 - testing all potential ethnicity effects 

h1xEff <- lm(MascPref_FF~eth_mest + eth_gar + eth_misk + eth_creo + Age, facedataRW)
h1xEfm <- lm(MascPref_MF~eth_mest + eth_gar + eth_misk + eth_creo + Age, facedataRW)
h1xEmf <- lm(MascPref_FF~eth_mest + eth_gar + eth_misk + eth_creo + Age, facedataRM)
h1xEmm <- lm(MascPref_MF~eth_mest + eth_gar + eth_misk + eth_creo + Age, facedataRM)
#stargazer(h1xEff,h1xEfm,h1xEff,h1xEmf,h1xEmm, type="text")
tab_model (h1xEff,h1xEfm,h1xEff,h1xEmf,h1xEmm, dv.labels = h1cols, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  Women judging male faces Women judging female faces Men judging male faces Men judging female faces
Predictors Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p
eth_mest -0.08 0.09 0.415 0.10 0.10 0.350 -0.08 0.09 0.415 -0.08 0.08 0.312 -0.11 0.09 0.182
eth_gar 0.07 0.10 0.476 0.18 0.12 0.135 0.07 0.10 0.476 -0.02 0.10 0.830 -0.06 0.10 0.533
eth_misk -0.09 0.09 0.318 0.08 0.10 0.420 -0.09 0.09 0.318 0.04 0.08 0.629 -0.09 0.08 0.288
eth_creo -0.07 0.10 0.481 -0.15 0.11 0.178 -0.07 0.10 0.481 -0.08 0.09 0.381 0.05 0.10 0.594
Age 0.00 0.00 0.921 -0.00 0.00 0.473 0.00 0.00 0.921 0.00 0.00 0.778 -0.00 0.00 0.455
Observations 133 133 133 127 127
R2 / R2 adjusted 0.034 / -0.004 0.043 / 0.005 0.034 / -0.004 0.046 / 0.007 0.032 / -0.008

3.3 Hypothesis 2 - Age effects

3.3.1 H2 Main tests - women’s preferences for men

# Main test looking at women's preferences
h2.1 <- lmer(MascPref_MF~Age + Age2 + (1|village), data = facedataRW) #quadratic model
## boundary (singular) fit: see ?isSingular
h2.2 <- lmer(MascPref_MF~Agegroup + (1|village), data = facedataRW) #dummy variable model
## boundary (singular) fit: see ?isSingular
h2acols <- c("Women judging male faces - quadratic model","Women judging male faces - dummy model")
#stargazer(h2.1,h2.2,  type="text",  column.labels=h2acols)
tab_model (h1xEff,h1xEfm,h1xEff,h1xEmf,h1xEmm, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  MascPref_FF MascPref_MF MascPref_FF MascPref_FF MascPref_MF
Predictors Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p
eth_mest -0.08 0.09 0.415 0.10 0.10 0.350 -0.08 0.09 0.415 -0.08 0.08 0.312 -0.11 0.09 0.182
eth_gar 0.07 0.10 0.476 0.18 0.12 0.135 0.07 0.10 0.476 -0.02 0.10 0.830 -0.06 0.10 0.533
eth_misk -0.09 0.09 0.318 0.08 0.10 0.420 -0.09 0.09 0.318 0.04 0.08 0.629 -0.09 0.08 0.288
eth_creo -0.07 0.10 0.481 -0.15 0.11 0.178 -0.07 0.10 0.481 -0.08 0.09 0.381 0.05 0.10 0.594
Age 0.00 0.00 0.921 -0.00 0.00 0.473 0.00 0.00 0.921 0.00 0.00 0.778 -0.00 0.00 0.455
Observations 133 133 133 127 127
R2 / R2 adjusted 0.034 / -0.004 0.043 / 0.005 0.034 / -0.004 0.046 / 0.007 0.032 / -0.008
ggplot(aes(x=Age, y=MascPref_MF), data=facedataRW) + 
  geom_jitter(colour = "red", alpha=.6) + 
  labs(y="Proportion of masculine faces chosen", title = "Scatterplot of women's preferences for male faces")
## Warning: Removed 4 rows containing missing values (geom_point).

3.3.2 H2 Planned exploratory tests

# Second test looking at all preferences for all faces
h2ex1.1 <- lmer(MascPref_FF~Age*sex + Age2*sex + (1|village), data = facedataR) #quadratic model - female faces
## Warning: Some predictor variables are on very different scales: consider rescaling
h2ex1.2 <- lmer(MascPref_FF~Agegroup*sex + (1|village), data = facedataR)         #dummy model - female faces
## boundary (singular) fit: see ?isSingular
h2ex2.1 <- lmer(MascPref_MF~Age*sex + Age2*sex + (1|village), data = facedataR) #quadratic model - male faces
## Warning: Some predictor variables are on very different scales: consider rescaling
h2ex2.2 <- lmer(MascPref_MF~Agegroup*sex+ (1|village), data = facedataR)          #dummy model - male faces

h2bcols <- c("Female faces: quadratic","Male faces: quadratic","Female faces: groups","Male faces: groups")
#stargazer(h2.1,h2.2,  type="text")
#stargazer(h2ex1.1, h2ex2.1, h2ex1.2, h2ex2.2,type="text", column.labels=h2bcols)

tab_model (h1xEff,h1xEfm,h1xEff,h1xEmf,h1xEmm, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  MascPref_FF MascPref_MF MascPref_FF MascPref_FF MascPref_MF
Predictors Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p
eth_mest -0.08 0.09 0.415 0.10 0.10 0.350 -0.08 0.09 0.415 -0.08 0.08 0.312 -0.11 0.09 0.182
eth_gar 0.07 0.10 0.476 0.18 0.12 0.135 0.07 0.10 0.476 -0.02 0.10 0.830 -0.06 0.10 0.533
eth_misk -0.09 0.09 0.318 0.08 0.10 0.420 -0.09 0.09 0.318 0.04 0.08 0.629 -0.09 0.08 0.288
eth_creo -0.07 0.10 0.481 -0.15 0.11 0.178 -0.07 0.10 0.481 -0.08 0.09 0.381 0.05 0.10 0.594
Age 0.00 0.00 0.921 -0.00 0.00 0.473 0.00 0.00 0.921 0.00 0.00 0.778 -0.00 0.00 0.455
Observations 133 133 133 127 127
R2 / R2 adjusted 0.034 / -0.004 0.043 / 0.005 0.034 / -0.004 0.046 / 0.007 0.032 / -0.008

3.4 Hypothesis 3 - Relationship status

3.4.1 H3 Main test - women’s preferences for men

#Main test - women's preferences for male faces

h3 <- lmer(MascPref_MF~rel + Age + (1|village), data = facedataRW)
## boundary (singular) fit: see ?isSingular

3.4.2 H3 Planned exploratory tests

#exploratory checks on other combinations
h3xff <- lmer(MascPref_FF~rel + Age + (1|village), data = facedataRW) #women judging women's faces
h3xmm <- lmer(MascPref_MF~rel + Age + (1|village), data = facedataRM) #men judging men's faces
h3xmf <- lmer(MascPref_FF~rel + Age + (1|village), data = facedataRM) #men judging women's faces

h3cols <- c("Women judging men","Women judging women","Men judging men","Men judging women")
#stargazer(h3,h3xff,h3xmm,h3xmf, type="text", column.labels=h3cols)

tab_model (h3,h3xff,h3xmm,h3xmf, dv.labels = h3cols, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  Women judging men Women judging women Men judging men Men judging women
Predictors Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p
rel 0.02 0.05 0.673 0.06 0.04 0.184 -0.05 0.05 0.281 -0.09 0.05 0.069
Age -0.00 0.00 0.477 -0.00 0.00 0.912 -0.00 0.00 0.501 0.00 0.00 0.423
Random Effects
σ2 0.07 0.05 0.06 0.06
τ00 0.00 village 0.00 village 0.00 village 0.00 village
ICC   0.00 0.06 0.01
N 5 village 5 village 5 village 5 village
Observations 133 133 127 127
Marginal R2 / Conditional R2 0.005 / NA 0.013 / 0.016 0.017 / 0.073 0.027 / 0.041

3.5 Hypothesis 4 - Comparing preferences across communities

3.5.1 H4 Main tests of location development with linear models (reported in paper)

#village profiles show overall development related indices (TV, education, income) fit with how we ordered the villages)

facedata %>% group_by(village_code) %>%
  summarise(income = mean(income, na.rm=TRUE),
            education = mean(Totalyearseducation, na.rm=TRUE),
            TV = mean(TV, na.rm=TRUE))
#Main test 1 - comparing rural and city (note city are all Mestizo so can't use ethnicity as a control variable)
h4cf <- lm(MascPref_FF~rural + Age, data = facedata) # women's faces
h4cm <- lm(MascPref_MF~rural + Age, data = facedata) # men's faces

#Main test 2 - ranked location analyses for rural villages only - linear models to test the hypothesis that lower rank position is associated with weaker preferences; Mestizo ethnicity (present in simulated code) not used as not significant predictor above
h4rf <- lm(MascPref_FF~locrank +  Age, data = facedataR) # women's faces
h4rm <- lm(MascPref_MF~locrank + Age, data = facedataR) # men's faces

h4cols <- c("City vs Rural","City vs Rural","village rank","village rank")
#stargazer(h4cf,h4cm,h4rf,h4rm, type="text", column.labels=h4cols)
tab_model (h4cf,h4cm,h4rf,h4rm, dv.labels = h4cols, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  City vs Rural City vs Rural village rank village rank
Predictors Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p
rural 0.16 0.04 <0.001 0.02 0.04 0.668
Age 0.00 0.00 0.389 -0.00 0.00 0.845 0.00 0.00 0.794 -0.00 0.00 0.174
locrank 0.01 0.01 0.419 0.03 0.01 0.035
Observations 300 300 260 260
R2 / R2 adjusted 0.051 / 0.045 0.001 / -0.006 0.003 / -0.005 0.021 / 0.014

3.5.2 H4 Planned spline models.

Pre-registered plan to run descriptive spline models as a check given village rank is ordinal, and report the model with best AICs.

# running descriptive spline models as a check given village rank is ordinal, report the model with best AICs.
# women's faces


h4rf.s1 <- glm(MascPref_FF~ns(locrank,1) + eth_mest + Age, data = facedataR) 
h4rf.s2 <- glm(MascPref_FF~ns(locrank,2) + eth_mest + Age, data = facedataR) 
h4rf.s3 <- glm(MascPref_FF~ns(locrank,3) + eth_mest + Age, data = facedataR) 
h4rf.s4 <- glm(MascPref_FF~ns(locrank,4) + eth_mest + Age, data = facedataR) 
AIC(h4rf.s1)
## [1] -1.815825
AIC(h4rf.s2)
## [1] -0.9094054
AIC(h4rf.s3)
## [1] 0.5216941
AIC(h4rf.s4)
## [1] 1.964755
AIC(h4rf)
## [1] -2.248875
# No model has a better fit than the linear model so stick with that.
#attr(terms(h4rf.s4), "predvars")


# men's faces

h4rm.s1 <- glm(MascPref_MF~ns(locrank,1) + eth_mest + Age, data = facedataR) 
h4rm.s2 <- glm(MascPref_MF~ns(locrank,2) + eth_mest + Age, data = facedataR) 
h4rm.s3 <- glm(MascPref_MF~ns(locrank,3) + eth_mest + Age, data = facedataR) 
h4rm.s4 <- glm(MascPref_MF~ns(locrank,4) + eth_mest + Age, data = facedataR) 
AIC(h4rm.s1)
## [1] 44.29975
AIC(h4rm.s2)
## [1] 43.09921
AIC(h4rm.s3)
## [1] 41.75117
AIC(h4rm.s4)
## [1] 41.1076
AIC(h4rm)
## [1] 42.33418
# report model summary for model with best fit
summary(h4rm.s4)
## 
## Call:
## glm(formula = MascPref_MF ~ ns(locrank, 4) + eth_mest + Age, 
##     data = facedataR)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -0.46107  -0.18856  -0.00064   0.20623   0.61000  
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      0.489350   0.057043   8.579 9.79e-16 ***
## ns(locrank, 4)1 -0.112675   0.081342  -1.385   0.1672    
## ns(locrank, 4)2  0.206985   0.087593   2.363   0.0189 *  
## ns(locrank, 4)3  0.091809   0.147777   0.621   0.5350    
## ns(locrank, 4)4  0.097324   0.054399   1.789   0.0748 .  
## eth_mest         0.033052   0.056145   0.589   0.5566    
## Age             -0.002512   0.001446  -1.738   0.0835 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.06627005)
## 
##     Null deviance: 17.754  on 259  degrees of freedom
## Residual deviance: 16.766  on 253  degrees of freedom
##   (9 observations deleted due to missingness)
## AIC: 41.108
## 
## Number of Fisher Scoring iterations: 2

3.5.3 H4 Exploratory tests of location as a factor

# Female faces

# Checking individual locations against the capital; every location except M3 shows significantly higher rates of choosing the masculinised female faces than in the capital.
h4rf.sx <- facedata %>%
  glm(MascPref_FF~(as.factor(locrank)) + eth_mest + Age, data = .)
summary(h4rf.sx)
## 
## Call:
## glm(formula = MascPref_FF ~ (as.factor(locrank)) + eth_mest + 
##     Age, data = .)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -0.5281  -0.1362  -0.0540   0.1419   0.6417  
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          0.332999   0.056781   5.865 1.22e-08 ***
## as.factor(locrank)2  0.158021   0.050118   3.153  0.00178 ** 
## as.factor(locrank)3  0.126194   0.067281   1.876  0.06170 .  
## as.factor(locrank)4  0.119098   0.048561   2.453  0.01477 *  
## as.factor(locrank)5  0.177226   0.071077   2.493  0.01320 *  
## as.factor(locrank)6  0.162425   0.064380   2.523  0.01217 *  
## eth_mest            -0.035979   0.051497  -0.699  0.48532    
## Age                  0.000865   0.001240   0.698  0.48589    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.05834852)
## 
##     Null deviance: 18.223  on 299  degrees of freedom
## Residual deviance: 17.038  on 292  degrees of freedom
##   (11 observations deleted due to missingness)
## AIC: 8.8581
## 
## Number of Fisher Scoring iterations: 2
# Checking villages against each other - smallest village as reference category (note rank codes are reversed here, so 6 (C1) = 1 etc); no village differs from C1.
h4rf.sxR <- facedataR %>%
  mutate(locrank = 7-locrank)%>%
  glm(MascPref_FF~(as.factor(locrank)) + eth_mest + Age, data = .)
summary(h4rf.sxR)
## 
## Call:
## glm(formula = MascPref_FF ~ (as.factor(locrank)) + eth_mest + 
##     Age, data = .)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -0.53265  -0.13600  -0.05517   0.14120   0.54408  
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          0.5159342  0.0564382   9.142   <2e-16 ***
## as.factor(locrank)2  0.0178349  0.0558080   0.320    0.750    
## as.factor(locrank)3 -0.0520513  0.0603934  -0.862    0.390    
## as.factor(locrank)4 -0.0372269  0.0506274  -0.735    0.463    
## as.factor(locrank)5 -0.0125659  0.0589968  -0.213    0.832    
## eth_mest            -0.0249256  0.0520736  -0.479    0.633    
## Age                  0.0002501  0.0013408   0.187    0.852    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.05700783)
## 
##     Null deviance: 14.680  on 259  degrees of freedom
## Residual deviance: 14.423  on 253  degrees of freedom
##   (9 observations deleted due to missingness)
## AIC: 1.9648
## 
## Number of Fisher Scoring iterations: 2
# Male faces

# Checking individual locations against the capital; location 5 (M1) shows stronger masculinity preferences in male faces than the capital, otherwise no differences.
h4rm.sx <- facedata %>%
  glm(MascPref_MF~(as.factor(locrank)), data = .)
summary(h4rm.sx)
## 
## Call:
## glm(formula = MascPref_MF ~ (as.factor(locrank)), data = .)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -0.5243  -0.1877  -0.0100   0.1900   0.6254  
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          0.41000    0.04026  10.183   <2e-16 ***
## as.factor(locrank)2  0.02393    0.05271   0.454    0.650    
## as.factor(locrank)3 -0.03540    0.05148  -0.688    0.492    
## as.factor(locrank)4 -0.02231    0.05117  -0.436    0.663    
## as.factor(locrank)5  0.11432    0.05808   1.968    0.050 *  
## as.factor(locrank)6  0.07718    0.05730   1.347    0.179    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.06483929)
## 
##     Null deviance: 19.842  on 299  degrees of freedom
## Residual deviance: 19.063  on 294  degrees of freedom
##   (11 observations deleted due to missingness)
## AIC: 38.549
## 
## Number of Fisher Scoring iterations: 2
# Checking villages against each other - smallest village as reference category (note rank codes are reversed here, so 6 (C1) = 1 etc). In this case we see that village ranked here as 4 (or 3 in Figure 3, village M2) has significantly lower masculinity preferences in male faces than village C1.
h4rm.sxR <- facedataR %>%
  mutate(locrank = 7-locrank)%>%
  glm(MascPref_MF~(as.factor(locrank)) + eth_mest + Age, data = .)
summary(h4rm.sxR)
## 
## Call:
## glm(formula = MascPref_MF ~ (as.factor(locrank)) + eth_mest + 
##     Age, data = .)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -0.46107  -0.18856  -0.00064   0.20623   0.61000  
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          0.568644   0.060851   9.345   <2e-16 ***
## as.factor(locrank)2  0.047122   0.060171   0.783   0.4343    
## as.factor(locrank)3 -0.126749   0.065115  -1.947   0.0527 .  
## as.factor(locrank)4 -0.119407   0.054585  -2.188   0.0296 *  
## as.factor(locrank)5 -0.079294   0.063609  -1.247   0.2137    
## eth_mest             0.033052   0.056145   0.589   0.5566    
## Age                 -0.002512   0.001446  -1.738   0.0835 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.06627005)
## 
##     Null deviance: 17.754  on 259  degrees of freedom
## Residual deviance: 16.766  on 253  degrees of freedom
##   (9 observations deleted due to missingness)
## AIC: 41.108
## 
## Number of Fisher Scoring iterations: 2

3.5.4 Figure 3 code

#Location means
facedata %>%
  group_by(locrank) %>%
  summarise(Male = mean(MascPref_MF, na.rm=TRUE),
            Female = mean(MascPref_FF, na.rm=TRUE))
facedata %>% select(locrank, village_code, MascPref_MF,MascPref_FF)%>%
  gather(FaceSex, Value, MascPref_MF,MascPref_FF) %>%
  mutate(FaceSex = recode(FaceSex, 'MascPref_FF'="Female", 'MascPref_MF'="Male"),
         village_ordered = paste(locrank, ". ",village_code))%>%
  ggplot(aes(village_ordered, Value), data=.) + geom_violin(aes(fill = FaceSex), alpha=.75) + geom_boxplot(width=.1, aes(fill = FaceSex), position=position_dodge(.9)) +
  labs(x = "Community", y = "Proportion of masculinised faces chosen") +
  scale_fill_manual(values=figcolours)
## Warning: Removed 22 rows containing non-finite values (stat_ydensity).
## Warning: Removed 22 rows containing non-finite values (stat_boxplot).

3.6 Hypothesis 5 - Effects of socioeconomic status

3.6.1 H5 Main tests

#Main tests with overall status - men judging women and women judging men
h5fmo <- lmer(MascPref_MF~status + Age + (1|village), data = facedataRW) #women judging men's faces
## boundary (singular) fit: see ?isSingular
h5mfo <- lmer(MascPref_FF~status + Age + (1|village), data = facedataRM) #men judging women's faces

#Main test with education and income kept separate
h5fms <- lmer(MascPref_MF~educ + income + Age + (1|village), data = facedataRW) #women judging men's faces
## boundary (singular) fit: see ?isSingular
h5mfs <- lmer(MascPref_FF~educ + income + Age + (1|village), data = facedataRM) #men judging women's faces
## Warning: Some predictor variables are on very different scales: consider rescaling
h5cols <- c("Women judging men","Men judging women","Women judging men","Men judging women")

#stargazer(h5fmo,h5mfo,h5fms,h5mfs, type="text", column.labels=h5cols)
tab_model (h5fmo,h5mfo,h5fms,h5mfs, dv.labels = h5cols, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  Women judging men Men judging women Women judging men Men judging women
Predictors Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p
status -0.03 0.02 0.168 0.01 0.01 0.267
Age -0.00 0.00 0.410 0.00 0.00 0.609 -0.00 0.00 0.690 0.00 0.00 0.660
educ -0.00 0.01 0.850 0.00 0.01 0.654
income -0.00 0.00 0.085 0.00 0.00 0.861
Random Effects
σ2 0.07 0.06 0.07 0.06
τ00 0.00 village 0.00 village 0.00 village 0.00 village
ICC   0.04   0.04
N 5 village 5 village 5 village 5 village
Observations 133 127 133 127
Marginal R2 / Conditional R2 0.017 / NA 0.011 / 0.052 0.028 / NA 0.003 / 0.044

3.6.2 H5 exploratory analyses

No evidence for any face sex by person sex interaction with status.

# Exploratory checking if making data long shows any interactions with face/person sex but no evidence.
h5long <- facedataR %>%
  select(ID, Age, sex, village, status, income, educ, MascPref_MF, MascPref_FF) %>%
  gather('FaceSex', 'Value', MascPref_MF, MascPref_FF) %>%
  lmer(Value ~ status*FaceSex*sex + Age + (1|village), data=.)

h5long2 <- facedataR%>%
  select(ID, Age, sex, village, status, income, educ, MascPref_MF, MascPref_FF) %>%
  gather('FaceSex', 'Value', MascPref_MF, MascPref_FF) %>%
  lmer(Value ~ income*FaceSex*sex + Age + (1|village), data=.)
## Warning: Some predictor variables are on very different scales: consider rescaling
#stargazer(h5long,h5long2, type="text")

tab_model (h5long,h5long2, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  Value Value
Predictors Estimates std. Error p Estimates std. Error p
status 0.01 0.01 0.404
FaceSex [MascPref_MF] -0.07 0.02 0.001 -0.04 0.03 0.119
sex -0.01 0.03 0.862 -0.01 0.04 0.779
Age -0.00 0.00 0.325 -0.00 0.00 0.406
status * FaceSex
[MascPref_MF]
-0.03 0.01 0.036
status * sex -0.01 0.02 0.592
FaceSex [MascPref_MF] *
sex
0.03 0.05 0.520 0.05 0.05 0.345
(status * FaceSex
[MascPref_MF]) * sex
0.01 0.03 0.819
income 0.00 0.00 0.349
income * FaceSex
[MascPref_MF]
-0.00 0.00 0.016
income * sex 0.00 0.00 0.616
(income * FaceSex
[MascPref_MF]) * sex
-0.00 0.00 0.223
Random Effects
σ2 0.06 0.06
τ00 0.00 village 0.00 village
ICC 0.03 0.03
N 5 village 5 village
Observations 520 520
Marginal R2 / Conditional R2 0.036 / 0.064 0.038 / 0.066

3.7 Hypothesis 6 - Effects of television

3.7.1 H6 in rural participants only (reported in paper)

h6ffaceR <- lmer(MascPref_FF~ Age +TV + (1|village), data = facedataR)# women's faces
h6mfaceR <- lmer(MascPref_MF~ Age +TV + (1|village), data = facedataR)# men's faces

h6cols <- c("Female faces","Male faces")
#stargazer(h6ffaceR,h6mfaceR,type="text", column.labels=h6cols)
tab_model (h6ffaceR,h6mfaceR, dv.labels=h6cols, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  Female faces Male faces
Predictors Estimates std. Error p Estimates std. Error p
Age 0.00 0.00 0.768 -0.00 0.00 0.124
TV -0.00 0.00 0.718 -0.00 0.00 0.841
Random Effects
σ2 0.06 0.07
τ00 0.00 village 0.00 village
ICC 0.00 0.05
N 5 village 5 village
Observations 260 260
Marginal R2 / Conditional R2 0.001 / 0.002 0.009 / 0.054

3.7.2 H6 in full sample

Including Managua participants does not yield any effect of television, even though TV consumption is high in Managua; likely controlled for by random effect of location.

h6fface <- lmer(MascPref_FF~ Age + TV + (1|village), data = facedata)# women's faces
h6mface <- lmer(MascPref_MF~ Age + TV + (1|village), data = facedata)# men's faces

#stargazer(h6fface,h6mface,type="text", column.labels=h6cols)
tab_model (h6fface,h6mface, dv.labels=h6cols, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  Female faces Male faces
Predictors Estimates std. Error p Estimates std. Error p
Age 0.00 0.00 0.572 -0.00 0.00 0.556
TV -0.00 0.00 0.131 -0.00 0.00 0.547
Random Effects
σ2 0.06 0.07
τ00 0.00 village 0.00 village
ICC 0.03 0.03
N 6 village 6 village
Observations 300 300
Marginal R2 / Conditional R2 0.012 / 0.046 0.002 / 0.028

4 Additional analyses on sex differences in offspring number/variance

The sample is not a closed population and some women use hormonal implants acquired at clinics in town. However, the pp do show some indications of Bateman’s principle. Women have higher mean offspring overall (not unexpected given that the non-Mestio community is historically matrifocal and serially monogamous with fathers most likely to leave the community and children staying with their mothers). There is higher SD in number of offspring amongst men.

kids.model <- facedata %>%
  mutate(Howmanychildren = ifelse(is.na(Howmanychildren),0,Howmanychildren)) %>%
  lm(Howmanychildren~ Sex0male1female + Age, data=.)
summary(kids.model)
## 
## Call:
## lm(formula = Howmanychildren ~ Sex0male1female + Age, data = .)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.5745 -0.7737 -0.1377  0.6368  8.9325 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     -2.904632   0.304162  -9.550  < 2e-16 ***
## Sex0male1female  0.636001   0.211587   3.006  0.00287 ** 
## Age              0.169019   0.009161  18.450  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.856 on 308 degrees of freedom
## Multiple R-squared:  0.5259, Adjusted R-squared:  0.5228 
## F-statistic: 170.8 on 2 and 308 DF,  p-value: < 2.2e-16
facedata %>%
  mutate(Howmanychildren = ifelse(is.na(Howmanychildren),0,Howmanychildren)) %>%
  group_by(Sex0male1female) %>%
  summarise(kids_var = sd(Howmanychildren))

5 Pulling main models into tables for the paper

# Report h1
tab_model(h1, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  MascPref_MF
Predictors Estimates std. Error p
eth_mest 0.03 0.05 0.512
Age -0.00 0.00 0.483
Observations 133
R2 / R2 adjusted 0.007 / -0.009
# Report h2
tab_model(h2.1,h2.2, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE)
  MascPref_MF MascPref_MF
Predictors Estimates std. Error p Estimates std. Error p
Age 0.01 0.01 0.486
Age2 -0.00 0.00 0.402
Agegroup [older adult] -0.07 0.09 0.475
Agegroup [young adult] 0.03 0.05 0.566
Random Effects
σ2 0.07 0.07
τ00 0.00 village 0.00 village
N 5 village 5 village
Observations 133 133
Marginal R2 / Conditional R2 0.008 / NA 0.008 / NA
# Report h3, h5, h6
varstm3 <- c("Relationship status", "Age","Overall status","Education(yrs)","Income (USD)","Television (hrs/week)")
colstm3 <- c("H3: women judging men", "H5: Women judging men","H5: Men judging women","H5: Women judging men","H5: Men judging women","H6: Female faces", "H6: Male faces")
tab_model(h3,h5fmo,h5mfo,h5fms,h5mfs,h6ffaceR,h6mfaceR, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE, pred.labels = varstm3, dv.labels = colstm3)
  H3: women judging men H5: Women judging men H5: Men judging women H5: Women judging men H5: Men judging women H6: Female faces H6: Male faces
Predictors Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p
Relationship status 0.02 0.05 0.673
Age -0.00 0.00 0.477 -0.00 0.00 0.410 0.00 0.00 0.609 -0.00 0.00 0.690 0.00 0.00 0.660 0.00 0.00 0.768 -0.00 0.00 0.124
Overall status -0.03 0.02 0.168 0.01 0.01 0.267
Education(yrs) -0.00 0.01 0.850 0.00 0.01 0.654
Income (USD) -0.00 0.00 0.085 0.00 0.00 0.861
Television (hrs/week) -0.00 0.00 0.718 -0.00 0.00 0.841
Random Effects
σ2 0.07 0.07 0.06 0.07 0.06 0.06 0.07
τ00 0.00 village 0.00 village 0.00 village 0.00 village 0.00 village 0.00 village 0.00 village
ICC     0.04   0.04 0.00 0.05
N 5 village 5 village 5 village 5 village 5 village 5 village 5 village
Observations 133 133 127 133 127 260 260
Marginal R2 / Conditional R2 0.005 / NA 0.017 / NA 0.011 / 0.052 0.028 / NA 0.003 / 0.044 0.001 / 0.002 0.009 / 0.054
# Report h4
varstm4 <- c("Rural", "Age","Rank")
tm4cols <- c("City vs Rural - Female faces","City vs Rural - Male faces","Village rank - Female faces","Village rank - Male faces")
tab_model(h4cf,h4cm,h4rf,h4rm, dv.labels=tm4cols, show.ci = FALSE, show.se = TRUE, show.intercept = FALSE, pred.labels = varstm4)
  City vs Rural - Female faces City vs Rural - Male faces Village rank - Female faces Village rank - Male faces
Predictors Estimates std. Error p Estimates std. Error p Estimates std. Error p Estimates std. Error p
Rural 0.16 0.04 <0.001 0.02 0.04 0.668
Age 0.00 0.00 0.389 -0.00 0.00 0.845 0.00 0.00 0.794 -0.00 0.00 0.174
Rank 0.01 0.01 0.419 0.03 0.01 0.035
Observations 300 300 260 260
R2 / R2 adjusted 0.051 / 0.045 0.001 / -0.006 0.003 / -0.005 0.021 / 0.014

6 Writing limited variables file for sharing

# facedata %>% select(village,  sex,    rural,  TV, Agegroup,   income, educ,   MascPref_MF,    MascPref_FF,Female_Face_1_MAS1, Female_Face_2_MAS1, Female_Face_3_MAS1, Female_Face_4_MAS1, Female_Face_5_MAS1, Male_Face_1_MAS1,   Male_Face_2_MAS1,   Male_Face_3_MAS1,   Male_Face_4_MAS1,   Male_Face_5_MAS1) %>%
#   write.csv("limited_data_file.csv")

7 Session information

#save session info
sessionInfo()
## R version 4.0.3 (2020-10-10)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19041)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252    LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                            LC_TIME=English_United Kingdom.1252    
## 
## attached base packages:
## [1] splines   stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] readxl_1.3.1    ggplot2_3.3.3   sjPlot_2.8.6    apaTables_2.0.8 lme4_1.1-26     Matrix_1.2-18   stargazer_5.2.2 tidyr_1.1.3     psych_2.0.12    dplyr_1.0.6     rmarkdown_2.4  
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.5        mvtnorm_1.1-1     lattice_0.20-41   assertthat_0.2.1  digest_0.6.25     utf8_1.1.4        cellranger_1.1.0  R6_2.4.1          backports_1.1.10  coda_0.19-4       evaluate_0.14     pillar_1.6.1      rlang_0.4.11      minqa_1.2.4       performance_0.6.1 nloptr_1.2.2.2    effectsize_0.4.1  labeling_0.3      ggeffects_1.0.1   statmod_1.4.35    stringr_1.4.0     munsell_0.5.0     broom_0.7.6       modelr_0.1.8      compiler_4.0.3    xfun_0.18         pkgconfig_2.0.3   parameters_0.10.1 mnormt_2.0.2      tmvnsim_1.0-2     htmltools_0.5.0   insight_0.11.1    tidyselect_1.1.0  tibble_3.0.3      fansi_0.4.1       withr_2.3.0       crayon_1.4.1      MASS_7.3-53       sjmisc_2.8.5      grid_4.0.3        jsonlite_1.7.2    nlme_3.1-149      xtable_1.8-4      gtable_0.3.0      lifecycle_1.0.0   DBI_1.1.1         magrittr_2.0.1    bayestestR_0.8.0  scales_1.1.1     
## [50] estimability_1.3  stringi_1.5.3     farver_2.0.3      ellipsis_0.3.2    generics_0.0.2    vctrs_0.3.8       boot_1.3-25       sjlabelled_1.1.7  tools_4.0.3       glue_1.4.2        purrr_0.3.4       sjstats_0.18.0    emmeans_1.5.3     parallel_4.0.3    yaml_2.2.1        colorspace_1.4-1  knitr_1.30