spline regression models things to keep in mind when

54
Spline Regression Models Things to Keep in Mind when Fitting Polynomial Regression Models Piecewise Polynomials (Splines) Applying Variable Selection Methods to Choose Knots 1

Upload: others

Post on 30-Dec-2021

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Spline Regression Models Things to Keep in Mind when

Spline Regression Models

• Things to Keep in Mind when Fitting Polynomial Regression Models

• Piecewise Polynomials (Splines)

• Applying Variable Selection Methods to Choose Knots

1

Page 2: Spline Regression Models Things to Keep in Mind when

Important Considerations when Fitting Polynomials to Data

• Example (paper):

• How does the speed of a paper mill machine affect quality of the fin-ished product?

• Measurements of the amount of green liquor produced are recordedfor various speeds.

2

Page 3: Spline Regression Models Things to Keep in Mind when

Paper Mill Example (Cont’d)

Data:

\item[ ] Data:

\begin{verbatim}

> paper

green.liquor machine.speed

1 16.0 1700

2 15.8 1720

3 15.6 1730

4 15.5 1740

5 14.8 1750

6 14.0 1760

7 13.5 1770

8 13.0 1780

9 12.0 1790

10 11.0 1795

3

Page 4: Spline Regression Models Things to Keep in Mind when

Example (Cont’d)

> attach(paper)

> plot(green.liquor ˜ machine.speed) # paperplot.pdf

1700 1720 1740 1760 1780

1112

1314

1516

machine.speed

gree

n.liq

uor

4

Page 5: Spline Regression Models Things to Keep in Mind when

What happens if we use a linear model?

Fit the model and check the residual plot:

> paper.lm <- lm(green.liquor ˜ machine.speed)> plot(paper.lm, which=1, pch=16) # paperres.pdf

12 13 14 15 16 17

−1.

0−

0.5

0.0

0.5

Fitted values

Res

idua

ls

lm(formula = green.liquor ~ machine.speed)

Residuals vs Fitted

10 1

4

5

Page 6: Spline Regression Models Things to Keep in Mind when

Try a quadratic model

> paper.lm2 <- lm(green.liquor ˜ machine.speed +

I(machine.speedˆ2))

> summary(paper.lm2)

Coefficients:

Estimate Std. Error t value Pr(>|t|)

(Intercept) -1.709e+03 2.448e+02 -6.984 0.000215

machine.speed 2.023e+00 2.798e-01 7.230 0.000173

I(machine.speedˆ2) -5.929e-04 7.994e-05 -7.417 0.000147

Residual standard error: 0.2101 on 7 degrees of freedom

• Fitted model:

y = −1709 + 2.02x− .00059x2

(x = machine speed, y is amt of green liquor) error st. dev. estimate =.21.

6

Page 7: Spline Regression Models Things to Keep in Mind when

Is this model satisfactory?

Check the residual plot again:

> plot(paper.lm2, which=1, pch=16) # paper2res.pdf

12 13 14 15 16

−0.

3−

0.2

−0.

10.

00.

10.

20.

3

Fitted values

Res

idua

ls

lm(formula = green.liquor ~ machine.speed + I(machine.speed^2))

Residuals vs Fitted

10

8

6

7

Page 8: Spline Regression Models Things to Keep in Mind when

Overlaying the Data with the Fitted Curve

> plot(green.liquor ˜ machine.speed)

> quadline(paper.lm2) # paper2plot.pdf

1700 1720 1740 1760 1780

1112

1314

1516

machine.speed

gree

n.liq

uor

Quadratic Fitted to Paper Data

8

Page 9: Spline Regression Models Things to Keep in Mind when

Are there any Influential Observations?

Check Cook’s Distance:

> plot(paper.lm2, which=4, pch=16) # paper2cook.pdf

2 4 6 8 10

0.0

0.2

0.4

0.6

0.8

1.0

Obs. number

Coo

k’s

dist

ance

lm(formula = green.liquor ~ machine.speed + I(machine.speed^2))

Cook’s distance plot

10

9

1

9

Page 10: Spline Regression Models Things to Keep in Mind when

Check observation 10 more closely:

Influence on the coefficients and on the fitted values:

> dfbetas(paper.lm2)[10,]

(Intercept) machine.speed I(machine.speedˆ2)

-1.383708 1.395116 -1.406660

> dffits(paper.lm2)[10]

10

-2.258152

Observation 10 is highly influential.

