R实现局部线性回归与核回归

一元非参数回归模型:

 

核回归方法估计m(x)

想法:利用x附近的点 xi距离x的远近,对样本观测值yi 进行加权,从而得到xy的值。

定义加权平均核:R实现局部线性回归与核回归_第1张图片

Nadaraya-Watson核估计为: 

局部加权最小二乘估计:

R实现局部线性回归与核回归_第2张图片

 Nadaraya-Watson核估计为(高斯核):

R实现局部线性回归与核回归_第3张图片

局部线性回归估计m(x)

想法:在局部线性函数回归的基础上核估计虽然实现了局部加权,但这个权重在局部邻域内是常量,但由于加权是基于整个样本点的,因此在边界不够理想。为了避免边界效应,用一个变动的函数取代局部固定的权。 即在x的邻域用线性函数取代yi的平均。

R实现局部线性回归与核回归_第4张图片在局部线性函数回归的基础上

R实现局部线性回归与核回归_第5张图片 写成矩阵形式:

R实现局部线性回归与核回归_第6张图片写成矩阵形式:

​​​​​

求导得到:

R实现局部线性回归与核回归_第7张图片

 R中模拟数据y=3(x-0.5)^2,代码实现:

library(Matrix)
library(MASS)
#生成数据
p<-1
n<-100
x_var<-runif(n,0,1)
err=rnorm(n,0,0.1)
y=3*(x_var-0.5)^2+err #y=3(x-0.5)^2
plot(x_var,y)
######核估计方法##########
M1<-function(x,h)
{sum(y[1:100]*exp(-0.5*((x_var[1:100]-x)/h)^2)) /sum(exp(-0.5*((x_var[1:100]-x)/h)^2))}
z<-rep(0,100)
x<-seq(min(x_var),max(x_var),length=100)
for(i in 1:n)
{z[i]<-M1(x[i],0.15)}#h=0.15
lines(x,z)  #核估计曲线    
ymean=3*(x-0.5)^2    
lines(x,ymean,col='red')  #真实曲线

######局部线性估计方法##########
#高斯核函数
kernel.gauss<-function(x){
  (1/sqrt(2*pi))*exp(-(x^2)/2)
}
u<-matrix(0,n,n)
hopt=0.15#h的选择
au<-matrix(0,p,n)
w<-matrix(0,n,n)
for(j in 1:n){
  for(i in 1:n)
  {
    u[i,j] =x_var[i]-x[j]#产生xi-x
  }
  W<-diag(kernel.gauss(u[,j]/hopt)/hopt)
  x_curve<-cbind(1,u[,j])#n*p
  #估计β
  beta0<-ginv(t(x_curve)%*%W%*%x_curve)%*%t(x_curve)%*%W%*%y #p*1
  #au的局部线性估计
  I_p<-diag(1,p)
  I<-cbind(I_p,0)
  au[,j]<-I%*%beta0
}
lines(x,au[1,],col='blue') #局部线性估计曲线

对比图为:

R实现局部线性回归与核回归_第8张图片

 注意拟合程度会受到h的影响和样本量的大小影响

 

你可能感兴趣的:(r语言)