在R中拟合函数 [英] Fitting a function in R
问题描述
我有几个似乎具有对数关系的数据点(x和y).
I have a few datapoints (x and y) that seem to have a logarithmic relationship.
> 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")
现在,我想找到一个适合图形的基础函数,并允许我推断其他数据点(即3
或82
).我读到有关lm
和nls
的信息,但我真的什么也没得到.
Now I would like to find an underlying function that fits the graph and allows me to infer other datapoints (i.e. 3
or 82
). I read about lm
and nls
but I'm not getting anywhere really.
首先,我创建了一个函数,我认为它最类似于该图:
At first, I created a function of which I thought it resembled the plot the most:
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")
然后,我尝试使用nls
生成拟合模型:
Afterwards, I tried to generate a fitting model using 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
有人可以为我指出从这里做什么的正确方向吗?
Can someone point me in the right direction on what to do from here?
关注
在阅读您的评论并进一步搜索之后,我调整了a
,b
和c
的起始参数,然后突然收敛了模型.
After reading your comments and googling around a bit further I adjusted the starting parameters for a
, b
and c
and then suddenly the model converged.
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)
推荐答案
也许对您的模型使用三次规格,并通过lm
进行估算将非常适合您.
Maybe using a cubic specification for your model and estimating via lm
would give you a good fit.
# 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.
这篇关于在R中拟合函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!