楼主: 冷月初
17222 12

[R] R软件做非参数回归(样条回归、多项式回归)(代码+数据) [推广有奖]

  • 1关注
  • 8粉丝

大专生

53%

还不是VIP/贵宾

-

威望
0
论坛币
5416 个
通用积分
6.6321
学术水平
9 点
热心指数
12 点
信用等级
8 点
经验
553 点
帖子
38
精华
0
在线时间
28 小时
注册时间
2012-12-1
最后登录
2016-3-8

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
    样条回归、局部多项式回归。
    代码全是根据算法自编函数,可以自行设置参数,尤其是窗宽的的选择更加自由。压缩包里有这部分讲义、自编代码、练习题。



贴出部分源代码




  1. #------------------定义函数---------------------#<?xml:namespace prefix = "o" ns = "urn:schemas-microsoft-com:office:office" />
  2. kern.epan <- function(u){
  3. return(3/4*(1-u^2)*(abs(u)<=1));
  4. }

  5. LLS.fun <- function(x,X,Y,h)
  6. {
  7.   z   = 1/h*kern.epan((x-X)/h);     
  8.   s1  = sum(z*(x-X));
  9.   s2  = sum(z*(x-X)^2);
  10.   w   = z*(s2-(x-X)*s1);

  11.   return(sum(w*Y)/sum(w));  
  12. }

  13. CV1.fun=function(X,Y,h)
  14. {
  15.    y1=rep(0,length(Y));
  16.    for(i in 1:length(Y)){
  17.       y1[i]=LLS.fun(X[i],X[-i],Y[-i],h);
  18.       }
  19.    return(mean((Y-y1)^2));   
  20. }

  21. CI.boot.fun=function(resids,xpoints,X,yfit,B,h)
  22. {
  23. # bootstrap方法求置信区间
  24.    result=matrix(0,length(xpoints),B);
  25.    for(i in 1:length(xpoints)){
  26.        for(b in 1:B){
  27.            epsilon=sample(resids,replace=TRUE);
  28.            newY=yfit+epsilon;
  29.            #X2=X^2; X3=X^3; X4=X^4;
  30.            #fit1 <- lm(Y~X+X2+X3+X4);
  31.            #coefE=c(fit1$coeff);
  32.            #sigmaE=sqrt(var(fit1$residuals));

  33.            #CK=1.719 # Epanechnikov kernel used.
  34.            #temp=cbind(2,3*2*X,4*3*X^2)%*%as.vector(coefE[-(1:2)]);
  35.            #den=sum(temp^2);
  36.            #h.ROT=CK*(sigmaE^2/den)^(1/(2*1+3));


  37.            #newfit=LLS.fun(xpoints[i],X,newY,h=h.ROT);
  38.            newfit=LLS.fun(xpoints[i],X,newY,h=h);
  39.            
  40.            result[i,b]=newfit;
  41.            }
  42.        }
  43.       
  44.    return(result);

  45. }
复制代码