10

Page 11: Spline Regression Models Things to Keep in Mind when

Important Considerations when Fitting Polynomials to Data

• Order of the Model

Keep this as low as possible – parsimony

• Example: titanium heat data - 49 observations on g and temperature.

Quadratic fit:

> attach(titanium)

> titanium.lm2 <- lm(g˜poly(temperature,2))

> plot(titanium, pch=16)

> lines(spline(temperature,predict(titanium.lm2)),

col=4, lwd=2)

11

Page 12: Spline Regression Models Things to Keep in Mind when

Titanium Example (Cont’d): A Failure for the Quadratic Polynomial Model

A pretty miserable fit:

600 700 800 900 1000

1.0

1.5

2.0

temperature

g

12

Page 13: Spline Regression Models Things to Keep in Mind when

Does a higher order polynomial fit better?

• 5th order fit:

> titanium.lm5 <- lm(g˜poly(temperature,5))

> plot(titanium, pch=16)

> lines(spline(temperature,predict(titanium.lm5)),

col=4, lwd=2)

13

Page 14: Spline Regression Models Things to Keep in Mind when

Titanium Heat Data Example (Cont’d): Attempting to Fit Using High DegreePolynomials

• 5th order model:

600 700 800 900 1000

1.0

1.5

2.0

temperature

g

14

Page 15: Spline Regression Models Things to Keep in Mind when

Example (Cont’d)

• 21st order fit:

> titanium.lm21 <- lm(g˜poly(temperature,21))

> plot(titanium, pch=16)

> lines(spline(temperature,predict(titanium.lm21)),

col=4, lwd=2)

15

Page 16: Spline Regression Models Things to Keep in Mind when

Titanium Heat Data Example (Cont’d): High Degree Polynomial Regres-sion is Futile

• 21st order model:

600 700 800 900 1000

1.0

1.5

2.0

temperature

g

16

Page 17: Spline Regression Models Things to Keep in Mind when

Better to use piecewise polynomials (splines)

Page 18: Spline Regression Models Things to Keep in Mind when

Important Considerations (Cont’d)

• Ill-Conditioning

• Example: Consider the Hilbert matrix Hp: hij = 1i+j−1, i, j = 1, . . . , p:

hilbert <- function(n=2){

matrix(1/(rep(seq(1,n),n)+

rep(seq(0,n-1),rep(n,n))),ncol=n)

}

> hilbert(2)

[,1] [,2]

[1,] 1.0 0.500

[2,] 0.5 0.333

17

Page 19: Spline Regression Models Things to Keep in Mind when

Ill-Conditioning (Cont’d)

> hilbert(4)

[,1] [,2] [,3] [,4]

[1,] 1.000 0.500 0.333 0.250

[2,] 0.500 0.333 0.250 0.200

[3,] 0.333 0.250 0.200 0.167

[4,] 0.250 0.200 0.167 0.143

18

Page 20: Spline Regression Models Things to Keep in Mind when

Ill-Conditioning (Cont’d)

• The Hilbert matrix is famous for being ill-conditioned.• The ratio of the largest eigenvalue to the smallest eigenvalue is very

large.• Matrix inversion is unstable, since the smallest eigenvalue is numeri-

cally indistinguishable from 0.• The inverse of the 2 × 2 Hilbert matrix:

solve(hilbert(2))

[,1] [,2]

[1,] 4 -6

[2,] -6 12

19

Page 21: Spline Regression Models Things to Keep in Mind when

Ill-Conditioned Matrices (Cont’d)

• Try to invert the 7 × 7 Hilbert matrix:

solve(hilbert(7))

Error in solve.default(hilbert(7)) : singular

matrix ‘a’ in solve

• From a numerical point of view, large Hilbert matrices appear singular.

• The determinant of a matrix is equal to the product of the eigenvalues;thus, all Hilbert matrices are invertible (nonsingular).

20

Page 22: Spline Regression Models Things to Keep in Mind when

Ill-Conditioned Matrices (Cont’d)

• The inverse of the Hilbert matrix can be computed using the followingfunction

inverse.hilbert <- function (n){Hinv <- matrix(0, nrow=n, ncol=n)for (i in 1:n){for (j in 1:n){Hinv[i,j] <- (-1)ˆ(i+j)*(i+j-1)*

choose(n+i-1,n-j)*choose(n+j-1,n-i)*choose(i+j-2,i-1)ˆ2

}}Hinv}

