我有以下等式来计算简单线性回归模型的t统计量。
t = beta1 / SE(beta1)
SE(β1的)= SQRT((RSS / VAR(X1))*(1 / N-2))
如果我想用R做一个简单的例子,我无法得到与R中的线性模型相同的结果。
x <- c(1,2,4,8,16)
y <- c(1,2,3,4,5)
mod <- lm(y~x)
summary(mod)
Call:
lm(formula = y ~ x)
Residuals:
1 2 3 4 5
-0.74194 0.01613 0.53226 0.56452 -0.37097
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.50000 0.44400 3.378 0.0431 *
x 0.24194 0.05376 4.500 0.0205 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.6558 on 3 degrees of freedom
Multiple R-squared: 0.871, Adjusted R-squared: 0.828
F-statistic: 20.25 on 1 and 3 DF, p-value: 0.02049
如果我手动执行此操作,我会得到另一个值。
var(x)
37.2
sum(resid(mod)^2)
1.290323
β1的= 0.24194
SE(β1的)= SQRT((1.290323 / 37.2)*(1/3)) SE(β1的)= 0.1075269
因此t = 0.24194 /0.1075269 = 2.250042
那么为什么我的计算精确到R的一半值呢?它与一/二尾测试有关吗? t(0.05 / 2)的值为3.18
此致 扬
答案 0 :(得分:2)
不同的结果是由se(beta)
的公式中缺少的术语引起的。它应该是:
se(beta) = sqrt((1 / (n - 2)) * rss / (var(x) * (n - 1)))
该公式通常写为:
se(beta) = sqrt((1 / (n - 2)) * rss / sum((x - mean(x)) ^ 2))
而不是var(x)
。
为了完整起见,这里还有计算检查:
reprex::reprex_info()
#> Created by the reprex package v0.1.1.9000 on 2017-10-30
x <- c(1, 2, 4, 8, 16)
y <- c(1, 2, 3, 4, 5)
n <- length(x)
mod <- lm(y ~ x)
summary(mod)
#>
#> Call:
#> lm(formula = y ~ x)
#>
#> Residuals:
#> 1 2 3 4 5
#> -0.74194 0.01613 0.53226 0.56452 -0.37097
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) 1.50000 0.44400 3.378 0.0431 *
#> x 0.24194 0.05376 4.500 0.0205 *
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 0.6558 on 3 degrees of freedom
#> Multiple R-squared: 0.871, Adjusted R-squared: 0.828
#> F-statistic: 20.25 on 1 and 3 DF, p-value: 0.02049
mod_se_b <- summary(mod)$coefficients[2, 2]
rss <- sum(resid(mod) ^ 2)
se_b <- sqrt((1 / (n - 2)) * rss / (var(x) * (n - 1)))
all.equal(se_b, mod_se_b)
#> [1] TRUE