Comme on peut le voir sur le graphique de yy en fonction de xx, xx et yy sont corrélés, mais la valeur de cette corrélation s'inverse vers x == 35.
Il est bien sûr possible d'effectuer une régression linéaire simple sur ces données :

> dati<-data.frame(x = xx, y = yy) 
> out.lm<-lm(y ~ x, data = dati)
> summary(out.lm)

Call:
lm(formula = y ~ x, data = dati)

Residuals:
Min 1Q Median 3Q Max
-22.74151 -10.14636 -0.02897 9.80629 28.90790

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -11.43337 2.60805 -4.384 2.93e-05 ***
x 0.95855 0.04484 21.379 <> abline(out.lm, col = "red")

La droite de régression fait de son mieux, mais elle est loin de décrire les données correctement.
Quand on a à faire avec ce type de données, on peut (entre autre) réaliser une régression par intervalles (ou encore par morceaux).
Ici, puisqu'on a fabriqué nous même les données, on sait que la cassure survient aux alentours de xx == 35. On peut donc spécifier cette cassure dans le modèle à la main.

> xxm35 <- pmax(xx - 35, 0) 
> dati$xm35 <- xxm35
> out.lm2 <- lm(y ~ x + xm35, data = dati)
> summary(out.lm2)

Call:
lm(formula = y ~ x + xm35, data = dati)

Residuals:
Min 1Q Median 3Q Max
-3.9999 -1.4383 0.1918 1.5143 4.9954

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 19.53913 0.62081 31.47 <2e-16> plot(xx, yy)
> segments(0, coef(out.lm2)[1],
+ 35, coef(out.lm2)[1] + 35*coef(out.lm2)[2], col = "blue")
> segments(35, coef(out.lm2)[1] + 35*coef(out.lm2)[2],
+ max(xx), max(xxm35)*(coef(out.lm2)[2] + coef(out.lm2)[3]), col = "blue")

La valeur du coefficient associé à xm35 (pour x moins 35) est en fait l'écart entre la pente du second morceau de courbe et celle du premier morceau de courbe. La pente du second morceau de courbe est donc égale à :

> coef(out.lm2)[2] + coef(out.lm2)[3]
x
1.519968

On voit sur le graphique qu'on colle beaucoup mieux aux données.
Mais dans la vraie vie, on n'a pas toujours à faire à des données simulées, et la spécification du point de cassure n'est pas toujours évidente.
On peut alors utiliser la fonction segmented (du paquet du même nom, à installer).
Son utilisation de base est très simple : on effectue une régression linéaire toute simple, et on spécifie l'endroit approximatif de la (ou des) cassure(s).

> out.segmented <- segmented(out.lm,seg.Z=~x,psi=30) 
> summary(out.segmented)

***Regression Model with Segmented Relationship(s)***

Call:
segmented.lm(obj = out.lm, seg.Z = ~x, psi = 30)

Estimated Break-Point(s):
Est. St.Err
34.6400 0.4036

t value for the gap-variable(s) V: 1.904122e-15

Meaningful coefficients of the linear terms:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 19.7998989 0.68789581 28.78328 5.235624e-49
x -0.5439057 0.03428781 -15.86295 1.423581e-28
U1.x 2.0583596 0.03655512 56.30838 NA


Residual standard error: 1.961 on 96 degrees of freedom
Multiple R-Squared: 0.996, Adjusted R-squared: 0.9959

Convergence attained in 3 iterations with relative change 0
> slope(out.segmented)
$x
Est. St.Err. t value CI(95%).l CI(95%).u
slope1 -0.5439 0.03429 -15.86 -0.6111 -0.4767
slope2 1.5140 0.01267 119.50 1.4900 1.5390

Le summary de out.segmented ressemble à s'y méprendre à celui d'une régression linéaire simple, mais avec l'introduction d'un point de cassure estimé à 34.64. La fonction slope se charge quant à elle de calculer les pentes de chacune des portions de droite.
Voici un graphe récapitulatif des trois modèles :

plot(out.segmented, col = "green")
lines(xx, yy, type = "p")
abline(out.lm, col = "red")
segments(0, coef(out.lm2)[1],
35, coef(out.lm2)[1] + 35*coef(out.lm2)[2], col = "blue")
segments(35, coef(out.lm2)[1] + 35*coef(out.lm2)[2],
max(xx), max(xxm35)*(coef(out.lm2)[2] + coef(out.lm2)[3]), col = "blue")
legend("topleft", legend = c("RL simple", "RL par morceaux à la main", "RL par morceaux avec segmented"), col = c("red", "blue", "green"), lty = 1)

segmented marche avec tous les objets de classe lm ou glm. On peut spécifier plusieurs points de cassures pour plusieurs variables explicatives. Voir ?segmented pour plus de détails (le billet est inspiré des exemples de la fonction).