Combining Last-query distributions of multiple sequences

24 views
Skip to first unread message

Markku Oinonen

unread,
Jul 31, 2025, 9:43:18 AMJul 31
to OxCal
Hello Oxcal experts!

I have 10 individuals and set of radiocarbon dates out of different bone/teeth components with certain age differences due to different remodeling rates. The individuals have been found from the same context and it is assumed that they have been buried at the same time. So, I have made 10 V_Sequence wiggle-match models of each individuals and plan to combine the probability distributions of the moments of death, obtained by Last queries. So, something like (for two individuals):

Plot("R10 and R12")
{
V_Sequence("R10 all")
 {
  Boundary("Start R10");
  First("Birth R10");
  Gap(1.0,5);
  R_Date("pars petrosa R10",239,19);
  Gap(16.3,5);
  R_Date("cortical bone R10",105,19);
  Gap(12.7,5);
  R_Date("cancellous bone R10",87,20);
  Gap(5.0,6);
  Last("Death R10");
  Boundary("End R10");
 };
V_Sequence("R12")
 {
  Boundary("Start R12");
  First("Birth R12");
  Gap(1.4,5);
  R_Date("tooth 16 R12",220,24);
  Gap(19.9,5);
  R_Date("cancellous bone R12",92,24);
  Gap(3.7,6);
  Last("Death R12");
  Boundary("End R12");
 };
Combine("R10R12")
 {
  Date("=Death R10");
  Date("=Death R12");
 };
};

However, I have difficulties to get model and combination working. What do I do wrong? Are there some alternative ways to combine those distributions?

Thank you very much for your precious help!

Markku Oinonen
University of Helsinki   

John Meadows

unread,
Jul 31, 2025, 11:30:30 AMJul 31
to ox...@googlegroups.com
Dear Markku
I am working on similar models, so thank you for sharing your code. A couple of easy fixes - set the resolution as precisely as you need (the default is 5 years for gaps) and make sure you have not swapped commas for decimal points (e.g. I think   Gap(16.3,5); should be   Gap(16,3.5);).
Then I think your model should run, if the detailed information is all true. Your gaps are pretty precise, given the variation in collagen turnover rates demonstrated in some recent forensic studies. Given the steepness of the calibration curve concerned, this precision might mean that your individual V_Sequences eliminate any solutions in which the two individuals died simultaneously, as required by the Combine function.
Here is a version of the code which does work. I made the gaps slightly less precise, and put two fake constraints around the combined date of death, because otherwise it produces bimodal solutions. You might have some historical information like this that would help to make the model converge faster.
 Options()
 {
  Resolution=1;
 };

 Plot("R10 and R12")
 {
  V_Sequence("R10 all")
  {
   Boundary("Birth R10");
   Gap(2,1);

   R_Date("pars petrosa R10",239,19);
   Gap(15,5);

   R_Date("cortical bone R10",105,19);
   Gap(12,6);

   R_Date("cancellous bone R10",87,20);
   Gap(5,1);
   Boundary("Death R10");
  };
  V_Sequence("R12")
  {
   Boundary("Birth R12");
   Gap(14,1);

   R_Date("tooth 16 R12",220,24);
   Gap(20,5);

   R_Date("cancellous bone R12",92,24);
   Gap(5,1);
   Boundary("Death R12");
  };
  Sequence("fake constraints")
  {
   After("French Revolution", 1789)
   {

   };
   Combine("R10R12")
   {
    Date("=Death R10");
    Date("=Death R12");
   };
   Before("Russian Revolution", 1917)
   {
   };
  };
 };

Good luck
John

--
You received this message because you are subscribed to the Google Groups "OxCal" group.
To unsubscribe from this group and stop receiving emails from it, send an email to oxcal+un...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/oxcal/e6005e85-f9d8-4816-9488-6c71c61e7b9en%40googlegroups.com.

Erik Marsh