> inverse.hilbert(7)[,1] [,2] [,3] [,4] [,5] [,6] [,7]

[1,] 49 -1176 8820 -29400 48510 -38808 12012[2,] -1176 37632 -317520 1128960 -1940400 1596672 -504504[3,] 8820 -317520 2857680 -10584000 18711000 -15717240 5045040[4,] -29400 1128960 -10584000 40320000 -72765000 62092800 -20180160[5,] 48510 -1940400 18711000 -72765000 133402500 -115259760 37837800[6,] -38808 1596672 -15717240 62092800 -115259760 100590336 -33297264[7,] 12012 -504504 5045040 -20180160 37837800 -33297264 11099088

21

Page 23: Spline Regression Models Things to Keep in Mind when

Example (Cont’d)

• We can check that this is correct by multiplying with the Hilbert matrixof size 7:

> sum(hilbert(7)[1,]*inverse.hilbert(7)[1,])[1] 1> sum(hilbert(7)[1,]*inverse.hilbert(7)[2,])[1] 0> sum(hilbert(7)[1,]*inverse.hilbert(7)[3,])[1] 0> sum(hilbert(7)[1,]*inverse.hilbert(7)[4,])[1] 0> sum(hilbert(7)[1,]*inverse.hilbert(7)[5,])[1] 0> sum(hilbert(7)[1,]*inverse.hilbert(7)[6,])[1] 0> sum(hilbert(7)[1,]*inverse.hilbert(7)[7,])[1] 0

22

Page 24: Spline Regression Models Things to Keep in Mind when

Is the Hilbert Matrix just an Artificial Example?

• Consider the following regression problem:

y = β0 + β1x + · · ·+ βpxp + ε

where the x values have been taken equally spaced on the intervalfrom 0 to 1: e.g. if n = 10, x = .1, .2, . . . ,1.

• As n →∞, 1nXTX = Hp.

23

Page 25: Spline Regression Models Things to Keep in Mind when

Multicollinearity

• Consider the paper example again:

> paper.lm3 <- lm(green.liquor˜machine.speed+

I(machine.speedˆ2)+I(machine.speedˆ3))

Coefficients:

Estimate Std. Error t value Pr(>|t|)

(Intercept) 6.75e+03 1.80e+04 0.38 0.72

machine.speed -1.25e+01 3.08e+01 -0.41 0.70

I(machine.speedˆ2) 7.72e-03 1.76e-02 0.44 0.68

I(machine.speedˆ3) -1.59e-06 3.36e-06 -0.47 0.65

24

Page 26: Spline Regression Models Things to Keep in Mind when

Multicollinearity

> vif(paper.lm2)

machine.speed I(machine.speedˆ2)

15616 15616

• Reminder: If VIF > 10, we have a problem.

> vif(paper.lm3)

machine.speed I(machine.speedˆ2) I(machine.speedˆ3)

1.68e+08 6.76e+08 1.70e+08

25

Page 27: Spline Regression Models Things to Keep in Mind when

Orthogonal Polynomials

• It is better to use orthogonal polynomials.

• Obtain them using the Gram-Schmidt orthogonalization procedure.

• poly(x,k) evaluates the first k +1 orthogonal polynomials Pi(x) atx.

• The model becomes

yi = β0P0(xi) + β1P1(xi) + · · ·+ βkPk(xi) + εi

where P0(xi) = 1, P1(x) is linear in x, . . . , Pk(x) is a kth degreepolynomial in x.

26

Page 28: Spline Regression Models Things to Keep in Mind when

Orthogonal Polynomials

• Orthogonality property:

n∑i=1

Pj(xi)Pk(xi) = 0 if i 6= j

• Implication: XTX is a diagonal matrix with jth element

XTXjj =n∑

i=1

P2j (xi)

• Numerically stable to invert!

27

Page 29: Spline Regression Models Things to Keep in Mind when

Example: Applying Orthogonal Polynomials to the Paper Data

> paper.orth3 <- lm(green.liquor ˜ poly(machine.speed,3))> summary(paper.orth3)

Coefficients:Estimate Std. Error t value Pr(>|t|)

(Intercept) 14.1200 0.0705 200.40 1.0e-12poly(machine.speed, 3)1 -4.9051 0.2228 -22.01 5.7e-07poly(machine.speed, 3)2 -1.5581 0.2228 -6.99 0.00043poly(machine.speed, 3)3 -0.1050 0.2228 -0.47 0.65399

