Poster presentation of the current work at the conference:

Poster presentation of the current work at the conference:

Poster report

1 Procedure & Design

Sequence of tasks for participant:

  • Consent

  • Go through hypothetical online shopping scenarios.

  • When they click reviews button:

    • Clickstop condition: “Reviews were posted by other shoppers just like you. Every person took a minute to post a review that helps you find good products or warns you about concerns.”

    • Control condition: no click-stop screen.

  • A list of review comments posted by previous shoppers are shown.

  • Rate the impression of the product (slider scale from 0 to 100; default value at 50).

  • Repeat the process two more times.

  • Dependent measures:

    • Which of the headphones would you buy?

    • help: How much do you think reading reviews helps you make decisions? (0 to 100; default at 50, “Moderately”).

    • desire 1: How much would you consider posting a review of the headphones? (0 to 100; default at 50, “Moderately”).

    • desire 2: If you get the headphones and are very satisfied, how willing would you be to post a review? (0 to 100; default at 50, “Moderately”).

    • desire 3: If you get the headphones and are very dis-satisfied, how willing would you be to post a review? (0 to 100; default at 50, “Moderately”).

    • desire 4: If you get the headphones and later receive an email asking you to post a review, how willing would you be? (0 to 100; default at 50, “Moderately”).

  • 8 attitude questions about posting reviews: To what extent do you agree or disagree with the following statements? When you were considering your willingness to review, you had in mind that (-100 to +100; default at 0, “Neither Agree nor Disagree”)

    • people who read reviews should contribute reviews (shouldPost)

    • people have no obligation to post reviews even if they read reviews (noObligation)

    • people who post reviews are providing free labor to sellers (freeLabor)

    • sellers or producers should compensate people to post reviews (compensate)

    • it only takes a minute to post a review (notmuchTime)

    • it takes too much time to post a review (toomuchTime)

    • most reviews are fake and not posted by genuine shoppers (fake)

    • most reviews are real and posted by genuine shoppers (genuine)

  • Attention check: How many reviewer comments were shown for each product? (Answer: 4 comments)

  • Gender and age

2 Read in and “clean” the data

See comments in R code for explanation of each step:

# Housekeeping:
graphics.off()
rm(list=ls()) 

#Mturk
Data = read.csv( "Data.csv" )

#First data had a recording problem
Data = Data[-1,]


# First row is explanation of headers, second row is Qualtrics data ID. Store
# info from 1st & 2nd rows, then remove from data frame:
columnInfo = Data[c(1,2),]
Data = droplevels.data.frame( Data[ -c(1,2) , ] )


# Include only rows who finished the survey:
# Finished: response 1 is finished
Data = droplevels( Data[ Data$Finished == 1, ])


# Include only rows who consented to participate:
# Q1 is consent question, response 2 is consent.
Data = droplevels( Data[ Data$Q1 == 2, ] )


# Utility function for "de-factoring" a factor:
factorContent = function( x , returnNumeric=TRUE){
  if ( class(x)=="factor" ) {
    if ( returnNumeric ) {
      return( as.numeric( levels(x)[x] ) )
    } else {
      return( levels(x)[x] )
    }
  } else {
    if ( class(x)=="character" ) {
      if ( returnNumeric ) {
        return( as.numeric( x ) )
      } else {
        return( x )
      }
    } else { # class(x) is none of above
      return(x)
    }
  }
}


# Convert factor-coded numeric responses to numeric vectors:
for ( colName in c( "Duration..in.seconds.","LocationLatitude","LocationLongitude",

                    "CS_impression1_1", "CS_impression2_1", "CS_impression3_1", 
                    
                    "Ctrl_impression1_1", "Ctrl_impression2_1", "Ctrl_impression3_1",
                    
                    "choice", 
                    
                    "help_1", "desire1_1", "desire2_1", "desire3_1", "desire4_1",
                    
                    "shouldPost_1", "noObligation_1", "freeLabor_1", "compensate_1", 
                    "notmuchTime_1", "toomuchTime_1", "fake_1", "genuine_1",
                    
                    "Attention",
                    
                    "Age", "Gender" ) ) { 
  Data[,colName] = factorContent( Data[,colName] )
}


# Remove irrelevant columns (e.g., date, IP address, etc.):
irrelCols = which( colnames(Data)
                   %in% c("StartDate", "EndDate", "Status", "IPAddress",
                          "Progress", "Finished", "RecordedDate", "ResponseId",
                          "RecipientLastName", "RecipientFirstName",
                          "RecipientEmail", "ExternalReference",
                          #"LocationLatitude", "LocationLongitude",
                          "DistributionChannel", "UserLanguage",
                          "Q_RecaptchaScore", "Q92" ) )
Data = Data[, -irrelCols]


# Remove Mturk data that were collected before the finalized version (without the additional attitude questions):
Data = Data[!is.na(Data$genuine_1), ]


# Remove subjects who failed attention check.
nSubj = nrow(Data)
subjCorrect = rep(FALSE,nSubj)
for ( sIdx in 1:nSubj ) {
  Attentioncheck = as.numeric( Data[sIdx,"Attention"] )
  Attentioncorrect = all( Attentioncheck == 4)
  if ( Attentioncorrect ) subjCorrect[sIdx]=TRUE
}

DataOfAttentionFail = droplevels( Data[ !subjCorrect , ] )
DataAfterCheck = droplevels( Data[ subjCorrect , ] )


## Remove data with inconsistent attitude answers
# Exclude if any of the following occur:
# * the genuine and fake ratings are both greater than 50+margin
# * the genuine and fake ratings are both less than 50-margin
# * the not-much-time and too-much-time ratings are both greater than 50+margin
# * the not-much-time and too-much-time ratings are both less than 50-margin

margin = 20

nSubj = nrow(DataAfterCheck)
subjCorrect = rep(TRUE,nSubj)
for ( sIdx in 1:nSubj ) {
  genuine = as.numeric( DataAfterCheck[sIdx,"genuine_1"] )
  fake = as.numeric( DataAfterCheck[sIdx, "fake_1"]  )
  notmuchTime = as.numeric( DataAfterCheck[sIdx,"notmuchTime_1"] )
  toomuchTime = as.numeric( DataAfterCheck[sIdx, "toomuchTime_1"]  )
  Consistent = all(
    genuine > 50+margin & fake > 50+margin |
    genuine < -50-margin & fake < -50-margin |
    notmuchTime > 50+margin & toomuchTime > 50+margin |
    notmuchTime < -50-margin & toomuchTime < -50-margin
    )
                      
  if (Consistent) subjCorrect[sIdx]=FALSE
}

# Remove inconsistent subjects:
DataMargin = droplevels( DataAfterCheck[ !subjCorrect , ] )
DataAfterCheck = droplevels( DataAfterCheck[ subjCorrect , ] )

# Change column name:
names(DataAfterCheck)[names(DataAfterCheck) == "FL_19_DO"]  = "Condition"

## Click-stop data: 
ClickstopAfterCheck =  DataAfterCheck[ which(DataAfterCheck$Condition == "Click-stop"), ]


## Control data:
ControlAfterCheck =  DataAfterCheck[ which(DataAfterCheck$Condition == "Control"), ]


### Demographics

## Total data
# Age
ageTotal = summary(DataAfterCheck$Age)
show(ageTotal)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   22.00   32.00   39.50   41.98   49.00   85.00
# Gender
library("plyr")
genderTotal = count(DataAfterCheck$Gender)
genderTotal
##   x freq
## 1 1  224
## 2 2  334
## 3 3    2
## 4 4    2
maleLabel = 1 # index for male respondents
femaleLabel = 2 # index for female respondents

maleTotal = genderTotal[maleLabel, 2] / nrow(DataAfterCheck)
maleTotal
## [1] 0.3985765
femaleTotal = genderTotal[femaleLabel, 2] / nrow(DataAfterCheck)
femaleTotal
## [1] 0.594306
## Clickstop and Control 
# Clickstop Age
ageClickstop = summary(ClickstopAfterCheck$Age)
ageClickstop
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   23.00   32.00   39.00   41.82   49.00   85.00
# Clickstop Gender
genderClickstop = count(ClickstopAfterCheck$Gender)
genderClickstop
##   x freq
## 1 1  113
## 2 2  160
## 3 3    2
## 4 4    2
maleClickstop = genderClickstop[maleLabel,2] / nrow(ClickstopAfterCheck)
maleClickstop
## [1] 0.4079422
femaleClickstop = genderClickstop[femaleLabel,2] / nrow(ClickstopAfterCheck)
femaleClickstop
## [1] 0.5776173
# Control Age
ageControl = summary(ControlAfterCheck$Age)
ageControl
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   22.00   33.00   40.00   42.13   50.00   74.00
# Control Gender
genderControl = count(ControlAfterCheck$Gender)
genderControl
##   x freq
## 1 1  111
## 2 2  174
maleControl = genderControl[maleLabel,2] / nrow(ControlAfterCheck)
maleControl
## [1] 0.3894737
femaleControl = genderControl[femaleLabel,2] / nrow(ControlAfterCheck)
femaleControl
## [1] 0.6105263

3 Some initial looks

Sample size

Total N

nrow(DataAfterCheck)
## [1] 562

Control Condition

nrow(ControlAfterCheck)
## [1] 285

Click-stop Condition

nrow(ClickstopAfterCheck)
## [1] 277

A map of locations

par(mfrow=c(1,1))
plot( DataAfterCheck$LocationLongitude , DataAfterCheck$LocationLatitude ,
      xlab="Longitude" , ylab="Latitude" , main="Locations" )
cities = data.frame(
  name=c("Seattle","LosAngeles","Chicago","NewYork","Miami",
         "Anchorage","Honolulu") ,
  lat=c(47.6062,34.0522,41.8781,40.7128,25.7617,
        61.2181,21.3069) ,
  long=c(-122.3321,-118.2437,-87.6298,-74.0060,-80.1918,
         -149.9003,-157.8583) )
for ( citIdx in 1:nrow(cities) ) {
  points( x=cities$long[citIdx] , y=cities$lat[citIdx] , 
          pch="+" , col="red" )
  text( x=cities$long[citIdx] , y=cities$lat[citIdx] , 
        labels=cities$name[citIdx] , col="red" , 
        cex=0.75 , adj=c(0.5,-0.5) )
}

Duration

medianDuration = median( DataAfterCheck$Duration..in.seconds. / 60  )
hist( DataAfterCheck$Duration..in.seconds. / 60 ,
      xlab="Minutes" ,
      main=bquote("Median Duration: "*.(round(medianDuration,2)))  )
abline(v=medianDuration,lty="dotted")

4 Help ratings

