【问题标题】:Why OLS Regression gives the lowest MSE results when there are outliers in data [closed]为什么当数据中存在异常值时,OLS 回归会给出最低的 MSE 结果[关闭]
【发布时间】:2021-07-08 08:38:50
【问题描述】:

我正在处理回归模型(普通最小二乘法、Huber 回归、MM Estimator 和 Ridge 回归)。我想同时检查哪个模型对异常值和多重共线性更稳健

但是,与其他回归模型相比,当数据中存在异常值和多重共线性时,OLS 回归的 MSE 结果最低。

我的代码有什么问题吗?

R 代码

library(MASS)
library(glmnet)

### Calling the important functions ###

# Mean Square meausre: MSE#
mse=function(x){
  mmm=rep(0,ncol(x))
  for (i in 1:ncol(x)){
    mmm[i]=mean((x[,i])^2)
  }
  return(mmm)
}

# Mean Absloute Deviation measure: MAD#
mad=function(x){
  mmm=rep(0,ncol(x))
  for (i in 1:ncol(x)){
    mmm[i]=mean(abs(x[,i]))
  }
  return(mmm)
}

# mean of the results ##
mee=function(x){
  mmm=rep(0,ncol(x))
  for (i in 1:ncol(x)){
    mmm[i]=mean((x[,i]))
  }
  return(mmm)
}

umar <- function(R,n,sig,p,po,py,fx,fy){
  #' where 'R is the level of multicollinearity between 0 and 1'#
  #' "n" is the sample size
  #' "sig" is the error vatiance
  #' "p" is the number of explanaitory variable
  #' 'po' is percentage outlier in x direction
  #'  'py' is percentage outlier in y direction
  #' 'fx' is magnitude of outlier in x direction
  #' 'fy' is magnitude of outlier in y direction'#
  #' RR' is the number of replication 
  
  RR=20      
  set.seed(123)
  
  OP2=NULL
  OP3=NULL
  
  #explanatory vriables
  
  x=matrix(0,nrow=n,ncol=p)
  W <-matrix(rnorm(n*(p+1),mean=0,sd=1), n, p+1)  
  for (i in 1:n){
    for (j in 1:p){
      x[i,j] <- sqrt(1-R^2)*W[i,j]+(R)*W[i,p+1];      # Introduce multicollinearity
    }    
  }
  
  b=eigen(t(x)%*%x)$vec[,1]
  
  #Invoking outlier
  rep1=sample(1:n, size=po*n, replace=FALSE)
  x[rep1,2]=fx*max(x[,2])+x[rep1,2]     # the point of outlier
  for (i in 1:RR){
    u=rnorm(n,0,sig)
    y=x%*%b+u
    rep2=sample(1:n, size=py*n, replace=FALSE)
    y[rep2]=fy*max(y)+y[rep2]
    
    dat=data.frame(y,x)
    n=nrow(dat)
    
    # K-fold Cross validation
    #Create k equally size folds
    
    k=3 # number of folds
    folds <- cut(seq(1,n),breaks=k,labels=FALSE)
    
    mols=matrix(0,nrow= k);
    mM=matrix(0,nrow= k);mMM=matrix(0,nrow= k);
    mrls=matrix(0,nrow= k);mrm=matrix(0,nrow= k);mrmm=matrix(0,nrow= k);

    mols2=matrix(0,nrow= k);
    mM2=matrix(0,nrow= k);mMM2=matrix(0,nrow= k)
    mrls2=matrix(0,nrow= k);mrm2=matrix(0,nrow= k);mrmm2=matrix(0,nrow= k);
    
    #Perform 3 fold cross validation
    
    for(i in 1:k){
      #Segement your data by fold using the which() function 
      testIndexes <- which(folds==i,arr.ind=TRUE)
      testData <- dat[testIndexes, ]
      trainData <- dat[-testIndexes, ]
      xtr=as.matrix(trainData[,-1])
      ytr=trainData[,1]
      xte=as.matrix(testData[,-1])
      yte=testData[,1]
      
      mest=rlm(ytr~xtr,psi=psi.huber,k2=1.345,maxit=1000)$coefficients  # Huber Regression 
      
      mmest=rlm(ytr~xtr,method="MM",maxit = 1000)$coefficients  # MM Estimators 
      
      ols=lm(ytr~xtr)$coefficients     # OLS Regression 
      
      nxtr=model.matrix(~xtr)



      ridge.fit.cv <- cv.glmnet(nxtr, ytr, alpha = 0, standardize = FALSE, intercept = TRUE)
      ridge.fit.lambda <- ridge.fit.cv$lambda.1se
      
      I=diag(1,ncol(nxtr))
      ridols=solve(t(nxtr)%*%nxtr+ridge.fit.lambda*I)%*%(t(nxtr)%*%nxtr)%*%ols  # Ridge Regression 
      mrls[i]=mean(yte-cbind(1,xte)%*%ridols)^2
      ridM=solve(t(nxtr)%*%nxtr+ridge.fit.lambda*I)%*%(t(nxtr)%*%nxtr)%*%mest # Ridge Huber 
      mrm[i]=mean(yte-cbind(1,xte)%*%ridM)^2
      ridMM=solve(t(nxtr)%*%nxtr+ridge.fit.lambda*I)%*%(t(nxtr)%*%nxtr)%*%mmest # Ridge MM
      mrmm[i]=mean(yte-cbind(1,xte)%*%ridMM)^2


      mols[i]=mean(yte-cbind(1,xte)%*%ols)^2
      mM[i]=mean(yte-cbind(1,xte)%*%mest)^2
      mMM[i]=mean(yte-cbind(1,xte)%*%mmest)^2
      
      mrls2[i]=mean(abs(yte-cbind(1,xte)%*%ridols))
      mrm2[i]=mean(abs(yte-cbind(1,xte)%*%ridM))
      mrmm2[i]=mean(abs(yte-cbind(1,xte)%*%ridMM))
      mols2[i]=mean(abs(yte-cbind(1,xte)%*%ols))
      mM2[i]=mean(abs(yte-cbind(1,xte)%*%mest))
      mMM2[i]=mean(abs(yte-cbind(1,xte)%*%mmest))
      
    }
    
    res1=cbind(mols,mM,mMM,
               mrls,mrm,mrmm)
    
    res3=cbind(mols2,mM2,mMM2,
               mrls2,mrm2,mrmm2)
    
    op2=mse(res1)
    OP2=cbind(OP2,op2)
    op3=mad(res3)
    OP3=cbind(OP3,op3)
    
  }
  
  MSE=mee(t(OP2))
  MAD=mee(t(OP3))
  
  
  
  nam=c("OLS","M","MM","Ridge-OLS","Ridge-M","Ridge-MM")
  
  data.frame(nam,R,n,sig,p,po,py,fx,fy,MAD,MSE)
}


