首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中散点图的回归直线和拟合曲线

R中散点图的回归直线和拟合曲线
EN

Stack Overflow用户
提问于 2014-07-05 16:07:57
回答 3查看 3.2K关注 0票数 2

我有一组树木的高度和直径的数据。我想找出它们之间的回归关系,并绘制出来。例如,我想尝试a * DIAMETER + b * DIAMETER^2 + C,并以散点图的形式显示其曲线。通过下面的说明,我达到了几条线,但我只想要一条与开发模型相关的趋势线。我该怎么办?

代码语言:javascript
复制
setwd('D:\\PhD\\Data\\Field Measurments\\Data Analysis\\')

dat1 = read.table('Fagus.csv', header = TRUE, sep =',')


# fit a non-linear regression

Height = dat1$Height

Diameter = dat1$Diameter 

plot(Diameter, Height, main="Height Curve", xlab="Diameter", ylab="Height", pch=19)

nls1 <- nls(Height ~ a*(Diameter)^2+b*Diameter+c, data = dat1, start = list(a =a, b=b,c=c), algorithm="port")

lines(fitted(nls1) ~ Diameter, lty = 1, col = "red") # solid red line

上面的说明对我来说是错误的吗?

EN

回答 3

Stack Overflow用户

发布于 2014-07-05 18:38:08

如上所述,您不应该将系数放入您的公式中。尝试:

代码语言:javascript
复制
nls1 <- nls(Height ~ I(Diameter^2) + Diameter, data = dat1,  algorithm="port")

关于I(Diameter ^2)

“为了避免这种混淆,可以使用函数I()将模型公式中运算符在算术意义上使用的部分括起来。例如,在公式y ~ a + I(b+c)中,术语b+c应解释为b和c的和。”~ formula{stats}文档

我没有运行剩下的部分(在移动设备上),但是你的代码乍一看看起来还不错。

票数 1
EN

Stack Overflow用户

发布于 2014-07-06 03:30:16

这里似乎对线性模型和非线性模型存在误解。线性模型的系数是线性的。非线性模型则不是。模型在预测变量(在你的例子中是直径)中是否是线性的是无关的。因此,在您的示例中,是表单的模型:

高度=a*直径+b*直径^2+c

是一个线性模型。您不需要使用nls(...)。您可以通过两种方法之一指定模型公式,这两种方法都会产生相同的结果:

代码语言:javascript
复制
Height~Diameter + I(Diameter^2)

代码语言:javascript
复制
Height~poly(Diameter,2,raw=TRUE)

第二种形式使用poly(...)函数创建2阶多项式。raw=T告诉poly(...)生成原始多项式,而不是正交多项式(默认)。第一种形式比较简单,除非你想要阶数大于2的多项式。下面是一个使用这两种形式的例子。

代码语言:javascript
复制
set.seed(1)    # for reproducible example
df <- data.frame(Diameter=sample(1:50,50))
df$Height <- with(df,2*Diameter + .5*Diameter^2 + 4 + rnorm(50,sd=30))

fit <- lm(Height~Diameter + I(Diameter^2),df)
summary(fit)
# ...
# Coefficients:
#               Estimate Std. Error t value Pr(>|t|)    
# (Intercept)   -6.85088   12.26720  -0.558  0.57917    
# Diameter       3.31030    1.10964   2.983  0.00451 ** 
# I(Diameter^2)  0.47717    0.02109  22.622  < 2e-16 ***

fit.poly<- lm(Height~poly(Diameter,2,raw=TRUE),df)
summary(fit.poly)
# Coefficients:
#                                Estimate Std. Error t value Pr(>|t|)    
# (Intercept)                    -6.85088   12.26720  -0.558  0.57917    
# poly(Diameter, 2, raw = TRUE)1  3.31030    1.10964   2.983  0.00451 ** 
# poly(Diameter, 2, raw = TRUE)2  0.47717    0.02109  22.622  < 2e-16 ***

绘制数据和趋势曲线:

代码语言:javascript
复制
df$pred <- predict(fit)
with(df,plot(Height~Diameter))
with(df[order(df$Diameter),],lines(pred~Diameter,col="red",lty=2))

票数 1
EN

Stack Overflow用户

发布于 2014-07-06 01:13:14

您的问题出在start=参数上。您需要提供abc参数的实际值。下面是一个可重复使用的示例

代码语言:javascript
复制
#sample data
dat<-data.frame(Diameter = runif(50, 2, 6))
dat<-transform(dat,Height=2*Diameter + .75 * Diameter^2 +4 + rnorm(50))
dat<-dat[order(dat$Diameter), ]

#now fit the model
mynls<-nls(Height ~ a*I(Diameter^2) + b*Diameter + c, dat,
    start=list(a=1, b=1, c=1), algorithm="port")

注意我们如何为每个系数设置默认值1。您可以设置您认为最合适的任何内容。以及如何使用拟合结果绘制原始值

代码语言:javascript
复制
plot(Height~Diameter,dat, main="Height Curve", 
    xlab="Diameter", ylab="Height", pch=19)
lines(fitted(mynls)~ dat$Diameter, col="red")

这给了我们

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24584383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档