Ctrl_help2 = ControlAfterCheck$help_1
summary(Ctrl_help2)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   71.00   84.00   80.89   92.00  100.00
hist(Ctrl_help2, main = "Control condition: Help rating",
     xlim = c(0,100),
     probability = TRUE,
     breaks = 10)

CS_help2 = ClickstopAfterCheck$help_1
summary(CS_help2)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    9.00   74.00   86.00   82.55   95.00  100.00
hist(CS_help2, main = "Click-stop condition: Help rating",
     xlim = c(0,100),
     probability = TRUE,
     breaks = 10)

# t-test:
t.test(Ctrl_help2, CS_help2)
## 
##  Welch Two Sample t-test
## 
## data:  Ctrl_help2 and CS_help2
## t = -1.211, df = 559.53, p-value = 0.2264
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.336379  1.028582
## sample estimates:
## mean of x mean of y 
##  80.89123  82.54513
# Kruskal-wallis test:
kruskal.test(help_1 ~ Condition, DataAfterCheck)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  help_1 by Condition
## Kruskal-Wallis chi-squared = 1.8537, df = 1, p-value = 0.1733

5 Desire to post

Graph of 4 desire-to-post Q’s in the two conditions:

library(psych)
pairs.panels(ControlAfterCheck[,c( "desire1_1", "desire2_1", 
                                   "desire3_1", "desire4_1" )] ,
             main="Control Condition" ,
             method = "pearson", # correlation method
             hist.col = "#00AFBB",
             density = TRUE,  # show density plots
             ellipses = TRUE, # show correlation ellipses
             #pch = ".",
             gap=0
)

pairs.panels(ClickstopAfterCheck[,c( "desire1_1", "desire2_1", 
                                     "desire3_1", "desire4_1" )] ,
             main="Clickstop Condition" ,
             method = "pearson", # correlation method
             hist.col = "#00AFBB",
             density = TRUE,  # show density plots
             ellipses = TRUE, # show correlation ellipses
             #pch = ".",
             gap=0
)

## Cronbach's alpha
ControlDesire = ControlAfterCheck[,c( "desire1_1", "desire2_1", 
                                   "desire3_1", "desire4_1" )]

CSDesire = ClickstopAfterCheck[,c( "desire1_1", "desire2_1", 
                                     "desire3_1", "desire4_1" )] 

alpha(ControlDesire)
## Number of categories should be increased  in order to count frequencies.
## 
## Reliability analysis   
## Call: alpha(x = ControlDesire)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N    ase mean sd median_r
##       0.92      0.92    0.91      0.73  11 0.0081   63 25     0.72
## 
##     95% confidence boundaries 
##          lower alpha upper
## Feldt      0.9  0.92  0.93
## Duhachek   0.9  0.92  0.93
## 
##  Reliability if an item is dropped:
##           raw_alpha std.alpha G6(smc) average_r  S/N alpha se  var.r med.r
## desire1_1      0.87      0.87    0.82      0.68  6.5   0.0137 0.0045  0.71
## desire2_1      0.86      0.86    0.82      0.68  6.3   0.0140 0.0049  0.68
## desire3_1      0.92      0.92    0.91      0.80 12.0   0.0082 0.0101  0.75
## desire4_1      0.91      0.91    0.89      0.77  9.8   0.0097 0.0170  0.71
## 
##  Item statistics 
##             n raw.r std.r r.cor r.drop mean sd
## desire1_1 285  0.94  0.93  0.94   0.88   58 29
## desire2_1 285  0.94  0.94  0.94   0.89   64 29
## desire3_1 285  0.83  0.84  0.74   0.71   73 26
## desire4_1 285  0.87  0.86  0.79   0.76   57 28
alpha(CSDesire)
## Number of categories should be increased  in order to count frequencies.
## 
## Reliability analysis   
## Call: alpha(x = CSDesire)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N    ase mean sd median_r
##       0.91      0.91     0.9      0.72  10 0.0082   69 24     0.71
## 
##     95% confidence boundaries 
##          lower alpha upper
## Feldt      0.9  0.91  0.93
## Duhachek   0.9  0.91  0.93
## 
##  Reliability if an item is dropped:
##           raw_alpha std.alpha G6(smc) average_r  S/N alpha se  var.r med.r
## desire1_1      0.87      0.87    0.83      0.68  6.4   0.0137 0.0114  0.65
## desire2_1      0.86      0.86    0.82      0.67  6.2   0.0141 0.0085  0.65
## desire3_1      0.93      0.93    0.91      0.82 13.5   0.0073 0.0026  0.80
## desire4_1      0.89      0.89    0.86      0.72  7.8   0.0116 0.0174  0.65
## 
##  Item statistics 
##             n raw.r std.r r.cor r.drop mean sd
## desire1_1 277  0.93  0.93  0.91   0.87   64 28
## desire2_1 277  0.94  0.93  0.93   0.88   70 27
## desire3_1 277  0.80  0.81  0.69   0.67   76 24
## desire4_1 277  0.90  0.89  0.84   0.81   65 28
DataDesire = DataAfterCheck[,c( "desire1_1", "desire2_1", 
                                   "desire3_1", "desire4_1" )]

alpha(DataDesire)
## Number of categories should be increased  in order to count frequencies.
## 
## Reliability analysis   
## Call: alpha(x = DataDesire)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N    ase mean sd median_r
##       0.92      0.92     0.9      0.73  11 0.0057   66 25     0.72
## 
##     95% confidence boundaries 
##          lower alpha upper
## Feldt     0.90  0.92  0.93
## Duhachek  0.91  0.92  0.93
## 
##  Reliability if an item is dropped:
##           raw_alpha std.alpha G6(smc) average_r  S/N alpha se  var.r med.r
## desire1_1      0.87      0.87    0.82      0.69  6.5   0.0096 0.0069  0.68
## desire2_1      0.86      0.86    0.82      0.68  6.3   0.0098 0.0064  0.67
## desire3_1      0.93      0.93    0.91      0.81 12.9   0.0054 0.0056  0.77
## desire4_1      0.90      0.90    0.88      0.75  8.9   0.0074 0.0169  0.68
## 
##  Item statistics 
##             n raw.r std.r r.cor r.drop mean sd
## desire1_1 562  0.93  0.93  0.93   0.88   61 29
## desire2_1 562  0.94  0.94  0.94   0.89   67 28
## desire3_1 562  0.82  0.83  0.72   0.70   74 25
## desire4_1 562  0.88  0.88  0.82   0.79   61 28
library(psych)
pairs.panels(Data[,c( "desire1_1", "desire2_1", 
                                   "desire3_1", "desire4_1" )] ,
             main="Email Condition" ,
             method = "pearson", # correlation method
             hist.col = "#00AFBB",
             density = TRUE,  # show density plots
             ellipses = TRUE, # show correlation ellipses
             #pch = ".",
             gap=0
)

meanControlDesire = rowMeans(Data[,grep("desire",colnames(Data))])

Dissatisfied vs. Satisfied

Is desire to post greater for dissatisfied (Q3) than satisfied (Q2)?

  • Yes for both conditions. The difference is larger in the control condition:
# Result of t.test is x-y.
t.test( x = ControlAfterCheck$desire3_1 , # dissat
        y = ControlAfterCheck$desire2_1 , # sat
        paired = TRUE )
## 
##  Paired t-test
## 
## data:  ControlAfterCheck$desire3_1 and ControlAfterCheck$desire2_1
## t = 6.6092, df = 284, p-value = 1.906e-10
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##   5.821932 10.760525
## sample estimates:
## mean difference 
##        8.291228
t.test( x = ClickstopAfterCheck$desire3_1 , # dissat
        y = ClickstopAfterCheck$desire2_1 , # sat
        paired = TRUE )
## 
##  Paired t-test
## 
## data:  ClickstopAfterCheck$desire3_1 and ClickstopAfterCheck$desire2_1
## t = 4.5633, df = 276, p-value = 7.586e-06
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  3.395203 8.547035
## sample estimates:
## mean difference 
##        5.971119
# Kruskal-wallis test:
kruskal.test(list(ControlAfterCheck$desire2_1, ControlAfterCheck$desire3_1))
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(ControlAfterCheck$desire2_1, ControlAfterCheck$desire3_1)
## Kruskal-Wallis chi-squared = 13.829, df = 1, p-value = 0.0002002
kruskal.test(list(ClickstopAfterCheck$desire2_1, ClickstopAfterCheck$desire3_1))
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(ClickstopAfterCheck$desire2_1, ClickstopAfterCheck$desire3_1)
## Kruskal-Wallis chi-squared = 5.5243, df = 1, p-value = 0.01875

Mean desire to post

Difference between conditions for mean desire to post:

meanClickstopDesire = rowMeans(ClickstopAfterCheck[,grep("desire",colnames(ClickstopAfterCheck))])


meanControlDesire = rowMeans(ControlAfterCheck[,grep("desire",colnames(ControlAfterCheck))])


# ClickstopAfterCheck$ClickstopIntention = meanClickstopDesire
# ControlAfterCheck$ControlIntention = meanControlDesire
# 
# library("plotrix")
# std.error(ClickstopAfterCheck$ClickstopIntention)
# std.error(ControlAfterCheck$ControlIntention)


hist( meanControlDesire , breaks=seq(0,100,10) ,
      probability = TRUE,
      xlab="Desire" , main="Mean Desire (4Q's), Control Condition")

hist( meanClickstopDesire , breaks=seq(0,100,10) , 
      probability = TRUE,
      xlab="Desire" , main="Mean Desire (4Q's), Click-stop Condition" )

t.test( 
  x = meanControlDesire ,
  y = meanClickstopDesire )
## 
##  Welch Two Sample t-test
## 
## data:  meanControlDesire and meanClickstopDesire
## t = -2.8166, df = 559.9, p-value = 0.005025
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -9.869401 -1.759594
## sample estimates:
## mean of x mean of y 
##  63.13947  68.95397
# ## Effect size
# library("effectsize")
# 
# cohensd = cohens_d(meanClickstopDesire, meanControlDesire,
#          data = c(ClickstopAfterCheck, ControlAfterCheck),
#          correction = FALSE,
#          pooled_sd = TRUE,
#          paired = FALSE,
#          ci = 0.95)
# cohensd[1]
#  
# # The calculation below shows the same value.
# pooled_sd = sqrt((sd(meanClickstopDesire)^2 + sd(meanControlDesire)^2)/2)
# calculated_cohensd = (mean(meanClickstopDesire) - mean(meanControlDesire)) / pooled_sd
# show(calculated_cohensd)
# 
# ## Power analysis
# library("pwr")
# n1 = length(meanClickstopDesire)
# n2 = length(meanControlDesire)
# 
# # what's the current power?
# pwr.t2n.test(n1,n2,
#              d = calculated_cohensd,
#              sig.level = 0.05)

Kruskal-wallis test

