在R中拟合函数

14

我有一些数据点(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")

plot

现在我想找到与图像相适应的基本函数,并允许我推断出其他数据点(例如382)。我尝试使用 lmnls,但是没有取得实质性进展。

首先,我创建了一个函数,我认为它最像这个图:

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

然后,我尝试使用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

有人能指点我接下来该怎么做吗?

跟进

在阅读了您的评论并进行了一些谷歌搜索后,我调整了abc的起始参数,然后突然之间模型收敛了。

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


2
我认为指向统计学101课程是正确的方向。你至少可以展示一下你在lm方面的努力。 - Spacedman
1
我建议您阅读R手册:在您的R控制台中键入“?lm”、“?nls”和“?formula”。 - Pop
抱歉我的懒惰-我现在有点沮丧。我添加了我使用nls的步骤和它产生的错误。 - jnns
我知道这是一个老问题,但你有没有尝试使用 lm(y ~ poly(x, 3), data = mydata)?可以尝试不同次数的多项式,并使用 anova 比较 lm 的结果。 - steveb
请编辑您的问题 - 您现在引用了未定义的 f(x,a,b,c)。它是什么?您只有 f(x,a,b) - IVIM
3个回答

11
也许对于您的模型,使用立方规格化并通过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.

enter image description here


4
尝试对您的响应变量取对数,然后使用lm拟合线性模型:
fit <- lm(log(y) ~ x, data=mydata)

调整后的R平方为0.8486,表面上看起来还不错。您可以使用plot查看拟合情况,例如:
plot(fit, which=2)

也许,这并不是一个很好的匹配:
last_plot() + geom_line(aes(x=x, y=exp(fit$fitted.values)))

使用对数转换响应变量有什么影响? - Herman Toothrot
简单来说,原帖的作者怀疑存在对数关系,因此拟合一个 x ~ log(y) 的线性模型是一种快速检查的方法。 - seancarmody

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接