unread,
Aug 1, 2025, 10:06:49 AMAug 1
to OxCal
Markku – really interesting question. Great answer, John, this code runs well. As an alternative, you can code this with Sequence + Interval, since V_Sequence + Gap locks you into normally-distributed gaps. The code below is identical for R10 and allows you change the gaps, say, to uniform distributions, for example, Interval(U(12,22)); For teeth, normal distributions are pretty reliable (I'm thinking of Millard et al.'s 2020 application of AlQahtani et al. 2010). But for other bones, uniform distributions may be better; depends on the bone. Can I ask what your gaps are based on for the cortical and cancellous bone? I haven't always been able to find good information for all bones, or it's a little vague because tissue starts forming at one age and then continues forming for a long time. A quick google search suggest cancellous bone (which bone is it, precisely?) forms from the embryo through age 25, so that shouldn't be put in a sequence that assumes it is after the other bones.

A good reason to try this: when I switch the normal gaps to more relaxed uniform intervals, the agreement indices go up (John also relaxed the precision of the gaps).
You don't need the First and Last queries – instead, look at the Boundary to estimate birth and death date (as in John's code).

Other suggestions you might want to try:
• use a post-bomb curve, since errors extend into this period (and why you get the 'out of range' warning). I'm guessing you want Northern Hemisphere zone 1 (roughly north of 40°N),  which includes IntCal20 for pre-bomb ranges. This shouldn't affect the final results much. Curve("Bomb21NH1","bomb21nh1.14c");
• incorporate an estimated age at death (from traditional osteological methods) – this may be what most improves your final result, and should constrain the distributions nicely even if the estimate is imprecise. Again, this can be a uniform distribution if it's imprecise or not possible to provide a normally-distributed estimate (often the case, especially age estimates for middle-aged adults).
• the sequence of gaps means that if one is inaccurate or overestimates precision, the error will propagate down sequence. Instead, you could define individual intervals between Birth and each bone, which is a more reliable interval than one bone after another. And then cross-reference those into a standard Sequence – this what I would try. Just an idea.

I agree with John, some 'fake constraints' could help (especially if there is historic information that can exclude a low probability peak from about AD 1880–1920).
Hope this helps–
Erik


Sequence("R10 all")
  {
   Boundary("Birth R10");
   Interval(N(2,1));
   R_Date("pars petrosa R10",239,19);
   Interval(N(15,5));
   R_Date("cortical bone R10",105,19);
   Interval(N(12,6));
   R_Date("cancellous bone R10",87,20);
   Interval(N(5,1));
   Boundary("Death R10");
  };

Markku Oinonen

unread,
Aug 6, 2025, 1:53:46 AMAug 6
to OxCal
Dear John, Erik,

Thank you very much for your excellent answers! And apologies my late reply - needed to enjoy Finnish summer for a while. I will look into the code modifications and I am sure they work well. And nice to see you both work on the same "bone wiggle match" issues. I also had an impression that Boundary would be enough, as Last and Boundary distributions looked alike, but thank you for confirming that. Concerning gaps between cortical and cancellous bone: I have adopted the gap of Calcagnile et al (2013), Radiocarbon 55 for 36 year old individual and - based on that - estimated  bone component ages for different-age individuals and then gaps based on those. 

Have a nice late summer!

Markku

Markku Oinonen

unread,
Aug 6, 2025, 8:49:19 AMAug 6
to OxCal
Dear John and Erik,

Ok, now I had time to check out the model results. First, I ran V_Sequence models for R10 and R12 separately, obtained cpd's (calendar-year probability distribution) and made a product out of them also separately in Excel (I guess that is one - though not so elegant - way to obtain combined cpd, as it is just a product). Then I ran the proposed model (it runs well indeed) and combined them internally within the model. For some reason, with the latter, I obtained the same Death cpd's for R10 and R12, and therefore the combined cpd was also similar. Hmmm... I have 93% of my quota full, but I guess that can not cause such a problem? Continue to dig this interesting problem out:)...

Best regards,

Markku   

Reply all
Reply to author
Forward
0 new messages