Test three-way correlation I'm working on Gaze in Turns in conversation. The kind of data is illustrated here:
df <- data.frame(
  Gaze_dur = c(25,35,75,55,
               150,120,170,190),
  N_p = c(3,3,3,3,
          2,2,2,2),
  Turn_dur = c(100,120,150,110,
               200,230,210,250)
)

I know that Turns in Dyads (2 ppl talking) are on average longer than Turns in Triads (3 ppl talking). I also know that Gaze durations are longer in Dyads than in Triads:
df %>%
  group_by(N_p) %>%
  summarise(Turn_dur_mean = mean(Turn_dur),
            Gaze_dur_mean = mean(Gaze_dur))
# A tibble: 2 × 3
    N_p Turn_dur_mean Gaze_dur_mean
  <dbl>         <dbl>         <dbl>
1     2          222.         158. 
2     3          120           47.5

How can I test the hypothesis that Gazes are shorter in Triads than Dyads because Turns are shorter in Triads than Dyads?
I would think that one step forward toward answering that question might be by computing the porportional duration of Gaze_dur against Turn_dur:
df %>%
  mutate(Gaze_dur_prop = Gaze_dur / Turn_dur)
  Gaze_dur N_p Turn_dur Gaze_dur_prop
1       25   3      100     0.2500000
2       35   3      120     0.2916667
3       75   3      150     0.5000000
4       55   3      110     0.5000000
5      150   2      200     0.7500000
6      120   2      230     0.5217391
7      170   2      210     0.8095238
8      190   2      250     0.7600000

But to proceed from there (if that's the right first step at all)? What's the appropriate statistical test?
 A: Sounds like a mediation question to me — you want to test whether the effect of N_p on Gaze_dur is mediated by Turn_dur. I would use lavaan to test this as a path model.
library(lavaan)

model <- ' # direct effect
             Gaze_dur ~ c*N_p
           # mediator
             Turn_dur ~ a*N_p
             Gaze_dur ~ b*Turn_dur
           # indirect effect (a*b)
             ab := a*b
           # total effect
             total := c + (a*b)
         '
fit <- sem(model, data = df)
summary(fit)

lavaan 0.6-12 ended normally after 1 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                         5

  Number of observations                             8

Model Test User Model:
                                                      
  Test statistic                                 0.000
  Degrees of freedom                                 0

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model          Structured

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)
  Gaze_dur ~                                          
    N_p        (c)  -44.935   39.414   -1.140    0.254
  Turn_dur ~                                          
    N_p        (a) -102.500   13.405   -7.647    0.000
  Gaze_dur ~                                          
    Turn_dur   (b)    0.635    0.361    1.760    0.078

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)
   .Gaze_dur        373.940  186.970    2.000    0.046
   .Turn_dur        359.375  179.687    2.000    0.046

Defined Parameters:
                   Estimate  Std.Err  z-value  P(>|z|)
    ab              -65.065   37.933   -1.715    0.086
    total          -110.000   16.105   -6.830    0.000

To walk through the output:
Regressions

*

*Gaze_dur ~ N_p  (c): direct effect or c' path. This the effect of X (N_p) on Y (Gaze_dur) that isn't attributable to the mediator M (Turn_dur).

*Turn_dur ~ N_p  (a): a path. Effect of X (N_p) on M (Turn_dur).

*Gaze_dur ~ Turn_dur  (b): b path. Effect of M (Turn_dur) on Y (Gaze_dur).

Variances

*

*These show the estimated residual variance of Y and M that aren't explained by X.

Defined Parameters

*

*ab: indirect effect. Effect of X (N_p) on Y (Gaze_dur) "through" or "explained by" M (Turn_dur). This is the key effect for testing mediation.

*total: total effect or c path. Effect of X (N_p) on Y (Gaze_dur), including both the direct and indirect effects. In other words, the effect of X on Y without controlling for M.

So in this toy data, there’s suggestive evidence of mediation, since the indirect effect (ab) is trend-significant.
NB, traditionally you would call this "complete" (as opposed to "partial") mediation, since the total effect of N_p on Gaze_dur is significant, while the direct effect (Gaze_dur ~ N_p  (c)) isn't. But distinguishing "complete" from "partial" mediation based on p values is increasingly frowned upon and considered arbitrary.