DataAfterCheck$meanDesire = rowMeans(DataAfterCheck[,grep("desire",colnames(DataAfterCheck))])

kruskal.test(meanDesire ~ Condition, DataAfterCheck)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  meanDesire by Condition
## Kruskal-Wallis chi-squared = 8.7031, df = 1, p-value = 0.003177

Generic desire to post (Q1):

Ctrl_post2 = ControlAfterCheck$desire1_1
summary(Ctrl_post2)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0    40.0    62.0    58.4    81.0   100.0
hist(Ctrl_post2, main = bquote("Control: Generic Desire (Q1). Mean = " *.(round(mean(Ctrl_post2),2)) ),
     breaks = 10,
     probability = TRUE,
     xlim = c(0,100))

CS_post2 = ClickstopAfterCheck$desire1_1
summary(CS_post2)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   50.00   70.00   64.35   90.00  100.00
hist(CS_post2, main = bquote("Click-stop: Generic Desire (Q1). Mean = " *.(round(mean(CS_post2),2)) ),
     breaks = 10,
     probability = TRUE,
     xlim = c(0,100))

t.test(Ctrl_post2, CS_post2)
## 
##  Welch Two Sample t-test
## 
## data:  Ctrl_post2 and CS_post2
## t = -2.4847, df = 559.87, p-value = 0.01326
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -10.654033  -1.246531
## sample estimates:
## mean of x mean of y 
##  58.40351  64.35379

Kruskal-wallis test

kruskal.test(desire1_1 ~ Condition, DataAfterCheck)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  desire1_1 by Condition
## Kruskal-Wallis chi-squared = 6.8199, df = 1, p-value = 0.009015

If satisfied (Q2)

Ctrl_satisfied = ControlAfterCheck$desire2_1
summary(Ctrl_satisfied)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   43.00   71.00   64.31   88.00  100.00
hist(Ctrl_satisfied, main = bquote("Control: if satisfied (Q2). Mean = " *.(round(mean(Ctrl_satisfied),2)) ),
     breaks = 10,
     probability = TRUE,
     xlim = c(0,100))

CS_satisfied = ClickstopAfterCheck$desire2_1
summary(CS_satisfied)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   50.00   78.00   70.37   94.00  100.00
hist(CS_satisfied, main = bquote("Click-stop: if satisfied (Q2). Mean = " *.(round(mean(CS_satisfied),2)) ),
     breaks = 10,
     probability = TRUE,
     xlim = c(0,100))

t.test(Ctrl_satisfied, CS_satisfied)
## 
##  Welch Two Sample t-test
## 
## data:  Ctrl_satisfied and CS_satisfied
## t = -2.5637, df = 559.94, p-value = 0.01061
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -10.702087  -1.417034
## sample estimates:
## mean of x mean of y 
##  64.31228  70.37184

Kruskal-wallis test

kruskal.test(desire2_1 ~ Condition, DataAfterCheck)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  desire2_1 by Condition
## Kruskal-Wallis chi-squared = 7.206, df = 1, p-value = 0.007266

If dissatisfied (Q3):

Ctrl_dissatisfied = ControlAfterCheck$desire3_1
summary(Ctrl_dissatisfied)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0    60.0    80.0    72.6    94.0   100.0
hist(Ctrl_dissatisfied, main = bquote("Control: if dissatisfied (Q3). Mean = " *.(round(mean(Ctrl_dissatisfied),2)) ),
     breaks = 10,
     probability = TRUE,
     xlim = c(0,100))

CS_dissatisfied = ClickstopAfterCheck$desire3_1
summary(CS_dissatisfied)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   65.00   81.00   76.34   95.00  100.00
hist(CS_dissatisfied, main = bquote("Click-stop: if dissatisfied (Q3). Mean = " *.(round(mean(CS_dissatisfied),2)) ),
     breaks = 10,
     probability = TRUE,
     xlim = c(0,100))

t.test(Ctrl_dissatisfied, CS_dissatisfied)
## 
##  Welch Two Sample t-test
## 
## data:  Ctrl_dissatisfied and CS_dissatisfied
## t = -1.773, df = 556.58, p-value = 0.07677
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -7.8821967  0.4032937
## sample estimates:
## mean of x mean of y 
##  72.60351  76.34296

Kruskal-wallis test

kruskal.test(desire3_1 ~ Condition, DataAfterCheck)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  desire3_1 by Condition
## Kruskal-Wallis chi-squared = 2.2392, df = 1, p-value = 0.1346

Desire to respond to an email (Q4):

Ctrl_email = ControlAfterCheck$desire4_1
summary(Ctrl_email)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   40.00   56.00   57.24   80.00  100.00
hist(Ctrl_email, main = bquote("Control: Desire to respond to email (Q4). Mean = " *.(round(mean(Ctrl_email),2)) ),
     breaks = 10,
     probability = TRUE,
     xlim = c(0,100))

CS_email = ClickstopAfterCheck$desire4_1
summary(CS_email)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   50.00   71.00   64.75   87.00  100.00
hist(CS_email, main = bquote("Click-stop: Desire to respond to email (Q4). Mean = " *.(round(mean(CS_email),2)) ),
     breaks = 10,
     probability = TRUE,
     xlim = c(0,100))

t.test(Ctrl_email, CS_email)
## 
##  Welch Two Sample t-test
## 
## data:  Ctrl_email and CS_email
## t = -3.1743, df = 559.77, p-value = 0.001585
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -12.154997  -2.862395
## sample estimates:
## mean of x mean of y 
##  57.23860  64.74729

Kruskal-wallis test

kruskal.test(desire4_1 ~ Condition, DataAfterCheck)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  desire4_1 by Condition
## Kruskal-Wallis chi-squared = 11.457, df = 1, p-value = 0.0007121

6 Gender effects on Desire to post

Gender data extraction:

ControlMale = ControlAfterCheck[which(ControlAfterCheck$Gender == maleLabel),]
ControlFemale = ControlAfterCheck[which(ControlAfterCheck$Gender == femaleLabel),]

ClickstopMale = ClickstopAfterCheck[which(ClickstopAfterCheck$Gender == maleLabel),]
ClickstopFemale = ClickstopAfterCheck[which(ClickstopAfterCheck$Gender == femaleLabel),]

GenderData = rbind(ControlFemale, ClickstopFemale, ControlMale, ClickstopMale)

# append columns with meaningful names:
GenderData$Gendername[GenderData$Gender == maleLabel] = "Male"
GenderData$Gendername[GenderData$Gender == femaleLabel] = "Female"
GenderData$Gendername = factor(GenderData$Gendername)

Mean desire

Effect of message among men vs. women in the mean desire-to-post

  • Strong effect among men, but not among women:
# male
meanControlDesireMale = rowMeans(ControlMale[,grep("desire",colnames(ControlMale))])

meanClickstopDesireMale = rowMeans(ClickstopMale[,grep("desire",colnames(ClickstopMale))])

# female
meanControlDesireFemale = rowMeans(ControlFemale[,grep("desire",colnames(ControlFemale))])

meanClickstopDesireFemale = rowMeans(ClickstopFemale[,grep("desire",colnames(ClickstopFemale))])


# t-test:
t.test(meanControlDesireMale, meanClickstopDesireMale)  #male
## 
##  Welch Two Sample t-test
## 
## data:  meanControlDesireMale and meanClickstopDesireMale
## t = -2.4147, df = 221.31, p-value = 0.01656
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -14.270225  -1.444636
## sample estimates:
## mean of x mean of y 
##  55.93018  63.78761
t.test(meanControlDesireFemale, meanClickstopDesireFemale)  #female
## 
##  Welch Two Sample t-test
## 
## data:  meanControlDesireFemale and meanClickstopDesireFemale
## t = -1.9281, df = 331.8, p-value = 0.0547
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -10.0676593   0.1009208
## sample estimates:
## mean of x mean of y 
##  67.73851  72.72187
# Kruskal-wallis test:
kruskal.test(list(meanControlDesireMale, meanClickstopDesireMale))  #male
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(meanControlDesireMale, meanClickstopDesireMale)
## Kruskal-Wallis chi-squared = 6.4809, df = 1, p-value = 0.0109
kruskal.test(list(meanControlDesireFemale, meanClickstopDesireFemale))  #female
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(meanControlDesireFemale, meanClickstopDesireFemale)
## Kruskal-Wallis chi-squared = 3.2438, df = 1, p-value = 0.07169

Generic desire (Q1)

Effect of message among men vs. women in Q1

  • Strong effect among men, but not among women:
# Male
ControlMalePost = ControlMale$desire1_1

CSMalePost = ClickstopMale$desire1_1

# Female
ControlFemalePost = ControlFemale$desire1_1

CSFemalePost = ClickstopFemale$desire1_1

# t-test:
t.test( ControlMalePost, CSMalePost )  #male
## 
##  Welch Two Sample t-test
## 
## data:  ControlMalePost and CSMalePost
## t = -1.8185, df = 221.7, p-value = 0.07034
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -14.5011532   0.5826329
## sample estimates:
## mean of x mean of y 
##  50.80180  57.76106
t.test( ControlFemalePost, CSFemalePost)  #female
## 
##  Welch Two Sample t-test
## 
## data:  ControlFemalePost and CSFemalePost
## t = -2.1403, df = 331.98, p-value = 0.03306
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -12.1446536  -0.5120993
## sample estimates:
## mean of x mean of y 
##  63.25287  69.58125
# Kruskal-wallis test:
kruskal.test(list(ControlMalePost, CSMalePost))  #male
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(ControlMalePost, CSMalePost)
## Kruskal-Wallis chi-squared = 3.3605, df = 1, p-value = 0.06678
kruskal.test(list(ControlFemalePost, CSFemalePost))  #female
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(ControlFemalePost, CSFemalePost)
## Kruskal-Wallis chi-squared = 4.5027, df = 1, p-value = 0.03384

When dissatisfied (Q3)

Effect of message among men vs. women in Q3

  • Strong effect among men, but not among women:
# Male
ControlMaleQ3 = ControlMale$desire3_1

CSMaleQ3 = ClickstopMale$desire3_1

# Female
ControlFemaleQ3 = ControlFemale$desire3_1

CSFemaleQ3 = ClickstopFemale$desire3_1

