Replication of The Radical Flank: Curse or Blessing of a Social Movement? by Dasch et al. (2024, Global Environmental Psychology)

Author

Sebastian Kane (smkane@stanford.edu)

Published

October 31, 2025

Introduction

Within social movement scholarship, a radical flank effect (RFE) is the influence of activists with more extreme ideologies and tactics on a movement, particularly on how the public perceives it. Evidence is mixed as to whether the presence of radical flanks increases or decreases public support. Dasch et al. (2024) used an experimental approach to clarify this relationship, and found across two studies in the UK and US that radical flanks can increase support for moderate groups and decrease support for radical ones. However, in the US study, the increase in support for moderates did not reach the level of statistical significance. Dasch et al. (2024, p. 24) speculate that the “lack of significance may be due to insufficient statistical power,” and not a fundamental difference between the US and UK contexts. I plan to replicate the US study to further test the effect of radical flanks on support for moderate groups in the US, and confirm their other findings. This project complements my prior research on the effects of collective action tactics but takes a more psychological rather than sociological approach.

Dasch et al. (2024) provide an online supplement, which contains thorough documentation of their procedures, Qualtrics surveys, data, and code. Additionally, they pre-registered their study. All of these factors increase the likelihood of successful replication.

To replicate experiment 2, I will recruit around 500 participants through Prolific. These participants will be given a Qualtrics survey, where they will read a fake news story about two activist groups protesting and then answer questions. Participants will be randomly assigned to either a nonviolent, violent, or radical flank version of the story. The primary outcome measures will be support for moderates and radicals. Given Dasch et al.’s (2024) concern about statistical power, a challenge will be to recruit a sufficient number of participants, as my budget is limited.

My Repo.

Original Paper.

Paradigm.

Pilot Data.

[No abstract is needed.] Each replication project will have a straightforward, no frills report of the study and results. These reports will be publicly available as supplementary material for the aggregate report(s) of the project as a whole. Also, to maximize project integrity, the intro and methods will be written and critiqued in advance of data collection. Introductions can be just 1-2 paragraphs clarifying the main idea of the original study, the target finding for replication, and any other essential information. It will NOT have a literature review – that is in the original publication. You can write both the introduction and the methods in past tense.

Methods

Power Analysis

The effect size for the main effect of reading about a violent flank group and to a non-violent main group compared to two peaceful groups was \(d=0.16\) in the US study. For comparison, the UK study had a main effect size of \(d = 0.50\). To achieve 80% power to detect the effect size in the US study, I would need 615 participants per group (822 participants for 90% power and 1,017 participants for 95% power). These samples are fairly large. Given budgetary constraints, I would ideally use a sample of 1,230 participants for 80% power, though this doesn’t seem feasible. If not, I can use a smaller sample or test a different hypothesis (e.g., using support for the flank group as a DV).

Original effect size, power analysis for samples to achieve 80%, 90%, 95% power to detect that effect size. Considerations of feasibility for selecting planned sample size.

Planned Sample

I tentatively plan on recruiting 500 participants through Prolific. Ideally I have 1,230 participants, but I don’t know if that is in budget. I will restrict my sample to American residents.

Planned sample size and/or termination rule, sampling frame, known demographics if any, preselection rules if any.

Materials

Dasch et al. (2024) provide the following overview of their materials:

In all three conditions, participants read a different newspaper article about a social movement in the US, specifically Uintah County, protesting for a ban on fracking. In each article, the movement split up due to unspecified tactical disagreements and divided into two subgroups, namely main group (Green Uintah) and flank group (Stop Fracking). After a brief introduction to the conflict, both groups are introduced, each performing three acts of protest.

In the nonviolent condition (n = 149), the activists of the nonviolent main group organized a peaceful demonstration, wore protest t-shirts during a speech by the mayor, and hung anti-fracking banners in front of local fracking companies. The nonviolent flank group also organized a demonstration, held a gathering in front of the mayor’s house and led a march to a fracking construction site. In contrast, in the violent condition (n = 150), the violent main group organized a demonstration that escalated into a riot, disrupted a speech by the mayor by throwing objects, and burned down two cars of a local fracking company. The violent flank group’s demonstration also escalated into a violent riot, they vandalized the mayor’s house, and destroyed company property at a fracking construction site. Finally, in the radical flank condition (n = 156), the moderate group was nonviolent and the radical flank violent. The description of the moderate group was identical to the text of the nonviolent main group in the nonviolent condition. And the text of the radical flank was identical to the description of the violent flank group in the violent condition.

