Ce que j'essaie de faire est de faire une régression non linéaire en utilisant des sous-modèles possibles de mon modèle complet, puis de choisir le modèle le plus approprié en utilisant AIC critère. Le problème est de générer tous les sous-modèles possibles, puis de les appliquer à la fonction nls
pour trouver le meilleur ajustement.R: fonctions générées par une fonction d'ajustement non linéaire - comment spécifier un ensemble de paramètres
Disons que j'ai données:
x <- rnorm(100)
y <- 1+x+x^2-x^3-x^4+rnorm(100, sd=0.1)
Et la formule complète en fonction de la x
variable et certains paramètres a
, b
, c
, d
, e
:
full <- function(x, a, b, c, d, e){
return(a + b*x + c*x^2 + d*x^3 + e*x^4)
}
(I sachez qu'il s'agit d'un exemple stupide de modèle non linéaire et que je pourrais utiliser la transformation de données + modèle linéaire pour cela, mais je veux que ce soit simple)
Je souhaite générer tous les sous-modèles possibles, en ignorant certains paramètres. J'ai essayé de simplement mettre les sautée paramètres à zéro:
skip <- function(args){
# args = subset of c("a", "b", "c", "d", "e")
return (function(x, a=0, b=0, c=0, d=0, e=0) {
par <- c("a", "b", "c", "d", "e")
parameters <- lapply(par, function(p){
if(p %in% args){
return (0)
}
else{
return (get(p))
}
})
names(parameters) <- c("a", "b", "c", "d", "e")
return (with(parameters, a + b*x + c*x^2 + d*x^3 + e*x^4))
})
}
Et j'écrire une fonction pour appliquer ces formules à nls
:
apply_nls <- function(func, start){
fit <- nls(y~func(x, a, b, c, d, e),
start=start)
return(fit)
}
Le problème est que cela ne fonctionne pas. Si je spécifier la valeur de départ pour les paramètres ommited:
apply_nls(skip("e"), start=list(a=1, b=1, c=1, d=-1, e=-1))
je reçu un message d'erreur
matrice gradient singulier au paramètre initial estime
(parce qu'en effet, ma fonction ne ne dépend pas du paramètre e
).
Mais quand je ne spécifie pas les valeurs de départ pour b
et d
(je devrais être capable de le faire, parce que je spécifié les Vales par défaut de ces paramètres à l'intérieur skip
):
apply_nls(skip("e"), start=list(a=1, b=1, c=1, d=-1))
Je suis une autre erreur message:
paramètres sans valeur à partir de 'données': e
Je suppose que je devrais limiter les paramètres skip
et/ou dans apply_nls
fonctions afin qu'ils ne prennent que les paramètres dont j'ai besoin à ce moment-là, comme:
apply_nls <- function(func, args, start){
fit <- nls(y~func(x, args),
start=start)
return(fit)
}
Mais cela ne fonctionne pas et je ne sais pas comment correctement Mettre en œuvre.
Votre exemple de modèle est entièrement linéaire dans ses paramètres. Veuillez fournir un exemple de modèle réellement non linéaire. – Roland
Nous avons besoin d'un exemple représentatif. Il n'est pas évident de définir les sous-modèles d'une fonction réellement non linéaire. – Roland
Mon modèle réel est en fait linéaire à la plupart des variables et exponentiel à un: 'a + b * exp (c * x1) + d * x2 + ....' et je prends des sous-modèles contenant cette partie non linéaire 'b * exp (c * x1) 'et simplifiant les termes linéaires. –