How to measure marginal effect of interdependent variables on a binary outcome? My data represents observations on a possible sequences of events that may lead to a positive outcome (y).
Each event (A, B, C, D) is dependent on the previous event; for D to occur C must occur, for C to occur B must occur, for B to occur A must occur.
Some example rows to illustrate:




A
B
C
D
y




0
0
0
0
0


1
0
0
0
1


1
1
1
0
0


1
1
0
0
1


1
1
1
1
1




I'd like to measure the relative impact of each event on the probability of y. For example, I'd like to be able to make statements such as "Event B increase the probability by 10% compared to if only Event A occurs. However Event C only increases the probability by a further 1%".
I've considered using logistic regression. However, I have a concern that due to the inherent collinearity in the data the regression coefficients will not be reliable to infer from.
What possible methods could I use/explore?

You can create a variable that just contains the last event each participant went through. Then run a logistic regression (or another kind of regression) of the outcome on that variable.
To ease interpretation, you can also employ successive difference contrast coding. This makes it so that the coefficient on the second level is equal to the difference between the second and first levels, and the coefficient on the third level is equal to the difference between the third and second level. The intercept is the average of the probabilities for all the events. In R, this can be done using MASS::contr.sdif().
I also urge you to consider not using logistic regression if you want to interpret your estimates as changes in probability and you have no other variables in the model. Using a linear probability model makes the resulting effects much easier to interpret and doesn't make any additional assumptions on the model. You just have to use a robust standard error.
Putting this all together, R code to implement this would look like the following:
#List of column names in original dataset correspond to events
events <- c("A", "B", "C", "D")

#Create new `last_event` variable; could also do this manually
data$last_event <- factor(events[rowSums(data[events])], levels = events)

#Fit the linear model with the contrasts
fit <- lm(y ~ last_event, data = data,
          contrasts = list(last_event = MASS::contr.sdif))

#Get coefficients with robust SEs
lmtest::coeftest(fit, vcov. = sandwich::vcovHC)

