我有一些似乎具有对数关系的数据点(x和y)。
> 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
的内容,但我并没有真正到达任何地方。
起初,我创建了一个功能,我认为它最像是情节:
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
:
> 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
有人能指出我在这方面做什么的正确方向吗?
跟进
在阅读了您的评论并进行了大量搜索后,我调整了a
,b
和c
的起始参数,然后突然模型收敛了。
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)
答案 0 :(得分:9)
也许为您的模型使用立方规格并通过lm
进行估算会让您感觉非常合适。
# 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.
答案 1 :(得分:3)
尝试获取响应变量的日志,然后使用lm
拟合线性模型:
fit <- lm(log(y) ~ x, data=mydata)
调整后的R平方为0.8486,面值不差。您可以使用绘图来查看拟合,例如:
plot(fit, which=2)
但也许,它毕竟不是很合适:
last_plot() + geom_line(aes(x=x, y=exp(fit$fitted.values)))
答案 2 :(得分:1)
请查看此文档:http://cran.r-project.org/doc/contrib/Ricci-distributions-en.pdf
简而言之,首先您需要决定模型以适应您的数据(例如,指数),然后估计其参数。
以下是一些广泛使用的发行版: http://www.itl.nist.gov/div898/handbook/eda/section3/eda366.htm