在 R 中使用 optim 重建加权回归

Rebuild weighted regression with optim in R

我可以使用 optim 在 R 中成功重建线性回归,但是当我还使用权重时我得到了错误的结果。

df <- mtcars
df$weight <- df$disp / mean(df$disp) #just an example

以下是使用 lm 的正确结果:

summary(lm(mpg ~ cyl, data = df))$r.squared
[1] 0.72618

summary(lm(mpg ~ cyl, data = df, weights = weight))$r.squared
[1] 0.6794141

这里是适用于未加权版本的函数和优化:

minX.RSQ <- function(par) {
  esti <- par[1] + par[2]*df[,'cyl']
  resi <- (esti - df[,'mpg'])**2
  RSS <- sum(resi)
  SST <- sum((df[,'mpg'] - mean(df[,'mpg']))**2)
  -(1 - RSS / SST)
}
optim(par = c(0,0), minX.RSQ)$value
[1] -0.72618 #which is correct, cp. above

这里是加权版本的函数和优化,我尝试了加权和,但结果不正确:

minW.RSQ <- function(par) {
  esti <- par[1] + par[2]*df[,'cyl']
  resi <- (esti - df[,'mpg'])**2 
  RSS <- sum(resi * df[,'weight'])
  SST <- sum((df[,'mpg'] - mean(df[,'mpg']))**2 * df[,'weight'])
  -(1 - RSS / SST)
}
optim(par = c(0,0), minW.RSQ)$value
[1] -0.7521823 #which is NOT correct, cp. above

如何修复加权版本的功能?

你真的很亲近。您只需要在 SST 计算中使用加权平均值:

minW.RSQ <- function(par) {
  esti <- par[1] + par[2]*df[,'cyl']
  resi <- (esti - df[,'mpg'])**2 
  RSS <- sum(resi * df[,'weight'])
  SST <- sum((df[,'mpg'] - weighted.mean(df[,'mpg'], w = df[,'weight']))**2 * df[,'weight'])
  -(1 - RSS / SST)
}
optim(par = c(0,0), minW.RSQ)$value
# [1] -0.6794141