在 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
我可以使用 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