1.4.3 A Gaussian fit🔗ℹ

formula-fit resolves the formula against the table and fits the family that #:family names, the Gaussian by default, with the same keywords as that family’s fit procedure. The model prints as the fit does, with the formula after the family:

> (define bp-fit (formula-fit (~ bp age dose marker) patients #:lambda 0.5))
> bp-fit

#<glmnet:gaussian (~ bp age dose marker) λ=0.5 dev=0.9137 nz=2/3>

coef returns an association list keyed by name, with the intercept first under R’s name for it, "(Intercept)". The lasso has found the two predictors that blood pressure depends on:

> (coef bp-fit)

'(("(Intercept)" . 93.51132211478343)

  ("age" . 0.5139586017419673)

  ("dose" . -1.7735029027253124)

  ("marker" . 0.0))

> (dict-ref (coef bp-fit) "dose")

-1.7735029027253124

predict takes a new table and reads the predictors from it by name. The columns can come in any order, and other columns are ignored; a missing predictor is an error that names it:

> (define new-patients
    '((id 101 102)
      (marker 0.5 -0.5)
      (dose 2.0 8.0)
      (age 40 70)))
> (predict bp-fit new-patients)

'(110.52266037901148 115.30040101491863)

> (predict bp-fit '((age 40) (dose 2.0)))

predict: the table has no column with this name

  column: "marker"

  columns of the table: '("age" "dose")

formula-path fits a regularization path, and formula-cv cross-validates one, with the keywords of the family’s path fitter and cross-validation procedure. Both keep the names:

> (formula-path (~ bp age dose marker) patients #:lambda '(4.0 1.0 0.25))

#<glmnet-path:gaussian (~ bp age dose marker)

  Df  %Dev Lambda

1  2 59.39   4.00

2  2 89.85   1.00

3  2 91.75   0.25>

> (define bp-cv (formula-cv (~ bp age dose marker) patients))
> bp-cv

#<glmnet-cv:gaussian (~ bp age dose marker)

Measure: Mean-Squared Error

    Lambda Index Measure    SE Nonzero

min 0.2724    37   9.255 1.138       2

1se 0.7579    26  10.194 1.374       2>

> (coef bp-cv)

'(("(Intercept)" . 94.09234504611852)

  ("age" . 0.49554398525920623)

  ("dose" . -1.6834215534687091)

  ("marker" . 0.0))

> (coef bp-cv #:lambda 'lambda-min)

'(("(Intercept)" . 92.99845164212019)

  ("age" . 0.530213232303164)

  ("dose" . -1.8530179478570004)

  ("marker" . 0.0))

The model is a formula-model. formula-model-fit returns the fit it holds, which equals the matrix call that the formula replaces:

> (formula-model-fit bp-fit)

#<glmnet:gaussian λ=0.5 dev=0.9137 nz=2/3>

> (define age+dose+marker (map list age dose marker))
> (equal? (formula-model-fit bp-fit) (lasso age+dose+marker bp #:lambda 0.5))

#t