R: Regression between Two related Dependent Variables (not paired) I have two dependent variables that are measured during an experiment, they both change in time (independent variable).  The measurements for both variables do not always coincide in time (so they are not really paired).  I know that there is a relationship between the two measured dependent variables, and ultimately, I want to use this relationship to predict the value of one dependent variables based on the other dependent variable. In essence, I want to:

Perform a regression between Two related but not paired Dependent Variables

The following example is an illustration that sets up the data so that it can be explained (hopefully) using R and pertinent packages:
I am cooking dough in an oven at very low temperature.  I have instrumentation to measure humidity (a probe), and crunchiness (my jaws). Because of the nature of the experiment, I wasn't able always measure both variables at the same time.  The extended literature in the subject tells me that both variables change logarithmic growth/decay as the dough cooks.
Because I only have only one jaw (measuring crunchiness), but have unlimited use of the humidity probe (measuring humidity), I want to use the relationship between both variables to predict crunchiness based on humidity (R script is highly appreciated).
Here's a plot of the data:

Here's the data (so it can be used to solve my predicament), and the code to plot it.
df <- read.table(text=
"CookMinutes    Value   Measurement
21  6.5 Humidity
17  7.0 Humidity
32  7.0 Humidity
29  6.9 Humidity
111 6.5 Humidity
135 6.4 Humidity
159 6.1 Humidity
15  7.3 Crunchiness
12  6.7 Crunchiness
14  7.4 Crunchiness
26  8.4 Crunchiness
12  7.0 Crunchiness
24  7.8 Crunchiness
135 10.9    Crunchiness
159 11.2    Crunchiness",
                       header=T)
library(ggplot2)
ggplot(df, aes(x=CookMinutes, y=Value, color=Measurement, shape=Measurement)) +
  geom_point() + 
  geom_smooth(method=lm, formula = y ~ log(x))


I still have this question (about 4 years after) .  The answers are very compelling AND innovative, but I cannot believe there isn't a method out there to solve this predicament.  More recently I have tried looking into methods in time series, as that is a case where you may have independent measurements over time that are not aligned to each other and you may want to understand the relationship between both and the confidence between that relationship.

 A: Depending on your actual data, you might be able to approach this as an imputation problem. The higher the fraction of value pairs is in your data, the better it would work.
df1 <- merge(df[df$Measurement ==  "Humidity", ],
             df[df$Measurement ==  "Crunchiness", ], by = "CookMinutes", all = TRUE)

library(Amelia)
set.seed(42)
df1i <- amelia(df1[, c("CookMinutes", "Value.x", "Value.y")], ts = "CookMinutes", polytime = 1, m = 50)
plot(df1i) #not so good

library(data.table)
df2i <- rbindlist(df1i$imputations[sapply(df1i$imputations, is.list)], idcol = "Imp")

library(ggplot2)
ggplot(df2i, aes(x = CookMinutes, y = Value.x)) +
  geom_point(aes(group = Imp)) +
  stat_summary(fun.y = median, geom = "point", color = "red")


ggplot(df2i, aes(x = CookMinutes, y = Value.y)) +
  geom_point(aes(group = Imp)) +
  stat_summary(fun.y = median, geom = "point", color = "red")


df2i[, id := seq_len(.N), by = Imp]
ggplot(df2i[, .(x = median(Value.x), y = median(Value.y), 
                imputed = (sd(Value.x) != 0) + (sd(Value.y) != 0),
                t = unique(CookMinutes)), by = id], 
       aes(x = x, y = y, color = ordered(imputed), size = t)) +
  geom_point()


The relationship between the two variables appears to change over time. Note that you'd need a model that takes into account errors in both x and y values if you want to model this (Deming regression, ...).
Obviously, imputation could be improved and you could (maybe should) even use the proposed "logarithmic growth/decay" model for imputation. But you said in a comment "That relationship looks enticing, but I don't want to impose."
A: What you could do is learn the relationship between time and the crunchiness and between time and the humidity, and then relate these two to each other. It is sort of similar to the "imputation solution" but instead of using imputed data points you use the function. 
The log model seems about right so I am using that one. Both the crunchiness and the humidity are functions of the log of time: 
$$
\begin{align}
\text{crunchiness} &= \beta_\text{crunchiness} \log(\text{time}) + \alpha_\text{crunchiness}\\
\text{humidity} &=  \beta_\text{humidity} \log(\text{time}) + \alpha_\text{humidity}\\
\end{align}
$$
An expression for the log of time in terms of humidity can be obtained by rewriting the log-linear model for humidity.
$$
log(\text{time}) = \frac{\text{humidity} - \alpha_\text{humidity}}{\beta_\text{humidity}} \\
$$
This term is inserted in the log-linear model for crunchiness. With this we can express the crunchiness as a linear function of humidity. 
$$
\begin{align}
\text{crunchiness} &= \beta_\text{crunchiness} (\frac{\text{humidity} - \alpha_\text{humidity}}{\beta_\text{humidity}}) + \alpha_\text{crunchiness} \\
&= \frac{\beta_\text{crunchiness}}{\beta_{humidity}} \text{humidity} - \frac{\beta_\text{crunchiness}\alpha_{humidity}}{\beta_\text{humidity}} + \alpha_\text{crunchiness} \\
&= \beta \times \text{humidity} + \alpha
\end{align}
$$
These new $\alpha$ and $\beta$ translate from $\text{humidity}$ to $\text{crunchiness}$. Below is the code for doing this in R. A plot shows that the log-linear fit of the predicted points is equivalent to the log-linear fit of the original crunchinenss points. However, the predicted points are much more spreaded out. 
library(tidyverse)
# learning log-linear model for humidity and crunchiness
df_humidity     <- df %>% filter(Measurement == "Humidity")
df_crunchiness  <- df %>% filter(Measurement == "Crunchiness")
fit_humidity    <- lm(Value ~ log(CookMinutes), df_humidity)
fit_crunchiness <- lm(Value ~ log(CookMinutes), df_crunchiness)

# computing new linear function from humidity to crunchiness
slope     <- coef(fit_crunchiness)[2] / coef(fit_humidity)[2]
intercept <- -slope * coef(fit_humidity)[1] + coef(fit_crunchiness)[1]

# Showing the predicted data
df <- df_humidity %>%
  mutate(Value = slope * Value + intercept,
         Measurement = "Predicted_crunchiness") %>%
  bind_rows(df_humidity, df_crunchiness)
ggplot(df, aes(CookMinutes, Value, color=Measurement, shape=Measurement)) +
  geom_point() +
  geom_smooth(method = "lm", formula = y ~ log(x))


