У меня есть ситуация, когда у меня есть матрица Х с рангом и все еще нужны коэффициенты регрессии.В частности, я хочу, чтобы коэффициенты с хорошим поведением обеспечивались как base::qr
require(Matrix)
y <- c(230, 192, 195, 180, 200, 185, 0)
X <- new("dgCMatrix", i = c(0L, 1L, 2L, 3L, 4L, 5L, 6L, 0L, 1L, 2L,
3L, 4L, 5L, 1L, 3L, 5L, 2L, 3L, 4L, 5L, 1L, 0L), p = c(0L, 7L,
13L, 16L, 20L, 20L, 21L, 22L), Dim = c(7L, 7L), Dimnames = list(
c("419", "420", "421", "422", "423", "424", ""), c("", "(Intercept)",
"A", "B1", "B2", "B3", "B4")), x = c(0.451764131343143,
0.434020584428936, 0.451764131343143, 0.434020584428936, 0.451764131343143,
0.451764131343143, 0.788669766125214, 0.788669766125214, 0.757693869580585,
0.788669766125214, 0.757693869580585, 0.788669766125214, 0.788669766125214,
0.757693869580585, 0.757693869580585, 0.788669766125214, 0.788669766125214,
0.757693869580585, 0.788669766125214, 0.788669766125214, 0.757693869580585,
0.788669766125214), factors = list())
qrB <- base::qr(X)
qrM <- Matrix::qr(X)
qr.coef(qrB, y)
# (Intercept) A B1 B2 B3 B4
# -8.438370e-14 2.916303e+02 -1.441398e+01 -4.120863e+01 NA -2.381583e+01 NA
qr.coef(qrM, y)
# [1] -9.730332e-01 -1.314143e+16 -1.597833e+01 1.314143e+16 0.000000e+00 1.314143e+16 1.314143e+16
# Warning message:
# In lengths(res@Dimnames) :
# sparseQR_coef(): structurally rank deficient case: possibly WRONG zeros
Итак, оба признают, что нет никакого способа, которым они могут оценить B2 и оценить NA (base
) или ноль (Matrix
)), Я в порядке с любым результатом.Однако base::qr
также признает, что ему нужно отбросить второй столбец, и выбирает последний столбец (непонятно, почему, но это работает), в то время как Matrix::qr
смело подделывает и оценивает число, аналогичное обратному .Machine$double.eps
.
Это также тот случай, когда матрица менее устойчива (простите, я забыл, какого рода) в том, что сумма квадратов меньше от базы
coef <- qr.coef(qrB, y)
coef[is.na(coef)] <- 0
sum((X %*% coef - y)^2)
# [1] 15.17039
sum((X %*% qr.coef(qrM, y) - y)^2)
# [1] 18.58891
Есть ли способ получитьсупер быстрый метод, такой как Matrix::qr
, чтобы работать как base::qr
и давать быстрые, но стабильные результаты?Я понимаю, что это не совсем «большая матрица», отчасти потому, что это MWE.
ответ Бена Болкера здесь и два ответа здесь говорят о разнице междуLapack и Linpack, но эти методы в base::qr
.Я ищу способ получить модифицированные результаты из Matrix::qr
, которые дают коэффициенты, с которыми я могу работать.