• Forward selection is straightforward now. VIFs are all 1.

28

Page 30: Spline Regression Models Things to Keep in Mind when

7.5 More on Orthogonal Polynomials

• Model:

yi = α0P0(xi) + α1P1(xi) + · · ·+ αkPk(xi) + εi

where P0(xi) = 1, P1(x) is linear in x, . . . , Pk(x) is a kth degreepolynomial in x.

• Orthogonality property:

n∑i=1

Pj(xi)Pk(xi) = 0 if i 6= j

29

Page 31: Spline Regression Models Things to Keep in Mind when

Quadratic Example

x -1 0 1 2y 2 1 2 10

• If we use the non-orthogonal polynomials 1, x, x2, then

X =

1 −1 11 0 01 1 11 2 4

= [x1˜

x2˜

x3˜

]

30

Page 32: Spline Regression Models Things to Keep in Mind when

Gram-Schmidt

• Convert this to an orthogonal basis:

yT1˜

=

xT1˜

||x1˜||

= [1/2 1/2 1/2 1/2]

y2′

˜= x2

˜−(xT

y1˜

) y1˜

y2˜

=

y′2˜

|| y′2˜||

yT2˜

= [−3 − 1 1 3]/√

20

y3′

˜= x3

˜−(xT

y1˜

) y1˜−(xT

y2˜

) y2˜

31

Page 33: Spline Regression Models Things to Keep in Mind when

Gram-Schmidt (Cont’d)

y3˜

=

y′3˜

|| y′3˜||

yT3˜

= [1 − 1 − 1 1]/2

z1˜

= 2 y1˜

, z2˜

=√

20 y2˜

, z3˜

= 2 y3˜

Xorth = [z1˜

z2˜

z3˜

] =

1 −3 11 −1 −11 1 −11 3 1

32

Page 34: Spline Regression Models Things to Keep in Mind when

Gram-Schmidt (Cont’d)

• The columns of Xorth are orthogonal so

XTorthXorth =

4 0 00 20 00 0 4

• What are the orthogonal polynomials in this case?

P0(x) = 1

P1(x) = Ax + B = 2x− 1

P2(x) = Ax2 + Bx + C = x2 − x− 1

33

Page 35: Spline Regression Models Things to Keep in Mind when

Orthogonal Polynomials (Cont’d)

• Check orthogonality:

4∑i=1

Pj(xi)Pk(xi) = 0, j 6= k

• The orthogonalized regression problem is

y = β0 + β1(2x− 1) + β2(x2 − x− 1) + ε

y = 3.75 + 1.25(2x− 1) + 2.25(x2 − x− 1)

• This simplifies to

y = .25 + .25x + 2.25x2

which could be obtained (but with attendant numerical difficulties) fromthe original X matrix.

34

Page 36: Spline Regression Models Things to Keep in Mind when

General Case: Higher Order Orthogonal Polynomial Regression

yi = α0P0(xi) + α1P1(xi) + · · ·+ αkPk(xi) + εi

X =

P0(x1) P1(x1) ... Pk(x1)P0(x2) P1(x2) ... Pk(x2)· · · · · · · · · · · ·

P0(xn) P1(xn) ... Pk(xn)

XTX =

∑n

i=1 P20 (xi) ... 0

· · · . . . · · ·0 ...

∑ni=1 Pk(xi)

XT y˜

=

P0(xi)yi...∑

Pk(xi)yi

αj =

∑Pj(xi)yi∑Pj(xi)2

35

Page 37: Spline Regression Models Things to Keep in Mind when

Confidence interval for αj

E[αj] = αj

V (αj) =σ2∑n

i=1 P2j (xi)

SSE =∑

y2i −

k∑j=1

αj

n∑i=1

Pj(xi)yi

MSE = SSE/(n− k − 1)

αj ± tα/2,n−k−1

√√√√ MSE∑P2

j (xi)

36

Page 38: Spline Regression Models Things to Keep in Mind when

Significance testing

:SSR(αj) = αj

∑Pj(xi)yi

H0 : αj = 0 H1 : αj 6= 0

F0 =SSR(αj)

MSE

Reject H0 if F0 > Fα/2,1,n−k−1.

Since the regression sum of squares for the jth term does not dependon any other coefficients, this partial F test does not depend on termsalready included in the model.

37

Page 39: Spline Regression Models Things to Keep in Mind when

