[R] Question about Natural Splines (ns function)

David Winsemius dwinsemius at comcast.net
Wed Sep 7 05:25:13 CEST 2011


On Sep 6, 2011, at 5:08 PM, Axel Urbiz wrote:

> Hi - How can I 'manually' reproduce the results in 'pred1' below?

Well, not by constructing the prediction function from a different  
data basis that the glm function gets.

> My attempt
> is pred_manual, but is not correct. Any help is much appreciated.
>
> library(splines)
> set.seed(12345)
> y <- rgamma(1000, shape =0.5)
> age <- rnorm(1000, 45, 10)
> glm1 <- glm(y ~ ns(age, 4), family=Gamma(link=log))
> dd <- data.frame(age = 16:80)
> mm <- model.matrix( ~ ns(dd$age, 4))
> pred1 <- predict(glm1, dd, type = "response")
> pred_manual <- exp(coefficients(glm1)[1] * mm[,1] +
>                   coefficients(glm1)[2] * mm[,2] +
>                   coefficients(glm1)[3] * mm[,3] +
>                   coefficients(glm1)[4] * mm[,4] +
>                   coefficients(glm1)[5] * mm[,5])

 > attr(glm1$terms, "predvars")
list(y, ns(age, knots = c(38.7407342480734, 44.9093960482465,
51.5913373894399), Boundary.knots = c(14.7723335249845,  
76.5536098692015), intercept = FALSE))

 > pred_man <- exp(coefficients(glm1) %*% t(mm))
 > str(pred_man)
  num [1, 1:65] 0.327 0.335 0.343 0.351 0.36 ...
  - attr(*, "dimnames")=List of 2
   ..$ : NULL
   ..$ : chr [1:65] "1" "2" "3" "4" ...

 > str(pred1)
  Named num [1:65] 0.336 0.343 0.351 0.359 0.366 ...
  - attr(*, "names")= chr [1:65] "1" "2" "3" "4" ...
 > plot(pred_man, pred1)

So a 4 knot natural spline derived from a random rnorm  against a  
random gamma series is somewhat similar to one derived from from a  
series of integers over the same range.

 > dd2 <- data.frame(age = age)
 > mm2 <- model.matrix( ~ ns(dd2$age, 4))
 > pred_man2 <- exp(coefficients(glm1) %*% t(mm2))
 > plot(age,pred_man2)
 > points(dd$age, pred_man)

Different bases, different predictions.

-- 

David Winsemius, MD
Heritage Laboratories
West Hartford, CT



More information about the R-help mailing list