在 R 中拟合函数

Posted

技术标签:

【中文标题】在 R 中拟合函数【英文标题】:Fitting a function in R 【发布时间】:2012-08-04 09:11:10 【问题描述】:

我有几个似乎具有对数关系的数据点(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")

现在我想找到一个适合该图的基础函数,并允许我推断其他数据点(即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")

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

有人能指出我从这里做什么的正确方向吗?

跟进

在阅读了您的 cmets 并进一步搜索后,我调整了 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)

【问题讨论】:

我认为正确的指向你的地方是统计 101 课程。你至少可以通过lm向我们展示你的努力。 我建议您阅读 R 手册:在您的 RConsole 中输入 ?lm?nls?formula 抱歉我的懒惰 - 我现在有点沮丧。我添加了我对nls 执行的步骤以及它产生的错误。 我知道这是一个老问题,但你们每个人都试过使用lm(y ~ poly(x, 3), data = mydata) 吗?可以尝试不同次数的多项式,并使用anova 比较lm 的结果。 请编辑您的问题 - 您现在指的是未定义的 f(x,a,b,c)。它是什么?你只有f(x,a,b) 【参考方案1】:

也许对您的模型使用三次规格并通过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.

【讨论】:

【参考方案2】:

尝试记录您的响应变量,然后使用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)))

【讨论】:

使用登录响应变量意味着什么? 只是 OP 怀疑存在对数关系,因此拟合 x ~ log(y) 的线性模型是一种快速检查方法。【参考方案3】:

查看此文档:http://cran.r-project.org/doc/contrib/Ricci-distributions-en.pdf

简而言之,首先您需要确定模型以适合您的数据(例如指数),然后估计其参数。

以下是一些广泛使用的发行版: http://www.itl.nist.gov/div898/handbook/eda/section3/eda366.htm

【讨论】:

以上是关于在 R 中拟合函数的主要内容,如果未能解决你的问题,请参考以下文章

excel曲线拟合中的决定系数R平方是如何求出来的?

R语言使用lm函数拟合回归模型(简单线性回归一元回归simple regression)并解读拟合模型

r语言多个gam拟合图怎么放在 一个坐标里

R语言使用lm函数拟合回归模型(简单线性回归一元回归simple regression)并解读拟合模型

MATLAB如何选择合适的拟合函数?

怎么通过一组数据拟合出总体分布