results=NULL
R=c(0.999)
n=c(100)
sig=c(5)
p=c(3)
po=c(0.2)
py=c(0.2)
fx=c(5)
fy=c(5)

for(i in 1:length(R)){
  for(j in 1:length(n)){
    for(k in 1:length(sig)){
      for(l in 1:length(p)){
        for(m in 1:length(po)){
          for(nn in 1:length(py)){
            for(o in 1:length(fx)){
              for(pp in 1:length(fy)){
                results=rbind(results,umar(R=R[i],n=n[j],sig=sig[k],p=p[l],
                                           po=po[m],py=py[nn],fx=fx[o],fy=fy[pp]))
              }
            }
          }
        }
      }
    }
  }
}

View(results)

【问题讨论】:

  • 请不要发布包含rm(list=ls())的代码。试图帮助您的人可能会意外删除其全局环境中的所有对象。
  • 好的,我删除它。

标签: r regression


【解决方案1】:

我没有查看您的代码。如果您使用稳健优化,您还应该使用稳健的措施,否则您将无法实现目标。

我将尝试用一个简单的例子来说明这一点,只有一个案例,没有简历。假设这些随机数据的最后一点是一个巨大的异常值。

set.seed(1)
x=1:100
y=x+rnorm(100)
y[100]=1000

现在我们拟合 OLS 并估计 MSE

mean((predict(lm(y~x))-y)^2)
[1] 7779.713

和一个稳健的线性模型

library(MASS)
mean((predict(rlm(y~x,method="MM"))-y)^2)
[1] 8099.502

如您所见,稳健模型的 MSE 高于常规 OLS 模型。因为这正是 OLS 正在最小化的内容!均方误差。而稳健模型优化了不同的成本/损失函数。所以 OLS 返回最好的结果也就不足为奇了。

如开头所述,如果您要进行稳健优化,则应使用稳健措施。如果您检查两个模型的 MdAE,您会发现稳健模型的性能更好(同样,显然,这是它的目标)。

> median(abs(predict(lm(y~x))-y))
[1] 13.57675
> median(abs(predict(rlm(y~x,method="MM"))-y))
[1] 0.6008375

【讨论】:

  • 好的,您将 OLS 与稳健的 MM 进行比较。我也在比较最小绝对回归。在这种情况下,我不能使用 MSE,因为它会为 OLS 提供最低的结果。另外,我不能使用 MdAE,因为它会给出最小绝对回归的最低结果。那么,在这种情况下我应该使用什么度量(当我有 OLS、Least absolute 和 MM)。
  • @jeza 那是你必须决定的。您必须首先定义您实际想要最小化的是什么,无论是 MSE、MAE、MdAE 还是其他一些度量,然后在不同模型之间比较相同的度量。默认情况下,某些模型会更好,因为它们会更接近您的度量,但这没关系,因为这是您想要最小化的。如果您的数据中有异常值,那么使用稳健的度量是明智的,因为非稳健的度量可能会给您带来非常误导的结果。剩下的就是决定哪种稳健的测量方法,MdAE 将是经典的。
  • @jeza 不,多重共线性必须以另一种方式处理。如果预测是您的目标,您仍然可以使用 MdAE 来检查哪个模型表现更好,而不管多重共线性。在预测的情况下,多重共线性不一定是问题,只要模型预测良好。
  • 是否可以在没有绝对值的情况下测量 MdE(中值误差)?如果不是为什么?
  • @jeza 一般来说,没有。假设您只有 2 个测量值,一个误差为 -100,另一个误差为 +100,平均值(或中位数)将为 0,这是非常具有误导性的。换句话说,me(di)an 错误会被抵消,给你一个更乐观的结果。
猜你喜欢
  • 2017-01-21
  • 2020-09-27
  • 2020-07-13
  • 2016-08-08
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多