13 votes

Ajustement d'une fonction dans R

J'ai quelques points de données (x et y) qui semblent avoir une relation logarithmique.

> mydata
    x   y
1   0 123
2   2 116
3   4 113
4  15 100
5  48  87
6  75  84
7 122  77

> qplot(x, y, data=mydata, geom="line")

plot

J'aimerais maintenant trouver une fonction sous-jacente qui corresponde au graphique et me permette de déduire d'autres points de données (par ex. 3 o 82 ). J'ai lu à propos de lm y nls mais je n'arrive à rien.

Dans un premier temps, j'ai créé une fonction dont je pensais qu'elle ressemblait le plus à l'intrigue :

f <- function(x, a, b) {
    a * exp(b *-x)
}
x <- seq(0:100)
y <- f(seq(0:100), 1,1)
qplot(x,y, geom="line")

plot2

Ensuite, j'ai essayé de générer un modèle adapté à l'aide de nls :

> fit <- nls(y ~ f(x, a, b), data=mydata, start=list(a=1, b=1))
   Error in numericDeriv(form[[3]], names(ind), env) :
   Missing value or an Infinity produced when evaluating the model

Quelqu'un peut-il m'indiquer la marche à suivre ?

Suivi

Après avoir lu vos commentaires et fait quelques recherches, j'ai ajusté les paramètres de départ pour a , b y c et soudain le modèle a convergé.

fit <- nls(y~f(x,a,b,c), data=data.frame(mydata), start=list(a=1, b=30, c=-0.3))
x <- seq(0,120)
fitted.data <- data.frame(x=x, y=predict(fit, list(x=x))
ggplot(mydata, aes(x, y)) + geom_point(color="red", alpha=.5) + geom_line(alpha=.5) + geom_line(data=fitted.data)

plot3

10voto

Jilber Points 22709

Vous pourriez utiliser une spécification cubique pour votre modèle et l'estimer via lm vous conviendrait parfaitement.

# Importing your data
dataset <- read.table(text='
    x   y
1   0 123
2   2 116
3   4 113
4  15 100
5  48  87
6  75  84
7 122  77', header=T)

# I think one possible specification would be a cubic linear model
y.hat <- predict(lm(y~x+I(x^2)+I(x^3), data=dataset)) # estimating the model and obtaining the fitted values from the model

qplot(x, y, data=dataset, geom="line") # your plot black lines
last_plot() + geom_line(aes(x=x, y=y.hat), col=2) # the fitted values red lines

# It fits good.

enter image description here

3voto

seancarmody Points 3148

Essayez de prendre le logarithme de votre variable de réponse et utilisez ensuite lm pour ajuster un modèle linéaire :

fit <- lm(log(y) ~ x, data=mydata)

Le R au carré ajusté est de 0,8486, ce qui, à première vue, n'est pas mauvais. Vous pouvez examiner l'ajustement à l'aide d'un graphique, par exemple :

plot(fit, which=2)

Mais peut-être n'est-ce pas la bonne solution après tout :

last_plot() + geom_line(aes(x=x, y=exp(fit$fitted.values)))

2voto

emre Points 184

Consultez ce document : http://cran.r-project.org/doc/contrib/Ricci-distributions-en.pdf

En bref, vous devez d'abord décider du modèle à adapter à vos données (par exemple, exponentiel), puis estimer ses paramètres.

Voici quelques distributions largement utilisées : http://www.itl.nist.gov/div898/handbook/eda/section3/eda366.htm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X