# t-test:
t.test( ControlMaleQ3, CSMaleQ3 )  #male
## 
##  Welch Two Sample t-test
## 
## data:  ControlMaleQ3 and CSMaleQ3
## t = -2.5304, df = 220.35, p-value = 0.01209
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -14.498223  -1.802503
## sample estimates:
## mean of x mean of y 
##  67.50450  75.65487
t.test( ControlFemaleQ3, CSFemaleQ3)  #female
## 
##  Welch Two Sample t-test
## 
## data:  ControlFemaleQ3 and CSFemaleQ3
## t = -0.27898, df = 331.82, p-value = 0.7804
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -6.239138  4.689282
## sample estimates:
## mean of x mean of y 
##  75.85632  76.63125
# Kruskal-wallis test:
kruskal.test(list(ControlMaleQ3, CSMaleQ3))  #male
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(ControlMaleQ3, CSMaleQ3)
## Kruskal-Wallis chi-squared = 7.0344, df = 1, p-value = 0.007996
kruskal.test(list(ControlFemaleQ3, CSFemaleQ3))  #female
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(ControlFemaleQ3, CSFemaleQ3)
## Kruskal-Wallis chi-squared = 0.10266, df = 1, p-value = 0.7487

respond to email (Q4)

Effect of message among men vs. women in Q4

  • Strong effect among men, and marginal effect among women:
# male
ControlMaleQ4 = ControlMale$desire4_1

CSMaleQ4 = ClickstopMale$desire4_1

# female
ControlFemaleQ4 = ControlFemale$desire4_1

CSFemaleQ4 = ClickstopFemale$desire4_1

# t-test:
t.test( ControlMaleQ4, CSMaleQ4 )  #male
## 
##  Welch Two Sample t-test
## 
## data:  ControlMaleQ4 and CSMaleQ4
## t = -2.575, df = 220.66, p-value = 0.01068
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -16.645956  -2.212531
## sample estimates:
## mean of x mean of y 
##  48.74775  58.17699
t.test( ControlFemaleQ4, CSFemaleQ4)  #female
## 
##  Welch Two Sample t-test
## 
## data:  ControlFemaleQ4 and CSFemaleQ4
## t = -2.3202, df = 331.96, p-value = 0.02094
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -12.752040  -1.050115
## sample estimates:
## mean of x mean of y 
##  62.65517  69.55625
# Kruskal-wallis test:
kruskal.test(list(ControlMaleQ4, CSMaleQ4))  #male
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(ControlMaleQ4, CSMaleQ4)
## Kruskal-Wallis chi-squared = 6.749, df = 1, p-value = 0.00938
kruskal.test(list(ControlFemaleQ4, CSFemaleQ4))  #female
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(ControlFemaleQ4, CSFemaleQ4)
## Kruskal-Wallis chi-squared = 5.4018, df = 1, p-value = 0.02012

One thing to note: in this study, the percentage of male was: 0.4, and the percentage of female was: 0.59.

Two-way ANOVA

Mean Desire:

GenderData$meanDesire = rowMeans(GenderData[,grep("desire",colnames(GenderData))])

## Mean desire
anovaMeanDesire = aov( meanDesire ~ Gendername * Condition, GenderData)
summary(anovaMeanDesire)
##                       Df Sum Sq Mean Sq F value   Pr(>F)    
## Gendername             1  14037   14037  24.426 1.02e-06 ***
## Condition              1   5250    5250   9.137  0.00262 ** 
## Gendername:Condition   1    277     277   0.481  0.48805    
## Residuals            554 318359     575                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
library("ggpubr")
## Loading required package: ggplot2
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
## 
## Attaching package: 'ggpubr'
## The following object is masked from 'package:plyr':
## 
##     mutate
ggline(GenderData, x = "Condition", y = "meanDesire", color = "Gendername", linetype = "Gendername",
          palette = c("indianred3", "steelblue"),
          add = "mean_se", size = 1.1)

# Interaction Power analysis:
library(Superpower)

ControlMaleMean = rowMeans(ControlMale[,grep("desire",colnames(ControlMale))])
ControlFemaleMean = rowMeans(ControlFemale[,grep("desire",colnames(ControlFemale))])

ClickstopMaleMean = rowMeans(ClickstopMale[,grep("desire",colnames(ClickstopMale))])
ClickstopFemaleMean = rowMeans(ClickstopFemale[,grep("desire",colnames(ClickstopFemale))])

pooled_sd = sqrt((sd(ControlFemaleMean)^2 + sd(ControlMaleMean)^2)/2)
pooled_sd = sqrt((sd(ClickstopFemaleMean)^2 + sd(ClickstopMaleMean)^2)/2)

#a1 = Control
#a2 = Clickstop
#b1 = Male
#b2 = Female

design = ANOVA_design(
  design = "2b*2b", 
  n = 219, 
  mu = c(
    mean(ControlMaleMean),
    mean(ControlFemaleMean),
    mean(ClickstopMaleMean),
    mean(ClickstopFemaleMean)
         ), 
  sd = pooled_sd,
  plot = FALSE)

ANOVA_exact(design, alpha_level = 0.05)
## Power and Effect sizes for ANOVA tests
##       power partial_eta_squared cohen_f non_centrality
## a   97.8462              0.0179  0.1350        15.8989
## b   99.9996              0.0454  0.2181        41.4866
## a:b 14.4826              0.0009  0.0302         0.7965
## 
## Power and Effect sizes for pairwise comparisons (t-tests)
##                        power effect_size
## p_a_a1_b_b1_a_a1_b_b2  99.93        0.50
## p_a_a1_b_b1_a_a2_b_b1  93.10        0.33
## p_a_a1_b_b1_a_a2_b_b2 100.00        0.70
## p_a_a1_b_b2_a_a2_b_b1  40.96       -0.17
## p_a_a1_b_b2_a_a2_b_b2  58.85        0.21
## p_a_a2_b_b1_a_a2_b_b2  97.47        0.37
## Power and Effect sizes for ANOVA tests
##       power partial_eta_squared cohen_f non_centrality
## a   97.8462              0.0179  0.1350        15.8989
## b   99.9996              0.0454  0.2181        41.4866
## a:b 14.4826              0.0009  0.0302         0.7965
## 
## Power and Effect sizes for pairwise comparisons (t-tests)
##                        power effect_size
## p_a_a1_b_b1_a_a1_b_b2  99.93        0.50
## p_a_a1_b_b1_a_a2_b_b1  93.10        0.33
## p_a_a1_b_b1_a_a2_b_b2 100.00        0.70
## p_a_a1_b_b2_a_a2_b_b1  40.96       -0.17
## p_a_a1_b_b2_a_a2_b_b2  58.85        0.21
## p_a_a2_b_b1_a_a2_b_b2  97.47        0.37

Generic Desire (Q1):

anovaQ1 = aov( desire1_1 ~ Gendername * Condition, GenderData)
summary(anovaQ1)
##                       Df Sum Sq Mean Sq F value   Pr(>F)    
## Gendername             1  19217   19217  25.008 7.67e-07 ***
## Condition              1   6037    6037   7.856  0.00524 ** 
## Gendername:Condition   1     13      13   0.017  0.89526    
## Residuals            554 425720     768                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggline(GenderData, x = "Condition", y = "desire1_1", color = "Gendername",
          palette = c("indianred3", "steelblue"),
          add = "mean_se", size = 1.1)

Desire if satisfied (Q2):

anovaQ2 = aov( desire2_1 ~ Gendername * Condition, GenderData)
summary(anovaQ2)
##                       Df Sum Sq Mean Sq F value   Pr(>F)    
## Gendername             1  18946   18946  25.043 7.54e-07 ***
## Condition              1   5558    5558   7.347  0.00693 ** 
## Gendername:Condition   1     31      31   0.041  0.83971    
## Residuals            554 419124     757                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggline(GenderData, x = "Condition", y = "desire2_1", color = "Gendername",
          palette = c("indianred3", "steelblue"),
          add = "mean_se", size = 1.1)

Desire if dissatisfied (Q3):

anovaQ3 = aov( desire3_1 ~ Gendername * Condition, GenderData)
summary(anovaQ3)
##                       Df Sum Sq Mean Sq F value Pr(>F)  
## Gendername             1   2851  2851.3   4.588 0.0326 *
## Condition              1   1948  1947.8   3.134 0.0772 .
## Gendername:Condition   1   1822  1822.0   2.932 0.0874 .
## Residuals            554 344264   621.4                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggline(GenderData, x = "Condition", y = "desire3_1", color = "Gendername",
          palette = c("indianred3", "steelblue"),
          add = "mean_se", size = 1.1)

# Interaction Power analysis:
ControlMaleMean = ControlMale$desire3_1
ControlFemaleMean = ControlFemale$desire3_1

ClickstopMaleMean = ClickstopMale$desire3_1
ClickstopFemaleMean = ClickstopFemale$desire3_1

pooled_sd = sqrt((sd(ControlFemaleMean)^2 + sd(ControlMaleMean)^2)/2)
pooled_sd = sqrt((sd(ClickstopFemaleMean)^2 + sd(ClickstopMaleMean)^2)/2)

#a1 = Control
#a2 = Clickstop
#b1 = Male
#b2 = Female

design = ANOVA_design(
  design = "2b*2b", 
  n = 219, 
  mu = c(
    mean(ControlMaleMean),
    mean(ControlFemaleMean),
    mean(ClickstopMaleMean),
    mean(ClickstopFemaleMean)
         ), 
  sd = pooled_sd,
  plot = FALSE)

ANOVA_exact(design, alpha_level = 0.05)
## Power and Effect sizes for ANOVA tests
##       power partial_eta_squared cohen_f non_centrality
## a   79.6914              0.0089  0.0946         7.8047
## b   83.0621              0.0097  0.0989         8.5252
## a:b 63.5362              0.0061  0.0782         5.3295
## 
## Power and Effect sizes for pairwise comparisons (t-tests)
##                       power effect_size
## p_a_a1_b_b1_a_a1_b_b2 95.81        0.35
## p_a_a1_b_b1_a_a2_b_b1 94.95        0.34
## p_a_a1_b_b1_a_a2_b_b2 98.08        0.39
## p_a_a1_b_b2_a_a2_b_b1  5.09       -0.01
## p_a_a1_b_b2_a_a2_b_b2  6.35        0.03
## p_a_a2_b_b1_a_a2_b_b2  7.16        0.04
## Power and Effect sizes for ANOVA tests
##       power partial_eta_squared cohen_f non_centrality
## a   79.6914              0.0089  0.0946         7.8047
## b   83.0621              0.0097  0.0989         8.5252
## a:b 63.5362              0.0061  0.0782         5.3295
## 
## Power and Effect sizes for pairwise comparisons (t-tests)
##                       power effect_size
## p_a_a1_b_b1_a_a1_b_b2 95.81        0.35
## p_a_a1_b_b1_a_a2_b_b1 94.95        0.34
## p_a_a1_b_b1_a_a2_b_b2 98.08        0.39
## p_a_a1_b_b2_a_a2_b_b1  5.09       -0.01
## p_a_a1_b_b2_a_a2_b_b2  6.35        0.03
## p_a_a2_b_b1_a_a2_b_b2  7.16        0.04

