2015-08-04 2 views
9

Я использую пакет dplyr/broom для выполнения линейных регрессий для нескольких датчиков. Функция glance() из метлы не будет работать, когда я использую lm() в инструкции do, но если я буду использовать biglm(). Это не было бы проблемой, но мне хотелось бы, чтобы r^2, F-Statistic и p-val выглядели очень красиво для традиционного lm().Ошибка метлы/Dplyr с взглядом() при использовании lm вместо biglm

Я посмотрел в другом месте и не могу найти подобный случай с этой ошибкой:

Error in data.frame(r.squared = r.squared, adj.r.squared = adj.r.squared, : 
object 'fstatistic' not found 

Возможных догадок:

?Anova 
"The comparison between two or more models will only be valid if they are 
fitted to the same dataset. This may be a problem if there are missing 
values and R's default of na.action = na.omit is used." 

Вот код:

library(tidyr) 
library(broom) 
library(biglm) # if not install.packages("biglm") 
library(dplyr) 
regressionBig <- tidied_rm_outliers %>% 
group_by(sensor_name, Lot.Tool, Lot.Module, Recipe, Step, Stage, MEAS_TYPE) %>% 
do(fit = biglm(MEAS_AVG ~ value, data = .)) #note biglm is used 

regressionBig 

#extract the r^2 from the complex list type from the data frame we just stored 

glances <- regressionBig %>% glance(fit) 
glances %>% 
    ungroup() %>% 
    arrange(desc(r.squared)) 
#Biglm works but if i try the same thing with regular lm It errors on glance() 

ErrorDf <- tidied_rm_outliers %>% 
    group_by(sensor_name, Lot.Tool, Lot.Module, Recipe, Step, Stage, MEAS_TYPE) %>% 
    do(fit = lm(MEAS_AVG ~ value, data = .)) #note lm is normal 
ErrorDf %>% glance(fit) 

#Error in data.frame(r.squared = r.squared, adj.r.squared = adj.r.squared, : 
#object 'fstatistic' not found 

Я ненавижу чтобы загрузить весь фрейм данных, поскольку я знаю, что он обычно неприемлем для S/O, но я не уверен, что могу создать репродуцирование например, без этого. https://www.dropbox.com/s/pt6xe4jdxj743ka/testdf.Rda?dl=0

R информация о сеансе на пастебине если хотите это here!

+0

я могу воспроизвести это, когда по крайней мере, один коэффициент не определен из-за особенностей модели и поэтому нет F статистики не возвращается в 'lm' объекта - так' glance' буквально не может найти 'fstatistic'. – aosmith

ответ

6

Похоже, что плохая модель в ErrorDf. Я поставил диагноз: for.

for (i in 1:nrow(ErrorDf)){ 
    print(i) 
    glance(ErrorDf$fit[[i]]) 
} 

Похоже, не коэффициент для value может быть оценена для модели # 94. Я не сделал никакого дальнейшего расследования, но это вызывает интересный вопрос о том, как broom должен справиться с этим.

3

Я столкнулся с этим сообщением после столкновения с той же проблемой. Если lm() терпит неудачу, потому что в некоторых группах слишком мало случаев, вы можете решить проблему путем предварительной фильтрации данных для удаления этих группировок перед запуском цикла do(). Общий код ниже показывает, как можно отфильтровать группы с менее чем 30 точками данных.

require(dplyr) 
require(broom) 

data_grp = (data 
    %>% group_by(factor_a, factor_b) 
    %>% mutate(grp_cnt=n()) 
    %>% filter(grp_cnt>30) 
) 
0

Я написал функцию, чтобы справиться с этим после обнаружения этого сообщения в моем поиске и устранении неисправностей. У сторонников пакета, вероятно, будет более умное решение, но я думаю, что он должен работать в большинстве случаев. Спасибо @Benjamin за вдохновение цикла.

collect_glance=function(mdldF){ 
    # mdldF should be a data frame from dplyr/broom with the column 'mdl' for the object models 
    mdlglance=data_frame() #initialize empty dataframe 
    metadF=mdldF %>% slice(0) %>% select(-ncol(mdldF))#create an empty data frame with only the group info 
    i=1 
    for(i in 1:nrow(mdldF)){ 
     # fill in metadata for each group for each modeling iteration 
     for(colnums in 1:ncol(mdldF)-1){ 
      metadF[1,colnames(mdldF)[colnums]]=mdldF[i,colnames(mdldF[colnums])] 
     } 
     # attempt glance(). if succesful, bind to metadata. if not, return empty dataframe 
     gtmp=tryCatch(glance(mdldF$mdl[[i]]) %>% bind_cols(metadF,.), error = function(e) { 
      data_frame() 
     }) 
     # test for empty dataframe. bind to mdlglance data frame if glance was successful. otherwise use full_join to join mdlglance and metadata by group names and get NA for all the other glance columns. 
     if(nrow(gtmp)!=0) { 
      mdlglance=bind_rows(mdlglance,gtmp) 
     } else { 
      mdlglance=full_join(mdlglance,metadF) 
      } 
    } 
    return(mdlglance) 
} 
Смежные вопросы