I will use the same materials. However, I will only use two of the conditions—the nonviolent main and flank group condition and the nonviolent main and violent flank group condition—to maximize power.

All materials - can quote directly from original article - just put the text in quotations and note that this was followed precisely. Or, quote directly and just point out exceptions to what was described in the original article.

Procedure

I will follow Dasch et al.’s (2024) procedure:

Following the article and the reading comprehension checks, participants answered several questions about their perceptions of the overall movement and the two groups separately. Furthermore, participants completed measures about their general attitudes, some exploratory measures, and a demographic survey5.

Can quote directly from original article - just put the text in quotations and note that this was followed precisely. Or, quote directly and just point out exceptions to what was described in the original article.

Analysis Plan

I will use the following measures reported by Dasch et al. (2024):

Manipulation Checks

In total, four items were used, asking about the perception of the main group (Green Uintah) and the flank group (Stop Fracking) separately.

Identification With the Protesters

Participants rated their agreement and disagreement with the three statements for the main group (α = .95), and the flank group (α = .96).

Support for the Movement

We used the same items as in Study 1. Participants indicated the extent of their support for the main group, and the flank group.

Sympathy for the Movement’s Cause

We operationalized sympathy for the movement’s cause with four items from the New Environmental Paradigm scale (Dunlap et al., 2000). The identical four items (α = .88) have already been used in Schmitt and colleagues (2019) (e.g., “Over-consumption is posing a serious risk to humankind and life on planet earth”).

Demographic Questionnaire

Participants completed a demographic survey including items about age, gender, political ideology, and employment.

Like Dasch et al. (2024), I will exclude participants who spend less than 15 seconds on the treatment or who report that they do not consent to the study. I will also drop participants who do not answer the key survey questions.

I will compute Cohen’s d to test if support for the main group and flank group systematically very across conditions. I will also use OLS regression to analyze if sympathy for the overall movement moderates these support and identification with the main group.

Can also quote directly, though it is less often spelled out effectively for an analysis strategy section. The key is to report an analysis strategy that is as close to the original - data cleaning rules, data exclusion rules, covariates, etc. - as possible.

Clarify key analysis of interest here You can also pre-specify additional analyses you plan to do.

Differences from Original Study

Explicitly describe known differences in sample, setting, procedure, and analysis plan from original study. The goal, of course, is to minimize those differences, but differences will inevitably occur. Also, note whether such differences are anticipated to make a difference based on claims in the original article or subsequent published research on the conditions for obtaining the effect.

  • My survey will be conducted through Prolific not MTurk.

  • I am dropping the violent main group violent flank condition.

  • I am dropping the Instructional Manipulation Checks in favor of a comprehension check.

  • I have sightly adjusted phrasing in the conditions for grammatical reasons.

Methods Addendum (Post Data Collection)

You can comment this section out prior to final report with data collection.

Actual Sample

Sample size, demographics, data exclusions based on rules spelled out in analysis plan

Differences from pre-data collection methods plan

Any differences from what was described as the original plan, or “none”.

Results

Data preparation

Data preparation following the analysis plan.

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   4.0.0     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.1.0     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(broom)
library(GGally)
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2
library(psych)

Attaching package: 'psych'

The following objects are masked from 'package:ggplot2':

    %+%, alpha
#### Load Relevant Libraries and Functions

#### Import data
d <- read_csv("data/PilotA values.csv")
Rows: 10 Columns: 139
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (9): RecordedDate, ResponseId, DistributionChannel, UserLanguage, gend...
dbl (122): Progress, Duration (in seconds), Finished, consent_question, nv_c...
num   (3): rad_comprehend_gu, rad_comprehend_sf, relig_identity
lgl   (5): race_9_TEXT, party_3_TEXT, 2020_election_4_TEXT, Q_TerminateFlag,...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
demos <- read_csv("data/PilotA text demos.csv")
Rows: 10 Columns: 29
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (20): ResponseId, gender, gender_3_TEXT, race, state, employment, marria...
dbl  (4): age, Q_TotalDuration, consent, condition
lgl  (5): race_9_TEXT, party_3_TEXT, 2020_election_4_TEXT, Q_TerminateFlag, ...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
### Data Preparation
names(demos)
 [1] "ResponseId"           "gender"               "gender_3_TEXT"       
 [4] "age"                  "race"                 "race_9_TEXT"         
 [7] "state"                "employment"           "marriage"            