Desire to respond to an email (Q4):

## respond to email (Q4)
anovaQ4 = aov( desire4_1 ~ Gendername * Condition, GenderData)
summary(anovaQ4)
##                       Df Sum Sq Mean Sq F value   Pr(>F)    
## Gendername             1  20805   20805  27.888 1.85e-07 ***
## Condition              1   8734    8734  11.708 0.000668 ***
## Gendername:Condition   1    214     214   0.287 0.592385    
## Residuals            554 413294     746                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggline(GenderData, x = "Condition", y = "desire4_1", color = "Gendername",
          palette = c("indianred3", "steelblue"),
          add = "mean_se", size = 1.1)


7 Attitudes

Attitudes & Desire (Q1) Correlations:

# Control:
pairs.panels(ControlAfterCheck[,c("shouldPost_1", "noObligation_1", "freeLabor_1", 
                                   "compensate_1", "notmuchTime_1", "toomuchTime_1",
                                  "fake_1" , "genuine_1", "desire1_1" )] ,
             main="Control Condition" ,
             method = "pearson", # correlation method
             hist.col = "#00AFBB",
             density = TRUE,  # show density plots
             ellipses = TRUE, # show correlation ellipses
             #pch = ".",
             gap=0
)

# Clickstop:
pairs.panels(ClickstopAfterCheck[,c("shouldPost_1", "noObligation_1", "freeLabor_1", 
                                   "compensate_1", "notmuchTime_1", "toomuchTime_1",
                                  "fake_1" , "genuine_1", "desire1_1" )] ,
             main="Clickstop Condition" ,
             method = "pearson", # correlation method
             hist.col = "#00AFBB",
             density = TRUE,  # show density plots
             ellipses = TRUE, # show correlation ellipses
             #pch = ".",
             gap=0
)

  • Three positive attitudes, shouldPost, notmuchTime, and genuine are positively related with the desire to post.

  • toomuchTime is negatively related with the desire to post. Small negative correlations with noObligation and fake.

Visualization:

#Control
Ctrl_noObligation = mean(ControlAfterCheck$noObligation_1)
Ctrl_freeLabor = mean(ControlAfterCheck$freeLabor_1)
Ctrl_compensate = mean(ControlAfterCheck$compensate_1)
Ctrl_toomuchTime = mean(ControlAfterCheck$toomuchTime_1)
Ctrl_fake = mean(ControlAfterCheck$fake_1)
Ctrl_shouldPost = mean(ControlAfterCheck$shouldPost_1)
Ctrl_notmuchTime = mean(ControlAfterCheck$notmuchTime_1)
Ctrl_genuine = mean(ControlAfterCheck$genuine_1)

Ctrl_attitudes = c(Ctrl_shouldPost, Ctrl_noObligation, Ctrl_freeLabor, 
                   Ctrl_compensate, Ctrl_toomuchTime, Ctrl_notmuchTime, 
                   Ctrl_fake, Ctrl_genuine)


## Clickstop
Clickstop_noObligation = mean(ClickstopAfterCheck$noObligation_1)
Clickstop_freeLabor = mean(ClickstopAfterCheck$freeLabor_1)
Clickstop_compensate = mean(ClickstopAfterCheck$compensate_1)
Clickstop_toomuchTime = mean(ClickstopAfterCheck$toomuchTime_1)
Clickstop_fake = mean(ClickstopAfterCheck$fake_1)
Clickstop_shouldPost = mean(ClickstopAfterCheck$shouldPost_1)
Clickstop_notmuchTime = mean(ClickstopAfterCheck$notmuchTime_1)
Clickstop_genuine = mean(ClickstopAfterCheck$genuine_1)

Clickstop_attitudes = c(Clickstop_shouldPost, Clickstop_noObligation, Clickstop_freeLabor, 
                        Clickstop_compensate, Clickstop_toomuchTime, Clickstop_notmuchTime,
                        Clickstop_fake, Clickstop_genuine)


CtrlAttitude = as.data.frame(Ctrl_attitudes)
CtrlAttitude2 = as.data.frame(t(CtrlAttitude)) #transpose
names(CtrlAttitude2) = c("shouldPost", "NoObligation", "freeLabor", "shouldPay", "toomuchTime",
                      "notmuchTime", "Fake", "Genuine")


CSAttitude = as.data.frame(Clickstop_attitudes)
CSAttitude2 = as.data.frame(t(CSAttitude)) #transpose
names(CSAttitude2) = c("shouldPost", "NoObligation", "freeLabor", "shouldPay", "toomuchTime",
                      "notmuchTime", "Fake", "Genuine")

Attitudes = rbind(CtrlAttitude2, CSAttitude2)
Attitudes = as.matrix(Attitudes)

## Bar plot
par(mar=c(4, 3.8, 3.5, 0))

barplot = barplot(Attitudes,
        main = "Attitudes: Control vs. Clickstop",
        xlab = "Attitudes", ylab = "(Dis)Agreement Rating",
        col = c("lightgrey","darkorange"),
        beside = TRUE,
        width = 10,
        cex.names=0.65)

legend("topleft", c("Control","Clickstop"), fill = c("lightgrey","darkorange"), cex = .7)
text(barplot, 0, round(Attitudes, 1),cex=0.6,pos=3) 

  • We can see that every measure changes in the positive direction from control to clickstop.

  • That is, the clickstop condition had more generous attitudes toward posting reviews than the control condition in all measures, especially:

    • perceived obligation: increased perceived obligation in the clickstop condition.

    • time perception: the clickstop condition reported that it doesn’t take much time to post reviews (vs. control condition with the opposite perception).

Control vs. Clickstop perceived responsibility

# Put in same direction for ease of understanding: 
# the more positive the number, the more generous attitude
Ctrl_responsibility1 = ControlAfterCheck$shouldPost_1
Ctrl_responsibility2 = -ControlAfterCheck$noObligation_1

CS_responsibility1 = ClickstopAfterCheck$shouldPost_1
CS_responsibility2 = -ClickstopAfterCheck$noObligation_1

Ctrl_responsibilityTotal = (Ctrl_responsibility1 + Ctrl_responsibility2) / 2
CS_responsibilityTotal = (CS_responsibility1 + CS_responsibility2) / 2

# t-test:
t.test(Ctrl_responsibilityTotal, CS_responsibilityTotal)
## 
##  Welch Two Sample t-test
## 
## data:  Ctrl_responsibilityTotal and CS_responsibilityTotal
## t = -3.2153, df = 556.31, p-value = 0.001379
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -19.237791  -4.646787
## sample estimates:
## mean of x mean of y 
## -28.99825 -17.05596
# kruskal-wallis test:
kruskal.test(list(Ctrl_responsibilityTotal, CS_responsibilityTotal))
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(Ctrl_responsibilityTotal, CS_responsibilityTotal)
## Kruskal-Wallis chi-squared = 11.932, df = 1, p-value = 0.0005517

Control vs. Clickstop perceived effort/ease

Ctrl_effort1 = ControlAfterCheck$notmuchTime_1
Ctrl_effort2 = -ControlAfterCheck$toomuchTime_1

CS_effort1 = ClickstopAfterCheck$notmuchTime_1
CS_effort2 = -ClickstopAfterCheck$toomuchTime_1

Ctrl_effortTotal = (Ctrl_effort1 + Ctrl_effort2) / 2
CS_effortTotal = (CS_effort1 + CS_effort2) / 2

# t-test:
t.test(Ctrl_effortTotal, CS_effortTotal)
## 
##  Welch Two Sample t-test
## 
## data:  Ctrl_effortTotal and CS_effortTotal
## t = -3.2915, df = 558.01, p-value = 0.00106
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -23.052364  -5.821637
## sample estimates:
##  mean of x  mean of y 
##  0.7561404 15.1931408
# kruskal-wallis test:
kruskal.test(list(Ctrl_effortTotal, CS_effortTotal))
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(Ctrl_effortTotal, CS_effortTotal)
## Kruskal-Wallis chi-squared = 11.195, df = 1, p-value = 0.0008204

Control vs. Clickstop fake/genuine

Ctrl_genuine = ControlAfterCheck$genuine_1
Ctrl_fake = -ControlAfterCheck$fake_1

CS_genuine = ClickstopAfterCheck$genuine_1
CS_fake = -ClickstopAfterCheck$fake_1

Ctrl_genuineTotal = (Ctrl_genuine + Ctrl_fake) / 2
CS_genuineTotal = (CS_genuine + CS_fake) / 2

# t-test:
t.test(Ctrl_genuineTotal, CS_genuineTotal)
## 
##  Welch Two Sample t-test
## 
## data:  Ctrl_genuineTotal and CS_genuineTotal
## t = -1.2825, df = 555.58, p-value = 0.2002
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -11.547105   2.424729
## sample estimates:
## mean of x mean of y 
##  29.55614  34.11733
# kruskal-wallis test:
kruskal.test(list(Ctrl_genuineTotal, CS_genuineTotal))
## 
##  Kruskal-Wallis rank sum test
## 
## data:  list(Ctrl_genuineTotal, CS_genuineTotal)
## Kruskal-Wallis chi-squared = 2.3041, df = 1, p-value = 0.129

Overall attitude (Control vs. Clickstop):

Reverse directions of some questions so the more positive the ratings, the more positive (generous) attitude towards online reviewing:

#noObligtion
#freeLabor
#compensate
#toomuchTime
#fake

## Control:
Ctrl_noObligation = -mean(ControlAfterCheck$noObligation_1)
Ctrl_freeLabor = -mean(ControlAfterCheck$freeLabor_1)
Ctrl_compensate = -mean(ControlAfterCheck$compensate_1)
Ctrl_toomuchTime = -mean(ControlAfterCheck$toomuchTime_1)
Ctrl_fake = -mean(ControlAfterCheck$fake_1)
Ctrl_shouldPost = mean(ControlAfterCheck$shouldPost_1)
Ctrl_notmuchTime = mean(ControlAfterCheck$notmuchTime_1)
Ctrl_genuine = mean(ControlAfterCheck$genuine_1)

## Clickstop
Clickstop_noObligation = -mean(ClickstopAfterCheck$noObligation_1)
Clickstop_freeLabor = -mean(ClickstopAfterCheck$freeLabor_1)
Clickstop_compensate = -mean(ClickstopAfterCheck$compensate_1)
Clickstop_toomuchTime = -mean(ClickstopAfterCheck$toomuchTime_1)
Clickstop_fake = -mean(ClickstopAfterCheck$fake_1)
Clickstop_shouldPost = mean(ClickstopAfterCheck$shouldPost_1)
Clickstop_notmuchTime = mean(ClickstopAfterCheck$notmuchTime_1)
Clickstop_genuine = mean(ClickstopAfterCheck$genuine_1)

