Reputation: 2724
I am using the gam
model in caret.train
(caret
uses gam
from package mgcv
):
> fit <- train(P~II+TH+DR+TT,data=training,method="gam",trControl=ctrl,metric="Rsquared",preProc=c("center","scale"))
> names(fit)
[1] "method" "modelType" "results" "pred" "bestTune" "call"
[7] "dots" "metric" "control" "finalModel" "preProcess" "trainingData"
[13] "resample" "resampledCM" "perfNames" "maximize" "yLimits" "times"
[19] "terms" "coefnames" "xlevels"
I don't see fitted.values
above, but a gam
object should return fitted.values
- http://hosho.ees.hokudai.ac.jp/~kubo/Rdoc/library/gam/html/gam.html
As a result, I am not able to plot fitted vs residuals, and some other functions are also failing. A workaround is using gam
directly instead of caret
, but I plan on using other models too, and want a consistent interface.
Please advise.
EDIT:
Data snapshot - dput(head(training))
output:
structure(list(TT = c(1.810376, 0.089206, 0.623906, 0.676775,
0.206524, 1.014849), P = c(682L, 674L, 681L, 679L, 655L, 682L
), II = c(846000000L, 4790000L, 38600000L, 40600000L, 1379632L,
7526080L), WSM = c(5272L, 144L, 576L, 576L, 2336L, 18696L), TSM = c(168704L,
4608L, 18432L, 18432L, 74752L, 598272L), L2M = c(1.49e+09, 12600000,
85700000, 1.24e+08, 4214560, 33560200), DR = c(2.52e+09, 18400000,
1.3e+08, 1.8e+08, 5559030, 44681000), DW = c(11600000L, 5440000L,
39600000L, 46400000L, 4920550L, 36812430L), TH = c(32.032843125,
0.1880727305, 0.2003506939, 0.1983195715, 0.558498625, 0.495952125
)), .Names = c("TT", "P", "II", "WSM", "TSM", "L2M", "DR", "DW",
"TH"), row.names = c(3L, 5L, 7L, 8L, 9L, 10L), class = "data.frame")
str(fit)
shows fitted.values
inside finalModel
as suggested by @nograpes.
$ finalModel :List of 50
..$ coefficients : Named num [1:37] 761 -1839 -377 745 -473 ...
.. ..- attr(*, "names")= chr [1:37] "(Intercept)" "s(II).1" "s(II).2" "s(II).3" ...
..$ residuals : num [1:44] -8.229 0.402 -11.41 -26.357 -8.202 ...
..$ fitted.values : Named num [1:44] 690 674 683 707 687 ...
Upvotes: 2
Views: 2453
Reputation: 14331
See http://caret.r-forge.r-project.org/modelList.html
Using method = "gam" gets you gam() from the mgcv package and using "gamLoess" and "gamSpline" use gam() from the gam package.
> library(gam)
> data(kyphosis)
> mod <- train(Kyphosis ~ Age + Number, data = kyphosis, method = "gamSpline")
> mod$finalModel
Call:
gam:::gam(formula = smootherFormula(data[, !(names(data) %in%
".outcome"), drop = FALSE], smoother = "s", df = tuneValue$.df),
family = if (type == "Regression") gaussian() else binomial(),
data = data)
Degrees of Freedom: 80 total; 76.99992 Residual
Residual Deviance: 64.9097
> head(mod$finalModel$fitted.values)
1 2 3 4 5 6
0.15217276 0.10961985 0.27168469 0.07017040 0.04072463 0.01414652
Max
Upvotes: 1
Reputation: 18323
It would have made this question a lot easier to answer if you had provided some sample data.
Checking the names
of the object isn't a good way of finding out what is inside it. Try running str(fit)
and you'll see what you are missing.
The fitted.values
object is nested one level deeper.
library(mgcv)
library(caret)
dat <- gamSim(1,n=400,dist="normal",scale=2)
test<-train(y~x1, data=dat, method='gam') # Next time, provide any data like this.
test$finalModel$fitted.values # If that isn't what you want, try str(test)
Upvotes: 4