O mgcv
pacote para R
possui duas funções para ajustar as interações do produto tensorial: te()
e ti()
. Entendo a divisão básica do trabalho entre os dois (ajustando uma interação não linear versus decompondo essa interação em efeitos principais e uma interação). O que não entendo é o porquê te(x1, x2)
e ti(x1) + ti(x2) + ti(x1, x2)
pode produzir resultados (ligeiramente) diferentes.
MWE (adaptado de ?ti
):
require(mgcv)
test1 <- function(x,z,sx=0.3,sz=0.4) {
x <- x*20
(pi**sx*sz)*(1.2*exp(-(x-0.2)^2/sx^2-(z-0.3)^2/sz^2)+
0.8*exp(-(x-0.7)^2/sx^2-(z-0.8)^2/sz^2))
}
n <- 500
x <- runif(n)/20;z <- runif(n);
xs <- seq(0,1,length=30)/20;zs <- seq(0,1,length=30)
pr <- data.frame(x=rep(xs,30),z=rep(zs,rep(30,30)))
truth <- matrix(test1(pr$x,pr$z),30,30)
f <- test1(x,z)
y <- f + rnorm(n)*0.2
par(mfrow = c(2,2))
# Model with te()
b2 <- gam(y~te(x,z))
vis.gam(b2, plot.type = "contour", color = "terrain", main = "tensor product")
# Model with ti(a) + ti(b) + ti(a,b)
b3 <- gam(y~ ti(x) + ti(z) + ti(x,z))
vis.gam(b3, plot.type = "contour", color = "terrain", main = "tensor anova")
# Scatterplot of prediction b2/b3
plot(predict(b2), predict(b3))
As diferenças não são muito grandes neste exemplo, mas estou me perguntando por que deveria haver diferenças.
Informações da sessão:
> devtools::session_info("mgcv")
Session info
-----------------------------------------------------------------------------------
setting value
version R version 3.3.1 (2016-06-21)
system x86_64, linux-gnu
ui RStudio (0.99.491)
language en_US
collate en_US.UTF-8
tz <NA>
date 2016-09-13
Packages ---------------------------------------------------------------------------------------
package * version date source
lattice 0.20-33 2015-07-14 CRAN (R 3.2.1)
Matrix 1.2-6 2016-05-02 CRAN (R 3.3.0)
mgcv * 1.8-12 2016-03-03 CRAN (R 3.2.3)
nlme * 3.1-128 2016-05-10 CRAN (R 3.3.1)
r
gam
mgcv
conditional-probability
mixed-model
references
bayesian
estimation
conditional-probability
machine-learning
optimization
gradient-descent
r
hypothesis-testing
wilcoxon-mann-whitney
time-series
bayesian
inference
change-point
time-series
anova
repeated-measures
statistical-significance
bayesian
contingency-tables
regression
prediction
quantiles
classification
auc
k-means
scikit-learn
regression
spatial
circular-statistics
t-test
effect-size
cohens-d
r
cross-validation
feature-selection
caret
machine-learning
modeling
python
optimization
frequentist
correlation
sample-size
normalization
group-differences
heteroscedasticity
independence
generalized-least-squares
lme4-nlme
references
mcmc
metropolis-hastings
optimization
r
logistic
feature-selection
separation
clustering
k-means
normal-distribution
gaussian-mixture
kullback-leibler
java
spark-mllib
data-visualization
categorical-data
barplot
hypothesis-testing
statistical-significance
chi-squared
type-i-and-ii-errors
pca
scikit-learn
conditional-expectation
statistical-significance
meta-analysis
intuition
r
time-series
multivariate-analysis
garch
machine-learning
classification
data-mining
missing-data
cart
regression
cross-validation
matrix-decomposition
categorical-data
repeated-measures
chi-squared
assumptions
contingency-tables
prediction
binary-data
trend
test-for-trend
matrix-inverse
anova
categorical-data
regression-coefficients
standard-error
r
distributions
exponential
interarrival-time
copula
log-likelihood
time-series
forecasting
prediction-interval
mean
standard-error
meta-analysis
meta-regression
network-meta-analysis
systematic-review
normal-distribution
multiple-regression
generalized-linear-model
poisson-distribution
poisson-regression
r
sas
cohens-kappa
jvh_ch
fonte
fonte
Respostas:
Estes são superficialmente o mesmo modelo, mas na prática, quando ajustados, existem algumas diferenças sutis. Uma diferença importante é que o modelo com
ti()
termos está estimando mais parâmetros de suavidade em comparação com ote()
modelo:e isso ocorre porque existem mais matrizes de penalidade associadas aos dois modelos; no
ti()
modelo, temos um por "termo" em comparação com apenas dois note()
modelo, um por margem marginal.ti()
te()
ti()
te()
s()
Observe que você pode aproximar os modelos um do outro ajustando usando
method = "ML"
(ou"REML"
, mas você não deve comparar efeitos "fixos" com, a"REML"
menos que todos os termos sejam totalmente penalizados, o que, por padrão, eles não são, mas diria comselect = TRUE
).fonte