使用R使用特定方程式将曲线拟合到数据集 [英] Using R to fit a curve to a dataset using a specific equation

查看:151
本文介绍了使用R使用特定方程式将曲线拟合到数据集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用R. 我想使用一个特定的方程将一条曲线拟合到我的一组数据中(附加)

I am using R. I would like to use a specific equation to fit a curve to one of my data sets (attached)

> dput(data)
structure(list(Gossypol = c(1036.331811, 4171.427741, 6039.995102, 
5909.068158, 4140.242559, 4854.985845, 6982.035521, 6132.876396, 
948.2418407, 3618.448997, 3130.376482, 5113.942098, 1180.171957, 
1500.863038, 4576.787021, 5629.979049, 3378.151945, 3589.187889, 
2508.417927, 1989.576826, 5972.926124, 2867.610671, 450.7205451, 
1120.955, 3470.09352, 3575.043632, 2952.931863, 349.0864019, 
1013.807628, 910.8879471, 3743.331903, 3350.203452, 592.3403778, 
1517.045807, 1504.491931, 3736.144027, 2818.419785, 723.885643, 
1782.864308, 1414.161257, 3723.629772, 3747.076592, 2005.919344, 
4198.569251, 2228.522959, 3322.115942, 4274.324792, 720.9785449, 
2874.651764, 2287.228752, 5654.858696, 1247.806111, 1247.806111, 
2547.326207, 2608.716056, 1079.846532), Treatment = structure(c(2L, 
3L, 4L, 5L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 5L, 1L, 2L, 3L, 4L, 5L, 
1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 
2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 
3L, 4L, 5L, 1L, 2L, 3L, 1L), .Label = c("C", "1c_2d", "3c_2d", 
"9c_2d", "1c_7d"), class = "factor"), Damage_cm = c(0.4955, 1.516, 
4.409, 3.2665, 0.491, 2.3035, 3.51, 1.8115, 0, 0.4435, 1.573, 
1.8595, 0, 0.142, 2.171, 4.023, 4.9835, 0, 0.6925, 1.989, 5.683, 
3.547, 0, 0.756, 2.129, 9.437, 3.211, 0, 0.578, 2.966, 4.7245, 
1.8185, 0, 1.0475, 1.62, 5.568, 9.7455, 0, 0.8295, 2.411, 7.272, 
4.516, 0, 0.4035, 2.974, 8.043, 4.809, 0, 0.6965, 1.313, 5.681, 
3.474, 0, 0.5895, 2.559, 0)), .Names = c("Gossypol", "Treatment", 
"Damage_cm"), row.names = c(NA, -56L), class = "data.frame")

等式为:y~yo+a*(1-b^x) 在哪里: y = Gossypol(来自我的数据集) x = Damage_cm(根据我的数据集)

The equation is: y~yo+a*(1-b^x) Where: y = Gossypol (from my data set) x = Damage_cm (from my data set)

其他3个参数未知: yo = Intercepta = asymptoteb = slope

The other 3 parameters are unknown: yo = Intercept, a = asymptote and b = slope

我想我必须使用软件包nls2.到目前为止,我编写了以下代码:

I guess I have to use the package nls2. So far I wrote the following code:

data<-read.csv("Regression_exp2.csv",header=T, sep = ",")
library(nls2)
attach(data)
m<-nls(Gossypol~Y+A*(1-B^Damage_cm),data=data,start = list(Y=1700,A=4000,B=1))

这给了我错误消息:

nlsModel(formula,mf,start,wts)中的错误:奇异梯度矩阵 在初始参数估计时

Error in nlsModel(formula, mf, start, wts): singular gradient matrix at initial parameter estimates

最后,我想使用该方程式绘制一条曲线(具有SE间隔,我通常使用ggplot2)

In the end I would like to use the equation to plot a curve (with SE interval, I usually use ggplot2)

此外,我想知道R2和p值. 我也会对参数yoab

Furthermore, I would like to know the R2 and p value. I would also be interested in the parameters yo , a and b

我以前从未做过此事,如果有人可以帮助我或提示我如何在R中执行此操作,我将不胜感激.我想我必须使用非线性方法(glm(...))

I have never done this before and would be extremely grateful if anyone could help me or give me a hint how to do this in R? I suppose I have to use a non linear approach (glm(...))

非常感谢, 迈克

推荐答案

您必须稍微调整一下起始值:

You have to adjust your starting values a bit:

> data
    Gossypol Treatment Damage_cm
