你可以试试如下的code
fit$m
fit$hatsigma2
将给出你想要的结果
供参考.
窗宽是用GCV方法选取的.
Code 是根据Xia Yingcun的Code修改得到的
=================================================================
Gcvh <- function(x,y) {
n = length(y);
m = y;
cv0 = 1.0e50;
s = matrix(0, n, 1)
for (hi in 1:20)
{h = hi/20*(max(x)-min(x))/2
for (i in 1:n)
{k = exp( -(x - x[i])^2/(2*h*h))/sqrt(2*3.14)/h
m[i] = t(k) %*% y/sum(k)
s[i] = k[i]/sum(k); }
cv = mean( (y-m)^2)/( 1 - sum(s)/n)^2;
if (cv < cv0) { cv0 =cv
h0 = h } }
return(h0) }
ks <- function(x, y, xnew=x, bandwidth=0.5)
{
n = length(y)
hatm = matrix(0, n);
for (i in 1:n)
{ k = exp( -(x - x[i])^2/(2*bandwidth*bandwidth))/sqrt(2*3.14)/bandwidth
hatm[i] = t(k) %*% y/sum(k)
}
hatsigma2 = mean((y - hatm)^2)
m = matrix(0, length(xnew), 1)
for (i in 1:length(xnew)) {
k = exp( -(x - xnew[i])^2/(2*bandwidth*bandwidth))/sqrt(2*3.14)/bandwidth
m[i] = t(k) %*% y/sum(k)
}
return(list(m=m, hatsigma2 =hatsigma2 ))
}
x = c(1510.2,1700.6,2026.6,2577.4,3496.2,4283.0,4838.9,5160.3,5425.1,5854.0,6280.0,6859.6,7702.8,8472.2,
9421.6,10493.0,11759.5,13785.8,15780.8,17174.7)/1000
y = c(1278.89,1453.81,1671.73,2110.81,2851.34,3537.57,3919.47,4185.64,4331.61,4615.91,4998.00,
5309.01,6029.88,6510.94,7182.10,7942.88,8696.55,9997.47,11242.85,12264.55)/1000
plot(x,y)
h = Gcvh(x,y);
fit = ks(x, y, bandwidth=h)
lines(x,fit$m)
fit$m
fit$hatsigma2
|