如何找到合适的模型以拟合r中当前数据的非线性曲线

时间:2019-07-17 09:52:58

标签: r regression curve-fitting non-linear-regression

我有一个数据集:Reg

dist     ED
75  4.9
150 7.6
225 8.9
300 8.8
375 8.1
450 7.3
525 6.5
600 5.8

我想找到一个很好的拟合非线性回归模型。我尝试过:

plot(Reg$ED, Reg$dist)
lines(lowess(Reg$ED,Reg$dist))
m1 <- lm(ED ~poly(dist,2,raw=TRUE),data=Reg)
m2 <- lm(ED~dec+I(dist^2),data=Reg)
summary(m1)
summary(m2)
lines(Reg$PVFD_Mean, predict(m2), col=2)

但是我不知道为什么回归模型的线不在图中显示。因此,我不知道如何找到最适合我的数据的模型。我也尝试过fitModel,但是也没有用。

非常感谢您的帮助。

非常感谢

3 个答案:

答案 0 :(得分:2)

以下是使用loess函数构建非线性模型的选项:

dt = read.table(text = "dist     ED
75  4.9
150 7.6
225 8.9
300 8.8
375 8.1
450 7.3
525 6.5
600 5.8", header=T)

# build the model
m = loess(ED ~ dist, data = dt)

# see model summary
summary(m)

# Call:
#   loess(formula = ED ~ dist, data = dt)
# 
# Number of Observations: 8 
# Equivalent Number of Parameters: 4.41 
# Residual Standard Error: 0.06949 
# Trace of smoother matrix: 4.87  (exact)
# 
# Control settings:
# span     :  0.75 
# degree   :  2 
# family   :  gaussian
# surface  :  interpolate     cell = 0.2
# normalize:  TRUE
# parametric:  FALSE
# drop.square:  FALSE 

# plot points and model fit
plot(dt$dist, dt$ED)
lines(dt$dist, m$fitted, col=2)

enter image description here

如果由于某些原因您确实想使用lowess函数,可以执行以下操作:

plot(dt$dist, dt$ED)
lines(lowess(dt$dist, dt$ED), col = "blue")
lines(lowess(dt$dist, dt$ED, f = 0.5), col = "green")
lines(lowess(dt$dist, dt$ED, f = 0.3), col = "red")

这将为您提供相同的图,但是您必须为平滑参数f选择一个小的值:

enter image description here

这两种方法之间的区别仅仅是loess的平滑参数的默认值(span = 0.75)好,而lowess的平滑参数的默认值不够好价值(f = 2/3)。

答案 1 :(得分:1)

我的方程搜索显示与参数a = 1.4956613575678071E + 01,b的三参数哈里斯逆屈服密度方程“ y = x /(a + b * pow(x,c))”非常吻合= 7.8559465184281589E-05,并且c = 2.1768293119284090E + 00,给出RMSE = 0.1002和R平方= 0.9943

plot

答案 2 :(得分:0)

在问题中,... class B : public A{ public: virtual void goodbye() = 0; }; class C : public B { public: void hello() override { std::cout << "C says: Hello World!" << std::endl; } void goodbye() override { std::cout << "C says: GoodBye World!" << std::endl; } }; ... int main() { std::map <std::string, void*> mymap; C c; D d; mymap["C"] = static_cast<A*>(&c); mymap["D"] = static_cast<A*>(&d); static_cast<A*>(mymap["D"])->hello(); static_cast<A*>(mymap["C"])->hello(); dynamic_cast<B*>(static_cast<A*>(mymap["C"]))->goodbye(); return 0; } dist的值有时会交换。

ED

here