2012-02-17 2 views
7

В R, как я могу рассчитать устойчивые стандартные ошибки, используя vcovHC(), когда некоторые коэффициенты отбрасываются из-за особенностей? Стандартная функция lm, по-видимому, делает мелкие вычисления стандартных стандартных ошибок для всех фактически оцененных коэффициентов, но vcovHC() выдает ошибку: «Ошибка в хлебе.% *% Мяса.: Несоответствующие аргументы».R вычислять надежные стандартные ошибки (vcovHC) для модели lm с особенностями

(Фактические данные, которые я использую, несколько сложнее. Фактически, это модель, использующая два разных фиксированных эффекта, и я сталкиваюсь с локальными особенностями, от которых я не могу просто избавиться. По крайней мере, я не знаю как. Для двух фиксированных эффектов я использую первый коэффициент, имеющий 150 уровней, второй - 142 уровня, и в общей сложности 9 сингулярностей являются результатом того, что данные были собраны в десять блоков.)

Здесь мой выход:

Call: 
lm(formula = one ~ two + three + Jan + Feb + Mar + Apr + May + 
Jun + Jul + Aug + Sep + Oct + Nov + Dec, data = dat) 

Residuals: 
    Min  1Q Median  3Q  Max 
-130.12 -60.95 0.08 61.05 137.35 

Coefficients: (1 not defined because of singularities) 
       Estimate Std. Error t value Pr(>|t|)  
(Intercept) 1169.74313 57.36807 20.390 <2e-16 *** 
two   -0.07963 0.06720 -1.185 0.237  
three   -0.04053 0.06686 -0.606 0.545  
Jan   8.10336 22.05552 0.367 0.714  
Feb   0.44025 22.11275 0.020 0.984  
Mar   19.65066 22.02454 0.892 0.373  
Apr   -13.19779 22.02886 -0.599 0.550  
May   15.39534 22.10445 0.696 0.487  
Jun   -12.50227 22.07013 -0.566 0.572  
Jul   -20.58648 22.06772 -0.933 0.352  
Aug   -0.72223 22.36923 -0.032 0.974  
Sep   12.42204 22.09296 0.562 0.574  
Oct   25.14836 22.04324 1.141 0.255  
Nov   18.13337 22.08717 0.821 0.413  
Dec     NA   NA  NA  NA  
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 69.63 on 226 degrees of freedom 
Multiple R-squared: 0.04878, Adjusted R-squared: -0.005939 
F-statistic: 0.8914 on 13 and 226 DF, p-value: 0.5629 

> model$se <- vcovHC(model) 
Error in bread. %*% meat. : non-conformable arguments 

Вот минимальный код, снятый для воспроизведения ошибки.

library(sandwich) 
set.seed(101) 
dat<-data.frame(one=c(sample(1000:1239)), 
       two=c(sample(200:439)), 
       three=c(sample(600:839)), 
       Jan=c(rep(1,20),rep(0,220)), 
       Feb=c(rep(0,20),rep(1,20),rep(0,200)), 
       Mar=c(rep(0,40),rep(1,20),rep(0,180)), 
       Apr=c(rep(0,60),rep(1,20),rep(0,160)), 
       May=c(rep(0,80),rep(1,20),rep(0,140)), 
       Jun=c(rep(0,100),rep(1,20),rep(0,120)), 
       Jul=c(rep(0,120),rep(1,20),rep(0,100)), 
       Aug=c(rep(0,140),rep(1,20),rep(0,80)), 
       Sep=c(rep(0,160),rep(1,20),rep(0,60)), 
       Oct=c(rep(0,180),rep(1,20),rep(0,40)), 
       Nov=c(rep(0,200),rep(1,20),rep(0,20)), 
       Dec=c(rep(0,220),rep(1,20))) 
model <- lm(one ~ two + three + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec, data=dat) 
summary(model) 
model$se <- vcovHC(model) 
+0

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

+0

К сожалению, моя точка зрения: я не могу удалить сингулярность. Это простой пример набора данных, который я опубликовал. В этом наборе данных я согласен: вы могли бы просто удалить Dec из регрессии, тем самым избавившись от сингулярности, а затем vcovHC() будет работать. В моих фактических данных это немного сложнее, когда сингулярность проистекает из двух фиксированных эффектов со многими уровнями (150 и 142 соответственно). Я не нашел способ избавиться от особенностей в этих данных. – Chris

+3

@ Крис: Вы все еще получаете эту ошибку? После изменения 'Dec' на' c (rep (0,240)) ', чтобы вызвать сингулярность, вызов' vcovHC (model) 'преуспевает без ошибки, которую вы замечаете. В журнале изменений для сандвича 2.2-9: модели lm/mlm/glm с параметрами с псевдонимом были обработаны неправильно (что приводит к ошибкам в сэндвич/vcovHC и т. Д.), Исправлено сейчас. Возможно, это исправлено? – jthetzel

ответ

0

Модель с особенностями никогда не хороша, и они должны быть исправлены. В вашем случае у вас есть 12 коэффициентов за 12 месяцев, но и глобальный перехват! Таким образом, у вас есть 13 коэффициентов для оценки только 12 реальных параметров. То, что вы на самом деле хотите, чтобы отключить глобальный перехват - так что вы будете иметь что-то больше как месяц конкретного перехват:

> model <- lm(one ~ 0 + two + three + Jan + Feb + Mar + Apr + May + Jun + Jul + Aug + Sep + Oct + Nov + Dec, data=dat) 
> summary(model) 

Call: 
lm(formula = one ~ 0 + two + three + Jan + Feb + Mar + Apr + 
    May + Jun + Jul + Aug + Sep + Oct + Nov + Dec, data = dat) 

Residuals: 
    Min  1Q Median  3Q  Max 
-133.817 -55.636 3.329 56.768 126.772 

Coefficients: 
     Estimate Std. Error t value Pr(>|t|)  
two  -0.09670 0.06621 -1.460 0.146  
three 0.02446 0.06666 0.367 0.714  
Jan 1130.05812 52.79625 21.404 <2e-16 *** 
Feb 1121.32904 55.18864 20.318 <2e-16 *** 
Mar 1143.50310 53.59603 21.336 <2e-16 *** 
Apr 1143.95365 54.99724 20.800 <2e-16 *** 
May 1136.36429 53.38218 21.287 <2e-16 *** 
Jun 1129.86010 53.85865 20.978 <2e-16 *** 
Jul 1105.10045 54.94940 20.111 <2e-16 *** 
Aug 1147.47152 54.57201 21.027 <2e-16 *** 
Sep 1139.42205 53.58611 21.263 <2e-16 *** 
Oct 1117.75075 55.35703 20.192 <2e-16 *** 
Nov 1129.20208 53.54934 21.087 <2e-16 *** 
Dec 1149.55556 53.52499 21.477 <2e-16 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 69.81 on 226 degrees of freedom 
Multiple R-squared: 0.9964, Adjusted R-squared: 0.9961 
F-statistic: 4409 on 14 and 226 DF, p-value: < 2.2e-16 

Тогда, это нормальная модель, так что вы не должны иметь никаких проблем с vcovHC.

 Смежные вопросы

  • Нет связанных вопросов^_^