Introduction to Splines

• Polynomials are not flexible enough to adequately model all smoothfunctions.

• Piecewise polynomials or splines are more flexible.

• What is a piecewise polynomial?

• Example: Consider two polynomials

p1(x) = −2x2 + .5x3

p2(x) = −2x2 + .5x3 − 2(x− 6)3

38

Page 40: Spline Regression Models Things to Keep in Mind when

Splines (Cont’d)

• We can make a piecewise polynomial out of these two polynomials bycutting them at x = 6 (they are equal there) and tying them togetherwith a knot at x = 6:

s(x) = −2x2 + .5x3, x < 6

s(x) = −2x2 + .5x3 − 2(x− 6)3, x ≥ 6

or

s(x) = −2x2 + .5x3 − 2(x− 6)3I(x ≥ 6)

or

s(x) = −2x2 + .5x3 − 2(x− 6)+3

• This is a cubic spline with a knot at 6.

39

Page 41: Spline Regression Models Things to Keep in Mind when

Splines (Cont’d)

0 2 4 6 8 10

y

− 2x2 + 0.5x3

0 2 4 6 8 10

010

020

030

040

0

y

y2

− 2x2 + 0.5x3

− 2x2 + 0.5x3 − 2(

− 2x2 + 0.5x3

− 2x2 + 0.5x3 − 2(x − 6)3

cubic spline, knot at 6.0

> source("splineeg.R") # some spline examples

> spline.eg() # plots two polynomials and a spline

40

Page 42: Spline Regression Models Things to Keep in Mind when

Another Example: Three different cubic polynomials

p1(x) = −2x2 + .5x3

p2(x) = −2x2 + .5x3 − 5(x− 6)3

p3(x) = −2x2 + .5x3 − 5(x− 6)3 + 5(x− 6.5)3

• Cut them up at x = 6 and x = 6.5 and tie together with knots there:

s(x) = −2x2+ .5x3−5(x−6)3I(x ≥ 6)+5(x−6.5)3I(x ≥ 6.5)

or

s(x) = −2x2 + .5x3 − 5(x− 6)+3 + 5(x− 6.5)+

3

• This is a cubic spline with knots at 6 and 6.5.

41

Page 43: Spline Regression Models Things to Keep in Mind when

A Spline Curve

0 2 4 6 8 10

y

− 2x2 + 0.5x3

0 2 4 6 8 10

050

0015

000

2500

0

y

y1

− 2x2 + 0.5x3 − 5(x − 6)3

− 2x2 + 0.5x3

− 2x2 + 0.5x3

− 2x2 + 0.5x3 − 5(x − 6)3

− 2x2 + 0.5x3 − 5(x − 6)3 + 5(x − 6.5)3

050

0015

000

2500

0

y1

− 2x2 + 0.5x3

− 2x2 + 0.5x3 − 5(x − 6)3

− 2x2 + 0.5x3 − 5(x − 6)3 + 5(x −

cubic spline, knots at 5.0, 6.5

> spline.eg2() # plots three polynomials and a spline

42

Page 44: Spline Regression Models Things to Keep in Mind when

Truncated Power function

T (x) = (x− τ)k+ = (x− τ)kI(x ≥ τ)

T (x) is 0 for x < τ and (x− τ)k for x ≥ τ .

T (x) is a simple k degree spline with a knot at τ .

43

Page 45: Spline Regression Models Things to Keep in Mind when

Spline Regression Models:

y = β0 + β1x + · · ·+ βkxk + γ1T1(x) + · · ·+ γhTh(x)

where Tj(x) = (x− τj)k+.

• Knots are at τ1, τ2, . . . , τh.

• The β’s and γ’s can be estimated by least-squares. The X matrix hask + h + 1 columns.

• (Exercise: What are the columns of X?)

44

Page 46: Spline Regression Models Things to Keep in Mind when

Splines (Cont’d)

• B-splines are more numerically stable than truncated splines.

• The regression model in terms of B-Splines:

y = β0 + β1B1(x) + β2B2(x) + · · ·+ βkBk(x) + ε

45

Page 47: Spline Regression Models Things to Keep in Mind when

Example: The B-spline transformations of temperature (Titanium Data)

knots at 825, 885, 895, 905, 990; degree = 3

600 800 1000

0.0

0.2

0.4

temperature

B(t

empe

ratu

re)

Spline Transformation of Temperature

600 800 1000

0.0

0.2

0.4

temperature

B(t

empe

ratu

re)

Spline Transformation of Temperature

600 800 1000

0.0

0.4

0.8

temperature

B(t

empe

ratu

re)

Spline Transformation of Temperature

600 800 1000

0.0

0.4

0.8

temperature

B(t

empe

ratu

re)

Spline Transformation of Temperature

46

Page 48: Spline Regression Models Things to Keep in Mind when

Example (Cont’d)

The other four transformations:

600 800 1000

0.0

0.2

0.4

0.6

temperature

B(t

empe

ratu

re)

Spline Transformation of Temperature

600 800 1000

0.0

0.2

0.4

temperature

B(t

empe

ratu

re)

Spline Transformation of Temperature

600 800 1000

0.0

0.2

0.4

0.6

temperature

B(t

empe

ratu

re)

Spline Transformation of Temperature

600 800 1000

0.0

0.4

0.8

temperature

B(t

empe

ratu

re)

Spline Transformation of Temperature

Number of transformations = degree + number of knots

47

Page 49: Spline Regression Models Things to Keep in Mind when

Example: Fitting a Spline Curve to the Titanium Data

> require(splines)

[1] TRUE, scale=.9

> titanium.spline<-lm(g ˜ bs(temperature,

knots=c(825,885,895,905,990),degree=3))

48

Page 50: Spline Regression Models Things to Keep in Mind when

Example (Cont’d)

> plot(titanium,pch=16)> lines(spline(temperature,predict(titanium.spline)),

col=4,lwd=2)> title("Cubic Spline Fitted to Titanium Data")

600 700 800 900 1000

1.0

1.5

2.0

temperature

g

Cubic Spline Fitted to Titanium Data

49

Page 51: Spline Regression Models Things to Keep in Mind when

Choosing knots using Variable Selection Methods

• Spline example - geophones:

tr.pwr <- function (x, knot, degree=3)

{ # truncated power function

(x > knot)*(x - knot)ˆdegree

}

# one knot per function

xx <- cbind(distance,distanceˆ2,distanceˆ3,

outer(distance,seq(20,80,length=20),tr.pwr))

# we start with 20 knots equally spaced between

# 20 and 80, and use forward selection to choose

# the best ones:

50

Page 52: Spline Regression Models Things to Keep in Mind when

geophones.fwd <- regsubsets(thickness ˜ xx,

method="forward", nvmax=12, data=geophones)

summary.regsubsets(geophones.fwd)$cp

[1] 153.39 52.34 31.41 20.27 15.77 10.59

[7] 10.78 10.68 9.75 8.81 8.52 9.21

# Which knots are in?

seq(20,80,length=20)[summary.regsubsets(

geophones.fwd)$which[11,-seq(1,4)]]

[1] 20.0 32.6 35.8 38.9 45.3 51.6 54.7 70.5 73.7 76.8

knots.sub <- summary.regsubsets(

geophones.fwd)$which[11,-seq(1,4)]

knots.try<-seq(20,80,length=20)[knots.sub]

geophones.bs <- lm(thickness ˜ bs(distance, knots =

knots.try,Boundary.knots = c(0,100)),data=geophones)

PRESS(geophones.bs)

[1] 285

plot(geophones)

Page 53: Spline Regression Models Things to Keep in Mind when

lines(spline(geophones$distance,

predict(geophones.bs)),col=4)

# you can check plot(geophones.bs) to see if there are

# problems

Page 54: Spline Regression Models Things to Keep in Mind when

Titanium Example

xx <- cbind(temperature,temperatureˆ2,temperatureˆ3,outer(temperature,seq(620,1050,length=30),tr.pwr))

titanium.fwd <- regsubsets(g ˜ xx, method="forward",nvmax=15, data=titanium)

summary.regsubsets(titanium.fwd)$cp[1] 72343.36 57292.13 42136.90 27174.83 11382.40 5551.22[7] 1795.84 351.67 103.14 68.64 11.84 5.72

[13] 6.91 8.15 9.52> knots.try<-seq(620,1050,

length=30)[summary.regsubsets(titanium.fwd)$which[12,-seq(1,4)]]titanium.bs <- lm(g ˜ bs(temperature, knots = knots.try,

Boundary.knots = c(500,1100)))plot(titanium)lines(spline(temperature,predict(titanium.bs)),col=4)

# plot(titanium.bs)

51