[10] "education"            "income"               "relig_group"         
[13] "relig_group_7_TEXT"   "relig_identity"       "polit_ideology"      
[16] "party"                "party_3_TEXT"         "party_identification"
[19] "2020_election"        "2020_election_4_TEXT" "2024_election"       
[22] "2024_election_4_TEXT" "feedback"             "Q_TotalDuration"     
[25] "Q_Language"           "Q_TerminateFlag"      "PROLIFIC_PID"        
[28] "consent"              "condition"           
demos <- demos[c("ResponseId", "gender",    "race", "employment", "marriage",   "education",    "relig_group", "relig_identity", "party", "income", "polit_ideology", "party_identification", "2020_election", "2024_election", "state")]

n <- names(demos)
for (i in 2:length(n)) {
    n[i] = paste0(n[i], "_labeled")
}
print(n)
 [1] "ResponseId"                   "gender_labeled"              
 [3] "race_labeled"                 "employment_labeled"          
 [5] "marriage_labeled"             "education_labeled"           
 [7] "relig_group_labeled"          "relig_identity_labeled"      
 [9] "party_labeled"                "income_labeled"              
[11] "polit_ideology_labeled"       "party_identification_labeled"
[13] "2020_election_labeled"        "2024_election_labeled"       
[15] "state_labeled"               
names(demos) <- n

d <- dplyr::left_join(d, demos, by = "ResponseId")

rm(demos, i, n)
names(d)[names(d)=="Duration..in.seconds."] <- "Duration"

#### Data exclusion / filtering

#remove participants who declined consent
d = subset (d,consent == 1)

# remove participants who spent less than 15 seconds on treatment
# d <- d |>
#   filter((condition == 0 & `nv_text_timing_Page Submit` < 15) |
#            (condition == 1 & `rad_text_timing_Page Submit` < 15))



## The code below doesn't currently work after the exclusion step because my sample for this pilot becomes to small, but it works if you don't exclude.

d <- d |> 
  mutate(
    GU_manipulation_check = (`manipulation_check#2_1` + `manipulation_check#2_2`) / 2,
    SF_manipulation_check = (`manipulation_check#3_1` + `manipulation_check#3_2`) / 2,
    
    GU_support = (`dv_support_action#2_1` + `dv_support_action#2_2` +
                      `dv_support_action#2_3` + `dv_support_action#2_4`) / 4,
    SF_support = (`dv_support_action#3_1` + `dv_support_action#3_2` +
                      `dv_support_action#3_3` + `dv_support_action#3_4`) / 4,    
         )

nonviolent <- d |> filter(condition == 0)
radicalflank <- d |> filter(condition == 1)



## Green Uintah (Main Group) manipulation checks

summary(aov(GU_manipulation_check~condition,d))
            Df Sum Sq Mean Sq F value Pr(>F)
condition    1 0.5333  0.5333   1.371  0.326
Residuals    3 1.1667  0.3889               
pairwise.t.test(d$GU_manipulation_check, d$condition, p.adj = "none")

    Pairwise comparisons using t tests with pooled SD 

data:  d$GU_manipulation_check and d$condition 

  0   
1 0.33

P value adjustment method: none 
# cohen's d: doesn't work with current sample size
# cohen.d(nonviolent$GU_manipulation_check, radicalflank$GU_manipulation_check)


## Stop Fracking (Flank Group) manipulation checks

summary(aov(SF_manipulation_check~condition,d))
            Df Sum Sq Mean Sq F value Pr(>F)
condition    1 0.2083 0.20833   2.143  0.239
Residuals    3 0.2917 0.09722               
pairwise.t.test(d$SF_manipulation_check, d$condition, p.adj = "none")

    Pairwise comparisons using t tests with pooled SD 

