用R语言做简单线性回归和指数线性回归

x<-c(22676277,20882843,20169758,19935222,19642157)  
y<-c(128051,108686,99187,85127,81579)  

首先先计算他们的相关性:

cor(x,y)

值为 0.964 

fit<-lm(y~x) ##lm()函数为线性回归函数
coef(fit) ##查看回归函数系数 
结果为:

 (Intercept)                x 
-2.082360e+05  1.494401e-02 

所谓线性回归就是 y=a+bx 求a,b的值。结果中,a值就是intercept截距值,b值为第二个x系数值。

我们来画个图

plot(x,y, xlab="x value", ylab="y value") #打出x,y实际关系的散点图  
abline(fit) #添加线性回归线 

当已知x值时,如何求y值呢? 用公式

y=a+bx=coef(fit)[1]+coef(fit)[2]*x  

即可。

我们用实际数字验证一下:

x_test<-c(18589925,14656891)  
y_test<-coef(fit)[1]+coef(fit)[2]*x_test  
y_test为
[1] 69572.07 10796.75

但在实际观测中,当x下降到14656891时,y不可能是10798。说明我们这个模型在最后回归的时候斜率太大了,下降太快,不太符合实际。因此我们又建立了一个非线性回归,即用了指数回归模型来估计。

指数模型为y=a*x^b。代码如下:

x<-c(22676277,20882843,20169758,19935222,19642157)  
y<-c(128051,108686,99187,85127,81579)  
fit02<-nls(y~a*x^b, start=(list(a=1,b=1))) #nls()函数用来做非线性回归,里面参数第一个是模型等式,第二个start是估计参数初始值  

运行时很快发现我们的代码报错 “singular gradient 奇艺梯度”。是因为start要求对系数的估计需要尽量贴近真实值,也就是说要尽量在一个数量级上。

但是不管你怎么改,就会发现这个回归特别难搞,各种报错,是因为需要回归的值都太大了。所以我找了个特别简单有效的方法——————就是降级,哈哈!

把x和y从10e6下降到10e2,就会好算啦~比如在这个例子里:


x<-x/1000000  
y<-y/10000     
fit02<-nls(y~a*x^b, start=(list(a=1,b=1))) ##不会报错  
plot(x,y) ##画散点图  
lines(x,fitted(fit02)) ##添加回归曲线  

辣么,如何已知x求y呢?

summary(fit02)
运行结果可以看到所有回归曲线的参数:

Formula: y ~ a * x^b


Parameters:
    Estimate   Std. Error t   value    Pr(>|t|)   
a 0.001638   0.002441   0.671  0.55015   
b 2.877748   0.489346   5.881  0.00981 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.638 on 3 degrees of freedom


Number of iterations to convergence: 25 
Achieved convergence tolerance: 1.514e-06


这其中,系数a值就为参数中的a值0.001638,b值就为参数中的b值2.877748。求解如下:

x_test<-c(18589925,14656891)  
x_test<-x_test/1000000 #x值降级  
y_test<-0.001638*x_test^2.877748 #套入公式 
结果为

y_test

[1] 7.361649 3.714399

因为y被降过级,因此实际答案应为

y_test<-y_test*10000  
y_test  

[1] 73616.49 37143.99


数值相对符合实际。不过还要用真实值检验。当有更多的样本时,需要定时修正模型。




Reference: http://blog.csdn.net/u012671171/article/details/43155351

 



  • 11
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值