局部多项式法






  1. #------------------局部多项式法---------------------#
  2. #------------------Homework.one---------------------#
  3. library(SemiPar);
  4. data(age.income);
  5. attach(age.income);
  6. X=age;
  7. Y=log.income;
  8. plot(X,Y); #画原始数据的散点图

  9. X2=X^2; X3=X^3; X4=X^4;
  10. fit1<-lm(Y~X)
  11. lines(X,fit1$fitted.values,lty=1,col=1,lwd=3)
  12. fit2<-lm(Y~X+X2)
  13. lines(X,fit2$fitted.values,lty=2,col=2,lwd=3)
  14. fit3<-lm(Y~X+X2+X3)
  15. lines(X,fit3$fitted.values,lty=3,col=3,lwd=3)
  16. fit4<-lm(Y~X+X2+X3+X4)
  17. lines(X,fit4$fitted.values,lty=4,col=4,lwd=3)
  18. legend(20,15.1,c("线性","二次","三次","四次"),lty=c(1,2,3,4),col=c(1,2,3,4))

  19. # Rule-of-Thumb Global Bandwidth Selector;
  20. X2=X^2; X3=X^3; X4=X^4;
  21. fit1 <- lm(Y~X+X2+X3+X4);
  22. coefE=c(fit1$coeff);
  23. resids=fit1$residuals;
  24. sigmaE=sqrt(var(resids));
  25. CK=1.719 # Epanechnikov kernel used.
  26. temp=cbind(2,3*2*X,4*3*X^2)%*%as.vector(coefE[-(1:2)]);
  27. den=sum(temp^2);
  28. h.ROT=CK*(sigmaE^2/den)^(1/(2*1+3));
  29. print(h.ROT)  #选择窗宽

  30. #final fitting;
  31. xfine=seq(0,70,length=50);
  32. ypred1 <- rep(0,length(xfine));
  33. for(i in 1:length(xfine)){
  34.     ypred1[i] <- LLS.fun(xfine[i],X,Y,h=8);   
  35. }
  36. plot(X,Y);
  37. lines(xfine,ypred1,lty=1,col=3);#拟合数据


  38. #求g(x)的置信区间
  39. yfit=rep(0,length(X));
  40. for(i in 1:length(X)){
  41. yfit[i] <- LLS.fun(X[i],X,Y,h=8);
  42. }

  43. temp=Y-yfit;
  44. resids=temp-mean(temp);
  45. result1=CI.boot.fun(resids=resids,xpoints=xfine,X=X,yfit=yfit,B=1000,h=8)
  46. CI.upp=rep(0,length(xfine));
  47. CI.low=rep(0,length(xfine));
  48. for(i in 1:length(xfine)){
  49.    temp=quantile(result1[i,],probs=c(0.025,0.975),na.rm = T);
  50.    CI.low[i]=temp[1]; CI.upp[i]=temp[2];
  51. }
  52. plot(X,Y)
  53. lines(xfine,ypred1,lty=1,col=2);                        
  54. lines(xfine,CI.upp,lty=3,col=3);  
  55. lines(xfine,CI.low,lty=4,col=4);
  56. legend(20,15.1,c("Estmate","CI.upp","CI.low"),lty=c(1,3,4),col=c(2,3,4))
复制代码


资料下载:R软件做非参数回归拟合数据,有代码和数据











二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:非参数回归 样条回归 非参数 多项式 r软件 非参数回归 样条回归 代码 非参数回归 样条回归 局部多项式回归 R

已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
niuniuyiwan + 60 + 60 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 60  论坛币 + 60  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

本帖被以下文库推荐

沙发
niuniuyiwan 在职认证  发表于 2015-10-17 08:48:55 |只看作者 |坛友微信交流群
感谢楼主,感谢分享,发帖不易,用心良苦。

使用道具

藤椅
michaelcicada 发表于 2015-12-9 17:22:36 |只看作者 |坛友微信交流群
谢谢楼主分享,非常感谢!

使用道具

板凳
Tony_Liu 在职认证  发表于 2015-12-20 14:13:14 |只看作者 |坛友微信交流群
学习了,谢谢!
但是你的代码有些看不太懂,比如B-spline回归那部分,有些函数没有太理解什么意思,请问有这方面的书籍推荐一下吗,特别是关于B-spline回归的?

使用道具

报纸
jiang25u 发表于 2016-6-9 21:51:56 |只看作者 |坛友微信交流群
xiexielouzhu

使用道具

地板
vmit 发表于 2016-8-18 17:44:50 |只看作者 |坛友微信交流群
好帖,感谢分享

使用道具

楼主是东财校友吗?也在做分位数回归,可以进一步交流下吗?

使用道具

8
zhaoqingxia 学生认证  发表于 2017-4-17 20:21:08 |只看作者 |坛友微信交流群

学习了,谢谢!

使用道具

9
一心一半888 发表于 2018-4-22 14:49:31 |只看作者 |坛友微信交流群
能不能分享一个啊,我论坛币不够了,1309731862@qq.com

使用道具

10
冰灵325 发表于 2018-12-25 22:03:12 |只看作者 |坛友微信交流群
一心一半888 发表于 2018-4-22 14:49
能不能分享一个啊,我论坛币不够了,1309731862@qq.com
我下载了发你邮箱

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 05:15