data:  d$SF_manipulation_check and d$condition 

  0   
1 0.24

P value adjustment method: none 
# cohen's d: doesn't work with current sample size
# cohen.d(nonviolent$SF_manipulation_check, radicalflank$SF_manipulation_check)



# cohen's d Support Movement main group - Green Uintah: doesn't work with current sample size
# cohen.d(nonviolent$GU_support, radicalflank$GU_support)

# cohen's d Support Movement flank group - Stop Fracking: doesn't work with current sample size
# cohen.d(nonviolent$SF_support, radicalflank$SF_support)


# H1a: Testing Hypothesis 1a: The presence of the radical flank changes the support for the moderate body for those who are sympathizers.

model <- lm(`dv_support_action#2_3` ~  condition*sympathy_1, data = d)
summary(model)

Call:
lm(formula = `dv_support_action#2_3` ~ condition * sympathy_1, 
    data = d)

Residuals:
         1          2          3          4          5 
-9.474e-01 -2.939e-15  1.579e+00  3.056e-15 -6.316e-01 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)
(Intercept)           2.000e+00  1.520e+01   0.132    0.917
condition             2.474e+00  1.543e+01   0.160    0.899
sympathy_1            6.197e-15  2.753e+00   0.000    1.000
condition:sympathy_1 -2.632e-01  2.807e+00  -0.094    0.940

Residual standard error: 1.947 on 1 degrees of freedom
Multiple R-squared:  0.4427,    Adjusted R-squared:  -1.229 
F-statistic: 0.2648 on 3 and 1 DF,  p-value: 0.8528
# H2a: Testing Hypothesis 2a: The presence of the radical flank changes the identification with the moderate body for those who are sympathizers.

model2 <- lm(`identification#1_2` ~  condition*sympathy_1, data = d)
summary(model2)

Call:
lm(formula = `identification#1_2` ~ condition * sympathy_1, data = d)

Residuals:
         1          2          3          4          5 
 7.105e-01  2.169e-15 -1.184e+00 -2.327e-15  4.737e-01 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)
(Intercept)           2.000e+00  1.140e+01   0.175    0.889
condition             2.395e+00  1.157e+01   0.207    0.870
sympathy_1           -3.929e-15  2.065e+00   0.000    1.000
condition:sympathy_1 -5.526e-01  2.105e+00  -0.263    0.837

Residual standard error: 1.46 on 1 degrees of freedom
Multiple R-squared:  0.6447,    Adjusted R-squared:  -0.4211 
F-statistic: 0.6049 on 3 and 1 DF,  p-value: 0.7112
d |> 
  group_by(condition) |> 
  summarize(mean = mean(GU_support),
            CI_lower = t.test(GU_support)$conf.int[1],
            CI_upper = t.test(GU_support)$conf.int[2],
            .groups = "drop") |> 
  mutate(cond_name = ifelse(condition == 1, "Radical Flank", "Non-Violent")) |> 
  ggplot(aes(x = cond_name, y = mean, fill = cond_name)) +
  geom_col(width = 0.5) + 
  geom_errorbar(aes(ymin = CI_lower, ymax = CI_upper), position = "dodge", width = 0.2) +
  labs(y = "Support for Main Group", x = 'Condition', title = "Effect of Condition on Support for Main Group") +
  guides(fill="none") +
  theme_bw() + 
  theme(plot.title = element_text(hjust = 0.5))

Confirmatory analysis

The analyses as specified in the analysis plan.

Side-by-side graph with original graph is ideal here

Exploratory analyses

Any follow-up analyses desired (not required).

Discussion

Summary of Replication Attempt

Open the discussion section with a paragraph summarizing the primary result from the confirmatory analysis and the assessment of whether it replicated, partially replicated, or failed to replicate the original result.

Commentary

Add open-ended commentary (if any) reflecting (a) insights from follow-up exploratory analysis, (b) assessment of the meaning of the replication (or not) - e.g., for a failure to replicate, are the differences between original and present study ones that definitely, plausibly, or are unlikely to have been moderators of the result, and (c) discussion of any objections or challenges raised by the current and original authors about the replication attempt. None of these need to be long.