【问题标题】:Why do I get two different R^2 in r and which one is correct?为什么我在 r 中得到两个不同的 R^2,哪一个是正确的?
【发布时间】:2019-11-26 11:47:33
【问题描述】:

我有下面的数据,想用 lm 和变量二的对数做一个指数回归模型。

当我评估模型时,我从模型摘要和模型调用摘要中得到两个不同的 r2。为什么我会得到这个 d

  data <- structure(list(V1 = c(0.79, 0.61, 0.83, 0.86, 0.84, 0.78, 0.8, 
                      0.81, 0.77, 0.83, 0.8, 0.86, 0.31, 0.8, 0.85, 0.77, 0.77, 0.86, 
                      0.66, 0.81, 0.84, 0.68, 0.81, 0.81, 0.75, 0.64, 0.83, 0.52, 0.85, 
                      0.5), V2 = c(832.69, 411.64, 1150.85, 1236, 751.09, 723.46, 1056.16, 
                                   904.22, 361.76, 695.04, 948.45, 812.51, 75.52, 700.64, 1193.39, 
                                   523.02, 1713.68, 1183.73, 320.96, 678.42, 825.22, 159.17, 891.43, 
                                   177.52, 863.89, 217.45, 552.3, 223.9, 564.05, 99.26)), row.names = c(41L, 
                                                                                                        25L, 74L, 40L, 130L, 118L, 109L, 83L, 77L, 16L, 49L, 86L, 23L, 
                                                                                                        13L, 45L, 3L, 15L, 37L, 31L, 14L, 5L, 85L, 103L, 36L, 126L, 38L, 
                                                                                                        30L, 54L, 95L, 81L), class = "data.frame")

fit <- lm(formula = log(data$V2) ~ data$V1)
fit
plot(data)
lines(sort(data$V1), exp(sort(predict(fit, list(x =data$V1)))), col="red")
points(sort(data$V1), exp(sort(predict(fit, list(x =data$V1)))), col="red")
summary(fit)

调整后的 R 平方:0.64

data$V2predicted <- exp(predict(fit,list(x =data$V1)))
points(data$V1, data$V2predicted, col = 'blue')


summary(lm(data$V2 ~ data$V2predicted))

调整后的 R 平方:0.4166

这不是关于多个 R^2 和调整后的 R^2 之间的区别,而是关于为什么我从模型调用和 lm() 得到不同的 R^2。

我是不是做错了什么?

【问题讨论】:

  • 首先,为什么你认为两者应该相等?
  • 我认为这就是模型拟合所显示的内容。
  • 我认为是时候回去检查定义和数学了
  • 我认为它们不应该相同,您对 2 个模型的两个不同变量进行回归。

标签: r regression lm


【解决方案1】:

您得到不同的 rsq 值,因为您的响应变量在不同的尺度上。对于您的第一次拟合lm(formula = log(data$V2) ~ data$V1),您的响应变量采用对数刻度。在第二个中,您将它们转换回指数

R 平方是模型解释的方差(见下面的 MSS),作为总方差(残差平方和 RSS + MSS)的一部分:

定义r平方函数:

calculate_rsq = function(fit){

fitted_values = fit$fitted.values 
MSS = sum((fitted_values-mean(fitted_values))^2)
RSS = sum(fit$residuals^2)
TSS = MSS+RSS

rsq = 1 - RSS/TSS

c(RSS=RSS,TSS=TSS,rsq=rsq)
}

检查您拥有的两个模型:

fit_log <- lm(formula = log(data$V2) ~ data$V1)
data$V2predicted <- exp(predict(fit,list(x =data$V1)))
fit_exp <- lm(data$V2 ~ data$V2predicted)

你会明白为什么 R-square 是不同的:

calculate_rsq(fit_log)
       RSS        TSS        rsq 
 6.1929518 17.8160346  0.6523945 
 calculate_rsq(fit_exp)
         RSS          TSS          rsq 
2.549842e+06 4.526867e+06 4.367315e-01 

因此,如果您使用响应日志拟合模型,则报告该拟合的 R^2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多