1  1036.3318     1c_2d    0.4955
2  4171.4277     3c_2d    1.5160
3  6039.9951     9c_2d    4.4090
4  5909.0682     1c_7d    3.2665
5  4140.2426     1c_2d    0.4910
...
54 2547.3262     1c_2d    0.5895
55 2608.7161     3c_2d    2.5590
56 1079.8465         C    0.0000

然后您可以致电:

m<-nls(data$Gossypol~Y+A*(1-B^data$Damage_cm),data=data,start = list(Y=1000,A=3000,B=0.5))

打印m可为您提供:

> m
Nonlinear regression model
  model: data$Gossypol ~ Y + A * (1 - B^data$Damage_cm)
   data: data
        Y         A         B 
1303.4450 2796.0385    0.4939 
 residual sum-of-squares: 1.03e+08

现在,您可以根据适合度获取数据:

Now you can get the data based on the fit:

fitData <- 1303.4450 + 2796.0385*(1-0.4939^data$Damage_cm)

绘制数据以比较拟合度和原始数据:

Plot the data to compare the fit and the original data:

plot(data$Damage_cm, data$Gossypol, col='black')
par(new=T)
plot(data$Damage_cm,fitData, col='red', ylim=c(0,8000), axes=F, ylab='')

为您提供:

如果要使用nls2,请确保已安装,如果没有,则可以使用

If you want to use nls2 make sure it is installed and if not you can use

install.packages('nls2')

这样做.

library(nls2)
m2<-nls2(data$Gossypol~Y+A*(1-B^data$Damage_cm),data=data,start = list(Y=1000,A=3000,B=0.5))

为您提供与nls相同的值:

> m2
Nonlinear regression model
  model: data$Gossypol ~ Y + A * (1 - B^data$Damage_cm)
   data: structure(list(Gossypol = c(1036.331811, 4171.427741, 6039.995102, 5909.068158, 4140.242559, 4854.985845, 6982.035521, 6132.876396, 948.2418407, 3618.448997, 3130.376482, 5113.942098, 1180.171957, 1500.863038, 4576.787021, 5629.979049, 3378.151945, 3589.187889, 2508.417927, 1989.576826, 5972.926124, 2867.610671, 450.7205451, 1120.955, 3470.09352, 3575.043632, 2952.931863, 349.0864019, 1013.807628, 910.8879471, 3743.331903, 3350.203452, 592.3403778, 1517.045807, 1504.491931, 3736.144027, 2818.419785, 723.885643, 1782.864308, 1414.161257, 3723.629772, 3747.076592, 2005.919344, 4198.569251, 2228.522959, 3322.115942, 4274.324792, 720.9785449, 2874.651764, 2287.228752, 5654.858696, 1247.806111, 1247.806111, 2547.326207, 2608.716056, 1079.846532), Treatment = structure(c(2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 1L), .Label = c("C", "1c_2d", "3c_2d", "9c_2d", "1c_7d"), class = "factor"), Damage_cm = c(0.4955, 1.516, 4.409, 3.2665, 0.491, 2.3035, 3.51, 1.8115, 0, 0.4435, 1.573, 1.8595, 0, 0.142, 2.171, 4.023, 4.9835, 0, 0.6925, 1.989, 5.683, 3.547, 0, 0.756, 2.129, 9.437, 3.211, 0, 0.578, 2.966, 4.7245, 1.8185, 0, 1.0475, 1.62, 5.568, 9.7455, 0, 0.8295, 2.411, 7.272, 4.516, 0, 0.4035, 2.974, 8.043, 4.809, 0, 0.6965, 1.313, 5.681, 3.474, 0, 0.5895, 2.559, 0)), .Names = c("Gossypol", "Treatment", "Damage_cm"), row.names = c(NA, -56L), class = "data.frame")
        Y         A         B 
1303.4450 2796.0385    0.4939 
 residual sum-of-squares: 1.03e+08

Number of iterations to convergence: 2 
Achieved convergence tolerance: 4.936e-06

如果您喜欢ggplot2:

ggplot(data, aes(x = Damage_cm, y = Gossypol)) +
     geom_point() +
     geom_smooth(method = "nls",
                 formula = y ~ Y + A * (1 - B^x),
                 start = c(Y=1000, A=3000, B=0.5), se = F)

尽管我担心标准错误必须在ggplot之外进行模拟.

Though I'm afraid the standard errors would have to be simulated outside of ggplot.

这篇关于使用R使用特定方程式将曲线拟合到数据集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