X1 = rand(Uniform(0, 1), 50)
X2 = rand(Normal(0.5, 0.1), 50)
X3 = rand(Uniform(2, 3), 50)
Xall = [X1; X2; X3]
Y1 = sqrt.(X1) .+ rand(Normal(0, 0.05), 50)
Y2 = sqrt.(X2) .+ rand(Normal(0, 0.05), 50)
Y3 = sqrt.(X3) .+ rand(Normal(0, 0.05), 50)
Yall = [Y1; Y2; Y3]
# set range for prediction/plotting
Xpred = 0:0.01:3
# use GLM.jl to fit the regressions just to clean things up
# this uses MLE but as we will see is equivalent to OLS for linear models
lm1 = lm([ones(length(X1)) X1], Y1)
pred1 = predict(lm1, [ones(length(Xpred)) Xpred])
lm2 = lm([ones(length(X2)) X2], Y2)
pred2 = predict(lm2, [ones(length(Xpred)) Xpred])
lm3 = lm([ones(length(X3)) X3], Y3)
pred3 = predict(lm3, [ones(length(Xpred)) Xpred])
lmall = lm([ones(length(Xall)) Xall], Yall)
predall = predict(lmall, [ones(length(Xpred)) Xpred])
# plot true regression line, data points, and OLS predictions
p_demo = plot(Xpred, sqrt.(Xpred), color="#444444", linewidth=2, label="True Regression Line")
scatter!(X1, Y1, color="#4477AA", markershape=:circle, markersize=4, alpha=0.6, label="U(0, 1)")
scatter!(X2, Y2, color="#228833", markershape=:square, markersize=4, alpha=0.6, label=false)
scatter!(X3, Y3, color="#EE6677", markershape=:utriangle, markersize=4, alpha=0.6, label=false)
plot!(Xpred, pred1, color="#4477AA", linewidth=2, linestyle=:dash, label="U(0, 1)")
plot!(Xpred, pred2, color="#228833", linewidth=2, linestyle=:dash, label="N(0.5, 0.1)")
plot!(Xpred, pred3, color="#EE6677", linewidth=2, linestyle=:dash, label="U(2, 3)")
plot!(Xpred, predall, color=:black, linewidth=2, linestyle=:dot, label="Union Of All")
xlabel!(L"$X$")
ylabel!(L"$Y$")
plot!(size=(650, 600))