web-dev-qa-db-fra.com

Erreur dans terms.formula (formule): '.' dans la formule et pas d'argument «données»

Je suis sur le point d'utiliser Neuralnet pour la prédiction.

Créez des X:

x <- cbind(seq(1, 50, 1), seq(51, 100, 1))

Créer Y:

y <- x[,1]*x[,2]

Donnez-leur un nom

colnames(x) <- c('x1', 'x2')
names(y) <- 'y'

Créez data.frame:

dt <- data.frame(x, y)

Et maintenant, j'ai une erreur

model <- neuralnet(y~., dt, hidden=10, threshold=0.01)

erreur dans terms.formula (formule): '.' dans la formule et pas d'argument "données"

Par exemple, en lm (modèle linéaire), cela fonctionne.

26
luckyi

Comme mon commentaire l'indique, cela ressemble à un bogue dans la fonction non exportée neuralnet:::generate.initial.variables. Pour contourner le problème, créez simplement une longue formule à partir des noms de dt, à l'exclusion de y, par exemple.

n <- names(dt)
f <- as.formula(paste("y ~", paste(n[!n %in% "y"], collapse = " + ")))
f

## gives
> f
y ~ x1 + x2

## fit model using `f`
model <- neuralnet(f, data = dt, hidden=10, threshold=0.01)

> model
Call: neuralnet(formula = f, data = dt, hidden = 10, threshold = 0.01)

1 repetition was calculated.

        Error Reached Threshold Steps
1 53975276.25     0.00857558698  1967
45
Gavin Simpson

En proposant une alternative plus simple à la réponse précédente, vous pouvez créer une formule à partir des noms de dt à l'aide de reformulate():

f <- reformulate(setdiff(colnames(dt), "y"), response="y")

reformulate() ne nécessite pas l'utilisation de paste() et ajoute automatiquement les termes ensemble.

6
Megatron