система вычислительно сингулярная ошибка из линейной гипотезы, но матрица имеет максимальный ранг - PullRequest
0 голосов
/ 06 апреля 2020

Я выполняю Mincer Zarnowitz, чтобы проверить правильность соответствия регрессии временного ряда. Тест (https://eranraviv.com/volatility-forecast-evaluation-in-r/) сводится, во-первых, к выполнению регрессии наблюдений по установленным значениям, и, во-вторых, к совместному тесту, в котором перехват регрессии равен 0, и коэффициент подогнанные значения - 1.

Я приложил первые 20 наблюдений моих векторов наблюдений (obs) и подогнанные значения (fit) - это дает ту же ошибку со всем набором данных. Используя R, я сначала запускаю регрессию (MZ2) obs на fit и сохраняю ее. Затем я использую функцию linearHypothesis в пакете car, чтобы проверить объединенные гипотезы выше. Ранг матрицы (MZ2$model) максимален (2), поэтому матрица обратима. Все же я получаю ошибку Error in solve.default(vcov.hyp) : system is computationally singular: reciprocal condition number = 6.22676e-17. Код работает для проверки одной гипотезы.

Я не понимаю, почему я получаю эту ошибку. Параметр summary vcov должен был вернуть ту же ошибку для вычисления асимптотических c (устойчивых) стандартных ошибок, но это не так.

Есть идеи по поводу этой ошибки? Спасибо.

obs <-c(13964892, 10615134, 12066946,  8394110,  8991798, 12456120,  8981580,
        9261421, 12976910, 19263428,  6453574,  9025350, 12455365,  9711284,
        14876416, 11643567,  8383892, 10234233,  7601169, 10136608)
fit <- c(12478069, 11826724, 10706274, 10573869, 10413272, 10789469,
        9401626, 10067159, 12939216, 11535966, 10890038, 10634312, 11122152,
        11309619, 10877766, 10330747, 10034014, 10912567,  9204140,  9532570)
MZ2 <- lm(obs ~ fit)
summary(MZ2, vcov = vcovHC, type = "HC3")
  # Call:
  #   lm(formula = obs ~ fit)
  # 
  # Residuals:
  #   Min       1Q   Median       3Q      Max 
  # -4605688 -1518159  -543282  1318148  7130691 
  # 
  # Coefficients:
  #   Estimate    Std. Error t value Pr(>|t|)  
  # (Intercept) -7039028.9827  6717707.9500  -1.048   0.3086  
  # fit                1.6619        0.6209   2.676   0.0154 *
  #   ---
  #   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  # 
  # Residual standard error: 2565000 on 18 degrees of freedom
  # Multiple R-squared:  0.2847,    Adjusted R-squared:  0.2449 
  # F-statistic: 7.163 on 1 and 18 DF,  p-value: 0.0154
#
# JOINT TEST
#
require(car)
linearHypothesis(MZ2, c("(Intercept) = 0", "fit = 1"))
Error in solve.default(vcov.hyp) : 
  system is computationally singular: reciprocal condition number = 6.22676e-17
In addition: Warning message:
In constants(lhs, cnames_symb) : NAs introduced by coercion
> MZ2$rank
[1] 2
#
# UNIVARIATE TESTS
#
linearHypothesis(MZ2, c("(Intercept) = 0"))
Linear hypothesis test

Hypothesis:
(Intercept) = 0

Model 1: restricted model
Model 2: obs ~ fit

  Res.Df             RSS Df     Sum of Sq     F Pr(>F)
1     19 125618245448671                              
2     18 118396383219614  1 7221862229057 1.098 0.3086
> linearHypothesis(MZ2, c("fit = 1"))
Linear hypothesis test

Hypothesis:
fit = 1

Model 1: restricted model
Model 2: obs ~ fit

  Res.Df             RSS Df     Sum of Sq      F Pr(>F)
1     19 125870444423604                               
2     18 118396383219614  1 7474061203991 1.1363 0.3005

1 Ответ

1 голос
/ 07 апреля 2020

Ваши значения довольно велики, поэтому, когда необходимо рассчитать RSS (где вы возводите в квадрат остатки) или перестроить модель, в какой-то момент числа могут оказаться слишком большими для машины. Это похоже на то, что обсуждалось здесь

В идеале вы go возвращаетесь к линейной модели, которая дает вам прогноз, и масштабируете свою зависимую переменную, например, делите на 1e3 или 1e6.

То, что у вас есть сейчас, вы можете сделать (и проверить гипо):

df = data.frame(obs=obs/1e6,fit=fit/1e6)
MZ2 <- lm(obs ~ fit,data=df)
library(car)
linearHypothesis(MZ2, c("(Intercept) = 0", "fit = 1"))

Linear hypothesis test

Hypothesis:
(Intercept) = 0
fit = 1

Model 1: restricted model
Model 2: obs ~ fit

  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     20 126.05                           
2     18 118.40  2    7.6573 0.5821 0.5689
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...