On second thought, I realized I misunderstood your system. More likely what you want is to build your dataframe as one column for “sample” (0-1007, if you want, we won’t actually use this), one column for “channel” (‘R’/‘G’/‘B’), one column “cameraA” and one for column for “cameraB”. The Gumbi model becomes
ds = gmb.DataSet(df, outputs=['cameraB'], logit_vars=['cameraA', 'cameraB']) # Omit logit_vars if your data is not normalized to (0, 1)
gp = gmb.GP(ds)
# You may need to pass `sparse=True` for your 6k datapoints. 100 inducing points are the default, otherwise specify with `n_u`.
gp.fit(outputs=['cameraB'], continuous_dims=['cameraA'], categorical_dims=['channel'], sparse=True)
# Make predictions for each combination of camera/channel and plot
X = gp.prepare_grid()
axs = plt.subplots(1,3, figsize=(18, 4))[1]
for ax, channel in zip(axs, ['R','G','B']):
y = gp.predict_grid(categorical_levels={'channel': channel}, with_noise=False)
gmb.ParrayPlotter(X, y).plot(ax=ax)
Now you’re predicting the cameraB value from the cameraA value with correlations across channels.