I though once again about precision in your situation, and my comment has been misleading, I guess.
Consider this: we have an assumption that a model outputs 1 (found dog) randomly with a probability equal to an observed label share in training sample. This effectively means that the model is untrained, and the output probability is simply for calculation reasons.
With this setting you will get precision equal to the observed share of label = 1 in your sample, which follows from independence of the output and the label.
However, the true precision will be higher, because unlabel dogs will populate the samples with output equals 1 along with the labels equal 1. The true precision will be equal the share of true labels in your sample (which again follows form the independence assumption).
Now we go on, and this math becomes irrelevant if we think about the TRAINED model, which will break the assumtion of independence between outputs, observed labels, and (importantly) true labels because the model will try to learn what the dog is and tend to find them better than random one. With this in mind, I don't see how to answer your question exactly, and this is maybe only possible when you run many simulations involving trained model and you will have to know:
p(sample is true dog)
p(sample is true dog | output = 1)
Simulation on random data:
dt <- data.table(
is_dog = rbinom(10000, 1, 0.5)
is_dog == 1
, is_label := rbinom(.N, 1, 1/3)
, is_label := ifelse(is.na(is_label), 0, is_label)
, is_output := rbinom(10000, 1, mean(dt[, is_label == 1]))
'observed precision = ,'
, mean(dt[is_output == 1, is_label == 1])
'true precision = ,'
, mean(dt[is_output == 1, is_dog == 1])