### Overall attitude
Ctrl_overallattitude = mean( c(Ctrl_noObligation, Ctrl_freeLabor, Ctrl_compensate, 
                               Ctrl_toomuchTime, Ctrl_fake, Ctrl_shouldPost, 
                               Ctrl_notmuchTime, Ctrl_genuine))

Clickstop_overallattitude = mean( c(Clickstop_noObligation, Clickstop_freeLabor,
                                    Clickstop_compensate, Clickstop_toomuchTime, Clickstop_fake,
                                    Clickstop_shouldPost, Clickstop_notmuchTime, Clickstop_genuine))

Overall attitude towards posting reviews is greater in the clickstop condition (vs. control).

  • Control attitude: 10.59

  • Clickstop attitude: 18.95

8 Gender effects on Attitudes

Male: Control vs. Clickstop Visualization

#Control Male
Ctrl_noObligation = mean(ControlMale$noObligation_1)
Ctrl_freeLabor = mean(ControlMale$freeLabor_1)
Ctrl_compensate = mean(ControlMale$compensate_1)
Ctrl_toomuchTime = mean(ControlMale$toomuchTime_1)
Ctrl_fake = mean(ControlMale$fake_1)
Ctrl_shouldPost = mean(ControlMale$shouldPost_1)
Ctrl_notmuchTime = mean(ControlMale$notmuchTime_1)
Ctrl_genuine = mean(ControlMale$genuine_1)

Ctrl_attitudes = c(Ctrl_shouldPost, Ctrl_noObligation, Ctrl_freeLabor, 
                   Ctrl_compensate, Ctrl_toomuchTime, Ctrl_notmuchTime, 
                   Ctrl_fake, Ctrl_genuine)

#Clickstop Male
Clickstop_noObligation = mean(ClickstopMale$noObligation_1)
Clickstop_freeLabor = mean(ClickstopMale$freeLabor_1)
Clickstop_compensate = mean(ClickstopMale$compensate_1)
Clickstop_toomuchTime = mean(ClickstopMale$toomuchTime_1)
Clickstop_fake = mean(ClickstopMale$fake_1)
Clickstop_shouldPost = mean(ClickstopMale$shouldPost_1)
Clickstop_notmuchTime = mean(ClickstopMale$notmuchTime_1)
Clickstop_genuine = mean(ClickstopMale$genuine_1)

Clickstop_attitudes = c(Clickstop_shouldPost, Clickstop_noObligation, Clickstop_freeLabor, 
                   Clickstop_compensate, Clickstop_toomuchTime, Clickstop_notmuchTime, 
                   Clickstop_fake, Clickstop_genuine)


CtrlAttitude = as.data.frame(Ctrl_attitudes)
CtrlAttitude2 = as.data.frame(t(CtrlAttitude))
names(CtrlAttitude2) = c("shouldPost", "NoObligation", "freeLabor", "shouldPay", "toomuchTime",
                      "notmuchTime", "Fake", "Genuine")


CSAttitude = as.data.frame(Clickstop_attitudes)
CSAttitude2 = as.data.frame(t(CSAttitude))
names(CSAttitude2) = c("shouldPost", "NoObligation", "freeLabor", "shouldPay", "toomuchTime",
                      "notmuchTime", "Fake", "Genuine")

MaleAttitudes = rbind(CtrlAttitude2, CSAttitude2)
MaleAttitudes = as.matrix(MaleAttitudes)

## Bar plot
par(mar=c(4, 3.8, 3.5, 0))
    
barplot = barplot(MaleAttitudes,
        main = "Male Attitudes: Control vs. Clickstop",
        xlab = "Attitudes", ylab = "(Dis)Agreement Rating",
        col = c("lightgrey","darkorange"),
        beside = TRUE,
        width = 10,
        cex.names=0.65)

legend("topleft", c("Male Control","Male Clickstop"), fill = c("lightgrey","darkorange"), cex = .7)
text(barplot, 0, round(MaleAttitudes, 1),cex=0.6,pos=3) 

Female: Control vs. Clickstop Visualization

#Control Female
Ctrl_noObligation = mean(ControlFemale$noObligation_1)
Ctrl_freeLabor = mean(ControlFemale$freeLabor_1)
Ctrl_compensate = mean(ControlFemale$compensate_1)
Ctrl_toomuchTime = mean(ControlFemale$toomuchTime_1)
Ctrl_fake = mean(ControlFemale$fake_1)
Ctrl_shouldPost = mean(ControlFemale$shouldPost_1)
Ctrl_notmuchTime = mean(ControlFemale$notmuchTime_1)
Ctrl_genuine = mean(ControlFemale$genuine_1)

Ctrl_attitudes = c(Ctrl_shouldPost, Ctrl_noObligation, Ctrl_freeLabor, 
                   Ctrl_compensate, Ctrl_toomuchTime, Ctrl_notmuchTime, 
                   Ctrl_fake, Ctrl_genuine)

#Clickstop Female
Clickstop_noObligation = mean(ClickstopFemale$noObligation_1)
Clickstop_freeLabor = mean(ClickstopFemale$freeLabor_1)
Clickstop_compensate = mean(ClickstopFemale$compensate_1)
Clickstop_toomuchTime = mean(ClickstopFemale$toomuchTime_1)
Clickstop_fake = mean(ClickstopFemale$fake_1)
Clickstop_shouldPost = mean(ClickstopFemale$shouldPost_1)
Clickstop_notmuchTime = mean(ClickstopFemale$notmuchTime_1)
Clickstop_genuine = mean(ClickstopFemale$genuine_1)

Clickstop_attitudes = c(Clickstop_shouldPost, Clickstop_noObligation, Clickstop_freeLabor, 
                   Clickstop_compensate, Clickstop_toomuchTime, Clickstop_notmuchTime, 
                   Clickstop_fake, Clickstop_genuine)


CtrlAttitude = as.data.frame(Ctrl_attitudes)
CtrlAttitude2 = as.data.frame(t(CtrlAttitude))
names(CtrlAttitude2) = c("shouldPost", "NoObligation", "freeLabor", "shouldPay", "toomuchTime",
                      "notmuchTime", "Fake", "Genuine")


CSAttitude = as.data.frame(Clickstop_attitudes)
CSAttitude2 = as.data.frame(t(CSAttitude))
names(CSAttitude2) = c("shouldPost", "NoObligation", "freeLabor", "shouldPay", "toomuchTime",
                      "notmuchTime", "Fake", "Genuine")

FemaleAttitudes = rbind(CtrlAttitude2, CSAttitude2)
FemaleAttitudes = as.matrix(FemaleAttitudes)

## Bar plot
par(mar=c(4, 3.8, 3.5, 0))
    
barplot = barplot(FemaleAttitudes,
        main = "Female Attitudes: Control vs. Clickstop",
        xlab = "Attitudes", ylab = "(Dis)Agreement Rating",
        col = c("lightgrey","darkorange"),
        beside = TRUE,
        width = 10,
        cex.names=0.65)

legend("topleft", c("Female Control","Female Clickstop"), fill = c("lightgrey","darkorange"), cex = .7)
text(barplot, 0, round(FemaleAttitudes, 1),cex=0.6,pos=3) 

Two-way ANOVA

Perceived responsibility:

GenderData$responsibility = (GenderData$shouldPost_1 + (-GenderData$noObligation_1)) / 2

anovaResponsible = aov( responsibility ~ Gendername * Condition, GenderData)
summary(anovaResponsible)
##                       Df  Sum Sq Mean Sq F value  Pr(>F)   
## Gendername             1   14516   14516   7.642 0.00589 **
## Condition              1   19080   19080  10.045 0.00161 **
## Gendername:Condition   1    2527    2527   1.330 0.24926   
## Residuals            554 1052256    1899                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggline(GenderData, x = "Condition", y = "responsibility", color = "Gendername",
          palette = c("indianred3", "steelblue"),
          add = "mean_se", size = 1.1)

Perceived ease:

GenderData$ease = (GenderData$notmuchTime_1 + (-GenderData$toomuchTime_1)) / 2

anovaEase = aov( ease ~ Gendername * Condition, GenderData)
summary(anovaEase)
##                       Df  Sum Sq Mean Sq F value   Pr(>F)    
## Gendername             1   14158   14158   5.265 0.022133 *  
## Condition              1   31242   31242  11.618 0.000701 ***
## Gendername:Condition   1    1870    1870   0.695 0.404704    
## Residuals            554 1489749    2689                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggline(GenderData, x = "Condition", y = "ease", color = "Gendername",
          palette = c("indianred3", "steelblue"),
          add = "mean_se", size = 1.1)

Perceived genuineness:

GenderData$fakeReal = (GenderData$genuine_1 + (-GenderData$fake_1)) / 2

anovaFake = aov( fakeReal ~ Gendername * Condition, GenderData)
summary(anovaFake)
##                       Df Sum Sq Mean Sq F value Pr(>F)  
## Gendername             1   9781    9781   5.573 0.0186 *
## Condition              1   3623    3623   2.064 0.1514  
## Gendername:Condition   1     51      51   0.029 0.8646  
## Residuals            554 972352    1755                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggline(GenderData, x = "Condition", y = "fakeReal", color = "Gendername",
          palette = c("indianred3", "steelblue"),
          add = "mean_se", size = 1.1)

9 Mediation Analysis

Test if some attitude ratings are mediating the effect of the click-stop on the desire-to-post.

Responsibility

library(mediation)
## Loading required package: MASS
## Loading required package: Matrix
## Loading required package: mvtnorm
## Loading required package: sandwich
## mediation: Causal Mediation Analysis
## Version: 4.5.0
## 
## Attaching package: 'mediation'
## The following object is masked from 'package:psych':
## 
##     mediate
GenderData$Condition = factor(GenderData$Condition)
GenderData$ConditionNum[GenderData$Condition == "Control"] = 1
GenderData$ConditionNum[GenderData$Condition == "Click-stop"] = 2


## responsibility 

# Direct effect
mediationDirect = lm(meanDesire ~ ConditionNum + responsibility, data=GenderData)

# mediator
mediatorResp = lm(responsibility ~ ConditionNum, data=GenderData)

# mediation
mediation = mediation::mediate( model.m = mediatorResp,
                                model.y = mediationDirect,
                                treat = "ConditionNum",
                                mediator = "responsibility")
summary(mediation)
## 
## Causal Mediation Analysis 
## 
## Quasi-Bayesian Confidence Intervals
## 
##                Estimate 95% CI Lower 95% CI Upper p-value   
## ACME              2.812        0.998         4.84   0.002 **
## ADE               3.026       -0.779         6.63   0.112   
## Total Effect      5.838        1.650         9.98   0.004 **
## Prop. Mediated    0.475        0.190         1.42   0.006 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sample Size Used: 558 
## 
## 
## Simulations: 1000
library(psych)
psychMediation = psych::mediate(meanDesire ~ ConditionNum + (responsibility), data=GenderData)

