2014-09-25 160 views
1

我是R(第一次使用它)的新手。我正在按照本教程http://www.walkingrandomly.com/?p=5254试图绘制曲线并发现最适合我的数据的函数。到目前为止,我已经tryed:R中的非线性最小二乘曲线拟合

> xdata = c(1 ,5, 10, 20, 100) 
> ydata = c(23.83333333, 210.3666667, 545.3666667, 1756.866667, 38595.7) 
> plot(xdata,ydata) 

所以我得到这样的:

enter image description here

然后我尝试:

> p1 = 1 
> p2 = 0.2 
> fit = nls(ydata ~ xdata^2, start=list(p1=p1,p2=p2)) 

而且我得到这个错误:

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

我在做什么NG? 谢谢

回答

7

nls功能不会自动包含所有模型中的参数等系数。你必须明确地将它们包含在公式中。我不完全知道你在哪里想p1p2从你的描述

p1 <- 1 
p2 <- 0.2 
fit <- nls(ydata ~ p1+p2*xdata^2, start=list(p1=p1,p2=p2)) 
fit 

# Nonlinear regression model 
# model: ydata ~ p1 + p2 * xdata^2 
# data: parent.frame() 
#  p1  p2 
# 127.216 3.847 
# residual sum-of-squares: 21037 
# 
# Number of iterations to convergence: 1 
# Achieved convergence tolerance: 5.774e-08 

被包括在模型中,但至少在这个形式的这仍然是一个线性模型。你可以得到相同的契合

fit2 <- lm(ydata ~ I(xdata^2)) 
fit2 

# Call: 
# lm(formula = ydata ~ I(xdata^2)) 
# 
# Coefficients: 
# (Intercept) I(xdata^2) 
#  127.216  3.847 
+0

如何绘制曲线? – fredcrs 2014-09-25 19:47:15

+2

绘图是一个完全独立的问题。但是如果你有一个合适的模型('fit'或'fit2'),你可以使用'xs <-seq(min(xdata),max(xdata),length.out = 100);情节(XDATA,YDATA);行(xs,predict(fit,data.frame(xdata = xs)))'。 – MrFlick 2014-09-25 19:51:20

+1

拟合值已经在拟合对象中:'fit(fit)'或'fit $ m $ fitted'。如果您提供的是新数据参数,则只需要使用预测。 – 2014-09-25 20:01:22

4

您的公式中没有参数。你需要将它们包括但您认为合适的:

nls(ydata ~ p1 * xdata^2 + p2, start=list(p1=p1,p2=p2)) 
6

为了完整起见,你可以包括阅兵式O解决方案ggplot2框架内,以获得平滑的解决方案的情节和检查结果的图形:

library(ggplot2) 
ggplot(dat,aes(x=xdata,y=ydata)) + 
    geom_point() + 
    geom_smooth(method="nls", formula=y ~ p1+p2*x^2, se=FALSE, 
       start=list(p1=p1,p2=p2)) 

enter image description here

+1

@fredcrs你要去那里的朋友圈 – 2014-09-25 20:35:40

+0

你可以在R studio中使用R markdown来编织HTML或Word,它会将所有代码及其输出与图一起打印出来 – technOslerphile 2014-09-26 01:27:53