2017-01-18 2 views
2

J'essaie d'utiliser R caret pour effectuer une validation croisée de mes modèles de régression linéaire. Dans certains cas, je veux forcer l'interception à 0. J'ai essayé ce qui suit, en utilisant la syntaxe standard lm:En utilisant la régression linéaire (lm) dans R caret, comment forcer l'ordonnée à 0?

regressControl <- trainControl(method="repeatedcv", 
         number = 4, 
         repeats = 5 
         )      

regress   <- train(y ~ 0 + x, 
       data = myData, 
       method = "lm", 
       trControl = regressControl) 

Call: 
lm(formula = .outcome ~ ., data = dat) 

Coefficients: 
(Intercept)  x 
-0.0009585 0.0033794 ` 

Cette syntaxe semble fonctionner avec la fonction standard « lm », mais pas dans le paquet caret. Aucune suggestion?

test <- lm(y ~ 0 + x, 
     data = myData) 


Call: 
lm(formula = y ~ 0 + x, data = myData) 

Coefficients: 
x 
0.003079 
+1

Je crois que vous voulez que la formule 'y ~ -1 + x' exclue explicitement l'interception. – aichao

+0

@aichao Les deux fonctionnent dans la plupart des fonctions, mais l'implémentation de 'caret' rend difficile l'édition du code source. – Chrisss

+0

@Chrisss: merci! bon à savoir. – aichao

Répondre

1

Vous pouvez profiter du paramètre tuneGrid dans caret::train.

regressControl <- trainControl(method="repeatedcv", 
        number = 4, 
        repeats = 5 
        ) 

regress <- train(mpg ~ hp, 
      data = mtcars, 
      method = "lm", 
      trControl = regressControl, 
      tuneGrid = expand.grid(intercept = FALSE)) 

Utilisez getModelInfo("lm", regex = TRUE)[[1]]$param pour voir toutes les choses que vous auriez pu retouchés dans tuneGrid (dans le cas du film, le seul paramètre de réglage est l'intersection). Il est stupide que vous ne pouvez pas simplement compter sur la syntaxe formula, mais hélas.

+0

Cela semble fonctionner. Je vous remercie. (J'ai également essayé d'utiliser «trace» pour modifier la formule, mais sans succès - http://stackoverflow.com/questions/12394855/fit-a-no-intercept-model-in-caret) –

+0

@SarahM Je crois que le Le code source de 'caret' a changé depuis que la réponse de trace a été faite, donc ce ne serait plus approprié. – Chrisss

+0

@SarahM Vous devriez accepter ceci comme réponse. c'est bon au moins caret v6.0.76 –