我尝试用R估计位置和扩散模型,如Maronna et al (2006, pp. 56)所述。但是,我的估计偏差不会收敛到所需的值。我的代码中有错误吗?
#set.seed(12345)
n <- 100
error<-rnorm(n,0,1)
x <- 10+5*error
# funcion bisquare
psi_bisq <- function(y){
k <- 2.2
ifelse(abs(y)<=k,ind <- 1,ind <- 0)
return(y*ind*(1-(y/k)^2)^2)
}
# derivada de la funcion bisquare
psi_bisq_der <- function(y){
k <- 2.2
ifelse(abs(y)<=k,ind <- 1,ind <- 0)
return(ind*(1-(y/k)^2)*(1-5*(y/k)^2))
}
# funcion rho_bisquare
rho_bisq <- function(y){
k <- 2.2
ifelse(abs(y)<=k, sal <- 1-(1-(y/k)^2)^3, sal <- 1)
return(sal)
}
# segunda derivada de funcion rho_bisquare
rho_bisq_der2 <- function(y){
k <- 2.2
ifelse(abs(y)<=k, sal <- 6*(1-(y/k)^2)*(1-5*(y/k)^2)/k^2, sal <- 0)
return(sal)
}
# funcion de peso
W <- function(dato){
ifelse(dato==0, ww <- psi_bisq_der(0), ww <- psi_bisq(dato)/dato)
return(ww)
}
Wdis<-function(dato){
ifelse(dato==0,ww<-rho_bisq_der2(0),ww<-rho_bisq(dato)/dato^2)
}
#======== Estimador simultáneo de localización y dispersión
# estimador robusto de dispersi?n
sigma_est_a <- median(abs(x-median(x)))/0.6745
# estimador robusto de la media, inicial
mu_est_a <- median(x)
epsilon <- .00001
err1 <- epsilon*sigma_est_a
err2<-epsilon
error <- 1000
error2<- 1000
delta <- .9
iter<-0
while((error>=err1) && (error2>=err2)){
pesos_loc <- rep(0,n)
pesos_dis <- rep(0,n)
for(i in 1:n){
r <- (x[i]-mu_est_a)/sigma_est_a
pesos_loc[i] <- W(r)
pesos_dis[i]<-Wdis(r)
}
iter<-iter+1
mu_est_n <-sum(pesos_loc*x)/sum(pesos_loc)
sigma_est_n<-sqrt(((sigma_est_a^2)/(n*delta))*sum(pesos_dis*r^2))
error <- abs(mu_est_n - mu_est_a)
error2 <- abs(sigma_est_n/sigma_est_a -1)
mu_est_a<-mu_est_n
sigma_est_a<-sigma_est_n
}
sigma_est_a
mu_est_a