2015-02-26 2 views
1

У меня есть набор данных, который имеет имена, значение 1 и значение 2. Мне нужно запустить регрессию и получить t-статистику для каждого из имен. Я получил помощь в StackOverflow при построении линейной модели. Я заметил, что иногда я получаю данные 0. Все в порядке, и я хочу, чтобы модель продолжала работать, а не бомбить. Однако, когда там находятся 0, линейная модель бомб.Ошибка в линейной модели при значениях 0

v1<-rnorm(1:50) 
    v2<-rnorm(1:50) 
    data<-data.frame(v1,v2) 
    data[1:50,"nm"]<-"A" 
    data[50:100,"nm"]<-"B" 
    data[50:100,"v1"]<-0 
    data[50:100,"v2"]<-0 
    data<-data[c("nm","v1","v2")] 

    ## run regression and generate universe 
    plyrFunc <- function(x){ 
     mod <- lm(v1~v2, data = x) 
     return(summary(mod)$coefficients[2,3]) 
    } 

    lm <- ddply(data, .(nm), plyrFunc) 

Как вы можете видеть, для названия B, так как все 0, модель бомб. Я не могу просто удалить все 0, потому что часто значения действительно равны 0.

Я не знаю, как редактировать приведенный выше код, чтобы он продолжал двигаться.

Может ли кто-нибудь сообщить мне? Спасибо!

ответ

1

модель на самом деле работает отлично, это Подменит из summary(mod)$coefficients, который бросает вам ошибку, потому что он содержит только одну строки в всех нулях случае:

> summary(lm(v1~v2,data[data$nm=="A",]))$coefficients 
       Estimate Std. Error t value Pr(>|t|) 
(Intercept) -0.1462766 0.1591779 -0.9189503 0.3628138 
v2   -0.1315238 0.1465024 -0.8977590 0.3738900 

> summary(lm(v1~v2,data[data$nm=="B",]))$coefficients 
      Estimate Std. Error t value Pr(>|t|) 
(Intercept)  0   0  NaN  NaN 

Таким образом, вы должны изменить вашу функцию принять этот случай во внимание:

plyrFunc <- function(x){ 
    mod <- lm(v1~v2, data = x) 
    res <- summary(mod)$coefficients 
    if (nrow(res)>1) res[2,3] else NA 
} 

library(plyr) 
result <- ddply(data, .(nm), plyrFunc) 

Выход для набора образцов данных:

nm   V1 
1 A -0.1825896 
2 B   NA 
Смежные вопросы