summary(psychMediation)
## Call: psych::mediate(y = meanDesire ~ ConditionNum + (responsibility), 
##     data = GenderData)
## 
## Direct effect estimates (traditional regression)    (c') X + M on Y 
##                meanDesire   se     t  df     Prob
## Intercept           67.26 3.04 22.09 555 4.49e-78
## ConditionNum         3.05 1.88  1.63 555 1.04e-01
## responsibility       0.25 0.02 11.66 555 3.04e-28
## 
## R = 0.46 R2 = 0.21   F = 72.96 on 2 and 555 DF   p-value:  7.38e-29 
## 
##  Total effect estimates (c) (X on Y) 
##              meanDesire   se     t  df     Prob
## Intercept         57.26 3.26 17.58 556 2.33e-55
## ConditionNum       5.88 2.07  2.84 556 4.69e-03
## 
##  'a'  effect estimates (X on M) 
##              responsibility   se     t  df     Prob
## Intercept            -40.44 5.84 -6.93 556 1.18e-11
## ConditionNum          11.44 3.72  3.08 556 2.18e-03
## 
##  'b'  effect estimates (M on Y controlling for X) 
##                meanDesire   se     t  df     Prob
## responsibility       0.25 0.02 11.66 555 3.04e-28
## 
##  'ab'  effect estimates (through all  mediators)
##              meanDesire boot   sd lower upper
## ConditionNum       2.83 2.82 0.95  1.02  4.76
psychMediation
## 
## Mediation/Moderation Analysis 
## Call: psych::mediate(y = meanDesire ~ ConditionNum + (responsibility), 
##     data = GenderData)
## 
## The DV (Y) was  meanDesire . The IV (X) was  ConditionNum . The mediating variable(s) =  responsibility .
## 
## Total effect(c) of  ConditionNum  on  meanDesire  =  5.88   S.E. =  2.07  t  =  2.84  df=  556   with p =  0.0047
## Direct effect (c') of  ConditionNum  on  meanDesire  removing  responsibility  =  3.05   S.E. =  1.88  t  =  1.63  df=  555   with p =  0.1
## Indirect effect (ab) of  ConditionNum  on  meanDesire  through  responsibility   =  2.83 
## Mean bootstrapped indirect effect =  2.82  with standard error =  0.95  Lower CI =  1.02    Upper CI =  4.76
## R = 0.46 R2 = 0.21   F = 72.96 on 2 and 555 DF   p-value:  8.65e-40 
## 
##  To see the longer output, specify short = FALSE in the print statement or ask for the summary

Responsibility Basic regressions:

summary( lm( meanDesire ~ ConditionNum , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum, data = GenderData)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -69.024 -13.615   4.293  19.361  36.861 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    57.255      3.256  17.583  < 2e-16 ***
## ConditionNum    5.884      2.073   2.839  0.00469 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 24.48 on 556 degrees of freedom
## Multiple R-squared:  0.01429,    Adjusted R-squared:  0.01251 
## F-statistic: 8.059 on 1 and 556 DF,  p-value: 0.004694
summary( lm( meanDesire ~ ConditionNum + responsibility , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum + responsibility, data = GenderData)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -70.065 -12.239   1.887  15.144  54.429 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    67.26120    3.04453  22.092   <2e-16 ***
## ConditionNum    3.05368    1.87525   1.628    0.104    
## responsibility  0.24744    0.02123  11.658   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21.96 on 555 degrees of freedom
## Multiple R-squared:  0.2082, Adjusted R-squared:  0.2053 
## F-statistic: 72.96 on 2 and 555 DF,  p-value: < 2.2e-16

With Gender included:

summary( lm( meanDesire ~ ConditionNum * Gender , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum * Gender, data = GenderData)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -72.72 -13.85   4.52  18.53  44.07 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)   
## (Intercept)           33.390     10.953   3.048  0.00241 **
## ConditionNum          10.731      6.924   1.550  0.12175   
## Gender                14.682      6.527   2.250  0.02486 * 
## ConditionNum:Gender   -2.874      4.142  -0.694  0.48805   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.97 on 554 degrees of freedom
## Multiple R-squared:  0.05789,    Adjusted R-squared:  0.05279 
## F-statistic: 11.35 on 3 and 554 DF,  p-value: 3.115e-07
summary( lm( meanDesire ~ ConditionNum * Gender + responsibility , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum * Gender + responsibility, 
##     data = GenderData)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -65.699 -12.996   1.575  15.224  58.709 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         52.02534   10.03496   5.184 3.04e-07 ***
## ConditionNum         4.67641    6.27922   0.745    0.457    
## Gender               9.07736    5.91785   1.534    0.126    
## responsibility       0.23669    0.02111  11.210  < 2e-16 ***
## ConditionNum:Gender -0.81829    3.74682  -0.218    0.827    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21.66 on 553 degrees of freedom
## Multiple R-squared:  0.2323, Adjusted R-squared:  0.2268 
## F-statistic: 41.84 on 4 and 553 DF,  p-value: < 2.2e-16

Perceived responsibility is mediating the effect of the condition on the desire-to-post.

Perceived Effort/ease

# Direct effect
mediationDirect = lm(meanDesire ~ ConditionNum + ease, data=GenderData)

# mediator
mediatorResp = lm(ease ~ ConditionNum, data=GenderData)

# mediation
mediation = mediation::mediate( model.m = mediatorResp,
                                model.y = mediationDirect,
                                treat = "ConditionNum",
                                mediator = "ease")
summary(mediation)
## 
## Causal Mediation Analysis 
## 
## Quasi-Bayesian Confidence Intervals
## 
##                Estimate 95% CI Lower 95% CI Upper p-value   
## ACME              3.833        1.626         6.09   0.002 **
## ADE               2.188       -1.261         5.59   0.202   
## Total Effect      6.021        2.105        10.03   0.004 **
## Prop. Mediated    0.639        0.314         1.46   0.006 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sample Size Used: 558 
## 
## 
## Simulations: 1000
psychMediation = psych::mediate(meanDesire ~ ConditionNum + (ease), data=GenderData)

summary(psychMediation)
## Call: psych::mediate(y = meanDesire ~ ConditionNum + (ease), data = GenderData)
## 
## Direct effect estimates (traditional regression)    (c') X + M on Y 
##              meanDesire   se     t  df     Prob
## Intercept         60.85 2.74 22.24 555 7.51e-79
## ConditionNum       2.09 1.75  1.19 555 2.33e-01
## ease               0.26 0.02 15.44 555 5.13e-45
## 
## R = 0.56 R2 = 0.31   F = 124.99 on 2 and 555 DF   p-value:  1.54e-45 
## 
##  Total effect estimates (c) (X on Y) 
##              meanDesire   se     t  df     Prob
## Intercept         57.26 3.26 17.58 556 2.33e-55
## ConditionNum       5.88 2.07  2.84 556 4.69e-03
## 
##  'a'  effect estimates (X on M) 
##                ease   se     t  df     Prob
## Intercept    -13.96 6.93 -2.02 556 0.044400
## ConditionNum  14.71 4.41  3.34 556 0.000903
## 
##  'b'  effect estimates (M on Y controlling for X) 
##      meanDesire   se     t  df     Prob
## ease       0.26 0.02 15.44 555 5.13e-45
## 
##  'ab'  effect estimates (through all  mediators)
##              meanDesire boot   sd lower upper
## ConditionNum       3.79 3.81 1.15  1.61  6.11
psychMediation
## 
## Mediation/Moderation Analysis 
## Call: psych::mediate(y = meanDesire ~ ConditionNum + (ease), data = GenderData)
## 
## The DV (Y) was  meanDesire . The IV (X) was  ConditionNum . The mediating variable(s) =  ease .
## 
## Total effect(c) of  ConditionNum  on  meanDesire  =  5.88   S.E. =  2.07  t  =  2.84  df=  556   with p =  0.0047
## Direct effect (c') of  ConditionNum  on  meanDesire  removing  ease  =  2.09   S.E. =  1.75  t  =  1.19  df=  555   with p =  0.23
## Indirect effect (ab) of  ConditionNum  on  meanDesire  through  ease   =  3.79 
## Mean bootstrapped indirect effect =  3.81  with standard error =  1.15  Lower CI =  1.61    Upper CI =  6.11
## R = 0.56 R2 = 0.31   F = 124.99 on 2 and 555 DF   p-value:  7.43e-62 
## 
##  To see the longer output, specify short = FALSE in the print statement or ask for the summary

Effort/ease Basic regressions:

summary( lm( meanDesire ~ ConditionNum , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum, data = GenderData)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -69.024 -13.615   4.293  19.361  36.861 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    57.255      3.256  17.583  < 2e-16 ***
## ConditionNum    5.884      2.073   2.839  0.00469 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 24.48 on 556 degrees of freedom
## Multiple R-squared:  0.01429,    Adjusted R-squared:  0.01251 
## F-statistic: 8.059 on 1 and 556 DF,  p-value: 0.004694
summary( lm( meanDesire ~ ConditionNum + ease , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum + ease, data = GenderData)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -81.146 -10.039   3.721  12.020  54.562 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  60.85249    2.73566  22.244   <2e-16 ***
## ConditionNum  2.09209    1.75242   1.194    0.233    
## ease          0.25775    0.01669  15.443   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 20.49 on 555 degrees of freedom
## Multiple R-squared:  0.3105, Adjusted R-squared:  0.3081 
## F-statistic:   125 on 2 and 555 DF,  p-value: < 2.2e-16

With Gender included:

summary( lm( meanDesire ~ ConditionNum * Gender , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum * Gender, data = GenderData)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -72.72 -13.85   4.52  18.53  44.07 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)   
## (Intercept)           33.390     10.953   3.048  0.00241 **
## ConditionNum          10.731      6.924   1.550  0.12175   
## Gender                14.682      6.527   2.250  0.02486 * 
## ConditionNum:Gender   -2.874      4.142  -0.694  0.48805   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.97 on 554 degrees of freedom
## Multiple R-squared:  0.05789,    Adjusted R-squared:  0.05279 
## F-statistic: 11.35 on 3 and 554 DF,  p-value: 3.115e-07
summary( lm( meanDesire ~ ConditionNum * Gender + ease , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum * Gender + ease, data = GenderData)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -83.780 -11.039   3.157  12.805  50.746 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         45.72069    9.25357   4.941 1.03e-06 ***
## ConditionNum         3.99565    5.84389   0.684   0.4944    
## Gender               9.22123    5.50414   1.675   0.0944 .  
## ease                 0.25027    0.01653  15.142  < 2e-16 ***
## ConditionNum:Gender -1.00411    3.48788  -0.288   0.7735    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 20.17 on 553 degrees of freedom
## Multiple R-squared:  0.334,  Adjusted R-squared:  0.3292 
## F-statistic: 69.34 on 4 and 553 DF,  p-value: < 2.2e-16

Perceived ease is mediating the effect of the condition on the desire-to-post.

Fake/Genuine

# Direct effect
mediationDirect = lm(meanDesire ~ ConditionNum + fakeReal, data=GenderData)

# mediator
mediatorResp = lm(fakeReal ~ ConditionNum, data=GenderData)

# mediation
mediation = mediation::mediate( model.m = mediatorResp,
                                model.y = mediationDirect,
                                treat = "ConditionNum",
                                mediator = "fakeReal")
summary(mediation)
## 
## Causal Mediation Analysis 
## 
## Quasi-Bayesian Confidence Intervals
## 
##                Estimate 95% CI Lower 95% CI Upper p-value   
## ACME             0.6965      -0.3388         1.84   0.180   
## ADE              5.2259       1.4031         9.44   0.016 * 
## Total Effect     5.9224       2.0838        10.17   0.008 **
## Prop. Mediated   0.1126      -0.0886         0.41   0.184   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sample Size Used: 558 
## 
## 
## Simulations: 1000
psychMediation = psych::mediate(meanDesire ~ ConditionNum + (fakeReal), data=GenderData)

summary(psychMediation)
## Call: psych::mediate(y = meanDesire ~ ConditionNum + (fakeReal), data = GenderData)
## 
## Direct effect estimates (traditional regression)    (c') X + M on Y 
##              meanDesire   se     t  df     Prob
## Intercept         53.53 3.20 16.72 555 4.17e-51
## ConditionNum       5.15 2.01  2.56 555 1.06e-02
## fakeReal           0.15 0.02  6.32 555 5.35e-10
## 
## R = 0.28 R2 = 0.08   F = 24.29 on 2 and 555 DF   p-value:  7.73e-11 
## 
##  Total effect estimates (c) (X on Y) 
##              meanDesire   se     t  df     Prob
## Intercept         57.26 3.26 17.58 556 2.33e-55
## ConditionNum       5.88 2.07  2.84 556 4.69e-03
## 
##  'a'  effect estimates (X on M) 
##              fakeReal   se    t  df     Prob
## Intercept       24.67 5.59 4.41 556 1.23e-05
## ConditionNum     4.89 3.56 1.37 556 1.70e-01
## 
##  'b'  effect estimates (M on Y controlling for X) 
##          meanDesire   se    t  df     Prob
## fakeReal       0.15 0.02 6.32 555 5.35e-10
## 
##  'ab'  effect estimates (through all  mediators)
##              meanDesire boot   sd lower upper
## ConditionNum       0.74 0.74 0.56 -0.29  1.91
psychMediation
## 
## Mediation/Moderation Analysis 
## Call: psych::mediate(y = meanDesire ~ ConditionNum + (fakeReal), data = GenderData)
## 
## The DV (Y) was  meanDesire . The IV (X) was  ConditionNum . The mediating variable(s) =  fakeReal .
## 
## Total effect(c) of  ConditionNum  on  meanDesire  =  5.88   S.E. =  2.07  t  =  2.84  df=  556   with p =  0.0047
## Direct effect (c') of  ConditionNum  on  meanDesire  removing  fakeReal  =  5.15   S.E. =  2.01  t  =  2.56  df=  555   with p =  0.011
## Indirect effect (ab) of  ConditionNum  on  meanDesire  through  fakeReal   =  0.74 
## Mean bootstrapped indirect effect =  0.74  with standard error =  0.56  Lower CI =  -0.29    Upper CI =  1.91
## R = 0.28 R2 = 0.08   F = 24.29 on 2 and 555 DF   p-value:  8.83e-15 
## 
##  To see the longer output, specify short = FALSE in the print statement or ask for the summary

Fake/genuine Basic regressions:

summary( lm( meanDesire ~ ConditionNum , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum, data = GenderData)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -69.024 -13.615   4.293  19.361  36.861 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    57.255      3.256  17.583  < 2e-16 ***
## ConditionNum    5.884      2.073   2.839  0.00469 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 24.48 on 556 degrees of freedom
## Multiple R-squared:  0.01429,    Adjusted R-squared:  0.01251 
## F-statistic: 8.059 on 1 and 556 DF,  p-value: 0.004694
summary( lm( meanDesire ~ ConditionNum + fakeReal , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum + fakeReal, data = GenderData)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -74.766 -13.502   4.122  18.042  42.058 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  53.53283    3.20240  16.716  < 2e-16 ***
## ConditionNum  5.14692    2.00720   2.564   0.0106 *  
## fakeReal      0.15089    0.02387   6.321 5.35e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.66 on 555 degrees of freedom
## Multiple R-squared:  0.08048,    Adjusted R-squared:  0.07717 
## F-statistic: 24.29 on 2 and 555 DF,  p-value: 7.726e-11

With Gender included:

summary( lm( meanDesire ~ ConditionNum * Gender , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum * Gender, data = GenderData)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -72.72 -13.85   4.52  18.53  44.07 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)   
## (Intercept)           33.390     10.953   3.048  0.00241 **
## ConditionNum          10.731      6.924   1.550  0.12175   
## Gender                14.682      6.527   2.250  0.02486 * 
## ConditionNum:Gender   -2.874      4.142  -0.694  0.48805   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.97 on 554 degrees of freedom
## Multiple R-squared:  0.05789,    Adjusted R-squared:  0.05279 
## F-statistic: 11.35 on 3 and 554 DF,  p-value: 3.115e-07
summary( lm( meanDesire ~ ConditionNum * Gender + fakeReal , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum * Gender + fakeReal, data = GenderData)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -77.517 -14.147   4.244  17.882  45.701 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         31.50517   10.63399   2.963  0.00318 ** 
## ConditionNum        10.29336    6.71968   1.532  0.12614    
## Gender              13.72565    6.33545   2.166  0.03070 *  
## fakeReal             0.14017    0.02359   5.942 4.99e-09 ***
## ConditionNum:Gender -3.04714    4.01960  -0.758  0.44873    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.26 on 553 degrees of freedom
## Multiple R-squared:  0.1144, Adjusted R-squared:  0.108 
## F-statistic: 17.86 on 4 and 553 DF,  p-value: 8.335e-14

Perceived genuineness is partially mediating the effect of the condition on the desire-to-post.

Regressions with multiple attitudes:

summary( lm( meanDesire ~ ConditionNum + responsibility + ease + fakeReal , data=GenderData) )
## 
## Call:
## lm(formula = meanDesire ~ ConditionNum + responsibility + ease + 
##     fakeReal, data = GenderData)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -71.439 -10.888   2.275  12.699  51.296 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    65.06494    2.73552  23.785  < 2e-16 ***
## ConditionNum    0.83827    1.65204   0.507  0.61207    
## responsibility  0.15977    0.01978   8.076  4.2e-15 ***
## ease            0.19944    0.01717  11.616  < 2e-16 ***
## fakeReal        0.05814    0.02024   2.873  0.00422 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 19.24 on 553 degrees of freedom
## Multiple R-squared:  0.3942, Adjusted R-squared:  0.3898 
## F-statistic: 89.96 on 4 and 553 DF,  p-value: < 2.2e-16

Perceived responsibility and perceived ease are mediating the effect of the click-stop.

10 R Session Info

date()
## [1] "Mon Mar 20 15:41:22 2023"
sessionInfo()
## R version 4.2.1 (2022-06-23)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Big Sur ... 10.16
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] mediation_4.5.0  sandwich_3.0-2   mvtnorm_1.1-3    Matrix_1.5-1    
##  [5] MASS_7.3-57      Superpower_0.2.0 ggpubr_0.4.0     ggplot2_3.3.6   
##  [9] psych_2.2.5      plyr_1.8.7      
## 
## loaded via a namespace (and not attached):
##  [1] nlme_3.1-157        RColorBrewer_1.1-3  numDeriv_2016.8-1.1
##  [4] tools_4.2.1         backports_1.4.1     bslib_0.4.0        
##  [7] utf8_1.2.2          R6_2.5.1            rpart_4.1.16       
## [10] afex_1.1-1          Hmisc_4.7-1         DBI_1.1.3          
## [13] colorspace_2.0-3    nnet_7.3-17         withr_2.5.0        
## [16] tidyselect_1.1.2    gridExtra_2.3       mnormt_2.1.0       
## [19] emmeans_1.8.1-1     compiler_4.2.1      cli_3.4.1          
## [22] htmlTable_2.4.1     labeling_0.4.2      sass_0.4.2         
## [25] checkmate_2.1.0     scales_1.2.1        stringr_1.4.1      
## [28] digest_0.6.29       foreign_0.8-82      minqa_1.2.4        
## [31] rmarkdown_2.16      base64enc_0.1-3     jpeg_0.1-9         
## [34] pkgconfig_2.0.3     htmltools_0.5.3     lme4_1.1-30        
## [37] fastmap_1.1.0       highr_0.9           htmlwidgets_1.5.4  
## [40] rlang_1.0.6         rstudioapi_0.14     jquerylib_0.1.4    
## [43] farver_2.1.1        generics_0.1.3      zoo_1.8-11         
## [46] jsonlite_1.8.0      dplyr_1.0.10        car_3.1-0          
## [49] magrittr_2.0.3      Formula_1.2-4       interp_1.1-3       
## [52] Rcpp_1.0.9          munsell_0.5.0       fansi_1.0.3        
## [55] abind_1.4-5         lifecycle_1.0.2     stringi_1.7.8      
## [58] yaml_2.3.5          carData_3.0-5       grid_4.2.1         
## [61] parallel_4.2.1      deldir_1.0-6        lattice_0.20-45    
## [64] splines_4.2.1       knitr_1.40          pillar_1.8.1       
## [67] boot_1.3-28         estimability_1.4.1  ggsignif_0.6.3     
## [70] lpSolve_5.6.17      reshape2_1.4.4      glue_1.6.2         
## [73] evaluate_0.16       latticeExtra_0.6-30 data.table_1.14.2  
## [76] vctrs_0.4.1         png_0.1-7           nloptr_2.0.3       
## [79] gtable_0.3.1        purrr_0.3.4         tidyr_1.2.1        
## [82] assertthat_0.2.1    cachem_1.0.6        xfun_0.33          
## [85] xtable_1.8-4        broom_1.0.1         coda_0.19-4        
## [88] rstatix_0.7.0       survival_3.3-1      tibble_3.1.8       
## [91] lmerTest_3.1-3      cluster_2.1.3       ellipsis_0.3.2