Modérateur : Groupe des modérateurs
Voila je suis en stage et je dois trouver un moyen d'inclure un script dans la fonction nls (en particulier lui donner un paramètre sous forme de deux vecteurs)
Code : Tout sélectionner
rndvalues <- 21
set.seed(rndvalues)
x1 <- rnorm(20,5,6)
set.seed(rndvalues^2)
x2 <- rnorm(20,9,4)
set.seed(rndvalues^3)
y <- 3+7*x1/exp(2*x2)+rnorm(20)
nls1 <- nls(y~ a+b*x1/exp(c*x2),start=list(a=1,b=6,c=3))
nls1
Code : Tout sélectionner
x <- rnorm(100)
y <- 3*x+2+rnorm(100)
X <- data.frame(resp=y,exp=x)
file <- "nls.txt"
ted <- function(resp,exp,c,d){
source(file,local=TRUE) # chargement du script avec ici a <- 10 et b <- 5
pred <- c+d*exp+a-b
(resp-pred)
}
nls(~ted(resp,exp,c,d),data=X,start= list(c=0,d=0))
Nonlinear regression model
model: 0 ~ ted(resp, exp, c, d)
data: X
c d
-2.999 3.017
residual sum-of-squares: 93.08
lm(I(resp-5)~exp,data=X)
Call:
lm(formula = I(resp - 5) ~ exp, data = X)
Coefficients:
(Intercept) exp
-2.999 3.017
oui je sais, moi aussi je connais bien cette fonction
mais en fait en gros il faut que je fasse une régression avec nls mais nls doit minimiser le log de la vraisemblance pour estimer les parametres.
Mais pour en revenir a ma question, est-il possible (par un moyen ou un autre) d'intégrer un petit script a la fonction nls ?
Code : Tout sélectionner
require(ade4)
?dudi.pca
data(deug)
deug.dudi <- dudi.pca(deug$tab, center = deug$cent, scale = FALSE, scan = FALSE)
par(mfrow = c(2,2))
s.class(deug.dudi$li, deug$result, cpoint = 1)
f1 <- function(x) sum((x-mean(x))^2)/length(x)
Code : Tout sélectionner
as.formula("y~b*var1+a*exp(var2)")
Code : Tout sélectionner
#### la "-" log vraissemblance
# y la réponse
# X ton tableau des variables environnementales que tu veux utiliser
# betas qui sera estimé est le vecteur des paramètres
lnvrai3 <- function(y,X,betas){
betas <- matrix(betas,nrow=1)
X <- cbind(1,X)
X <- t(X)
if (nrow(X)!=ncol(betas))
stop("pas le même nombre de variables que de paramètres")
-1*(sum(-exp(betas%*%X))+sum(y*(betas%*%X))-sum(log(factorial(y))))
}
x <- rnorm(100)
test <- rpois(100,exp(3+0.025*x))
# estimation des paramètres :
nlm1 <- nlm(lnvrai3,c(1.1,1.1),y=test,X=x,gradtol=1e-8,hessian=TRUE)
nlm1
$minimum
[1] 285.949
$estimate
[1] 2.98792327 0.01163476
$gradient
[1] 1.598049e-05 -1.273293e-05
$hessian
[,1] [,2]
[1,] 1987.5909 231.2939
[2,] 231.2939 2000.6188
$code
[1] 2
$iterations
[1] 9
# comparaison avec un glm
glm1 <- glm(test~x,family=poisson())
glm1
Call: glm(formula = test ~ x, family = poisson())
Coefficients:
(Intercept) x #### très proche des estimations de nlm1
2.98792 0.01164
Degrees of Freedom: 99 Total (i.e. Null); 98 Residual
Null Deviance: 90.92
Residual Deviance: 90.65 AIC: 575.9
logLik(glm1)
'log Lik.' -285.949 (df=2) # tu retrouves le minimum de nlm1
Retourner vers « Questions en cours »
Utilisateurs parcourant ce forum : Google [Bot] et 1 invité