Theo hiểu biết của riêng tôi, tôi quan tâm đến việc sao chép thủ công các phép tính sai số chuẩn của các hệ số ước tính, ví dụ, đi kèm với đầu ra của lm()
hàm trong R
, nhưng không thể xác định được. Công thức / thực hiện được sử dụng là gì?
Theo hiểu biết của riêng tôi, tôi quan tâm đến việc sao chép thủ công các phép tính sai số chuẩn của các hệ số ước tính, ví dụ, đi kèm với đầu ra của lm()
hàm trong R
, nhưng không thể xác định được. Công thức / thực hiện được sử dụng là gì?
Câu trả lời:
Mô hình tuyến tính được viết là Trong đó biểu thị vectơ phản hồi, là vectơ của các tham số hiệu ứng cố định, là ma trận thiết kế tương ứng có các cột là giá trị của các biến giải thích và là vectơ của các lỗi ngẫu nhiên. y β X ε
Người ta biết rằng ước tính của được đưa ra bởi (tham khảo, ví dụ: bài viết trên wikipedia ) Do đó [nhắc nhở: , đối với một số vectơ ngẫu nhiên và một số ma trận không ngẫu nhiên ]beta = ( X ' X ) - 1 X ' y . Var ( β ) = ( X ' X ) - 1 X '
sao cho trong đó có thể nhận được bằng Lỗi bình phương trung bình (MSE) trong bảng ANOVA.
Ví dụ với hồi quy tuyến tính đơn giản trong R
#------generate one data set with epsilon ~ N(0, 0.25)------
seed <- 1152 #seed
n <- 100 #nb of observations
a <- 5 #intercept
b <- 2.7 #slope
set.seed(seed)
epsilon <- rnorm(n, mean=0, sd=sqrt(0.25))
x <- sample(x=c(0, 1), size=n, replace=TRUE)
y <- a + b * x + epsilon
#-----------------------------------------------------------
#------using lm------
mod <- lm(y ~ x)
#--------------------
#------using the explicit formulas------
X <- cbind(1, x)
betaHat <- solve(t(X) %*% X) %*% t(X) %*% y
var_betaHat <- anova(mod)[[3]][2] * solve(t(X) %*% X)
#---------------------------------------
#------comparison------
#estimate
> mod$coef
(Intercept) x
5.020261 2.755577
> c(betaHat[1], betaHat[2])
[1] 5.020261 2.755577
#standard error
> summary(mod)$coefficients[, 2]
(Intercept) x
0.06596021 0.09725302
> sqrt(diag(var_betaHat))
x
0.06596021 0.09725302
#----------------------
Khi có một biến giải thích duy nhất, mô hình sẽ giảm xuống và sao cho và các công thức trở nên trong suốt hơn. Ví dụ: lỗi tiêu chuẩn của độ dốc ước tính là
> num <- n * anova(mod)[[3]][2]
> denom <- n * sum(x^2) - sum(x)^2
> sqrt(num / denom)
[1] 0.09725302
lm.fit
/ summary.lm
hơi khác một chút, vì tính ổn định và hiệu quả ...
Các công thức cho những điều này có thể được tìm thấy trong bất kỳ văn bản trung gian nào về thống kê, đặc biệt, bạn có thể tìm thấy chúng trong Sheather (2009, Chương 5) , từ đó cũng thực hiện bài tập sau (trang 138).
Mã R sau đây tính toán các ước tính hệ số và các lỗi tiêu chuẩn của chúng theo cách thủ công
dfData <- as.data.frame(
read.csv("http://www.stat.tamu.edu/~sheather/book/docs/datasets/MichelinNY.csv",
header=T))
# using direct calculations
vY <- as.matrix(dfData[, -2])[, 5] # dependent variable
mX <- cbind(constant = 1, as.matrix(dfData[, -2])[, -5]) # design matrix
vBeta <- solve(t(mX)%*%mX, t(mX)%*%vY) # coefficient estimates
dSigmaSq <- sum((vY - mX%*%vBeta)^2)/(nrow(mX)-ncol(mX)) # estimate of sigma-squared
mVarCovar <- dSigmaSq*chol2inv(chol(t(mX)%*%mX)) # variance covariance matrix
vStdErr <- sqrt(diag(mVarCovar)) # coeff. est. standard errors
print(cbind(vBeta, vStdErr)) # output
tạo ra đầu ra
vStdErr
constant -57.6003854 9.2336793
InMichelin 1.9931416 2.6357441
Food 0.2006282 0.6682711
Decor 2.2048571 0.3929987
Service 3.0597698 0.5705031
So sánh với đầu ra từ lm()
:
# using lm()
names(dfData)
summary(lm(Price ~ InMichelin + Food + Decor + Service, data = dfData))
tạo ra đầu ra:
Call:
lm(formula = Price ~ InMichelin + Food + Decor + Service, data = dfData)
Residuals:
Min 1Q Median 3Q Max
-20.898 -5.835 -0.755 3.457 105.785
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -57.6004 9.2337 -6.238 3.84e-09 ***
InMichelin 1.9931 2.6357 0.756 0.451
Food 0.2006 0.6683 0.300 0.764
Decor 2.2049 0.3930 5.610 8.76e-08 ***
Service 3.0598 0.5705 5.363 2.84e-07 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 13.55 on 159 degrees of freedom
Multiple R-squared: 0.6344, Adjusted R-squared: 0.6252
F-statistic: 68.98 on 4 and 159 DF, p-value: < 2.2e-16
solve()
chức năng. Điều này sẽ khá lâu hơn một chút nếu không có đại số ma trận. Có cách nào ngắn gọn để thực hiện dòng cụ thể đó chỉ với các toán tử cơ bản không?
Một phần câu trả lời của Ocram là sai. Thực ra:
Và nhận xét của câu trả lời đầu tiên cho thấy cần giải thích thêm về phương sai của hệ số:
Cảm ơn, tôi bỏ qua chiếc mũ trên bản beta đó. Khấu trừ ở trên là . Kết quả đúng là:
1.(Để có phương trình này, hãy đặt đạo hàm bậc nhất của trên bằng 0, để tối đa hóa )
2.
3.
Hy vọng nó sẽ giúp.