2015-08-04 9 views
9

Sto utilizzando il pacchetto dplyr/broom per eseguire regressioni lineari per più sensori. La funzione glance() di broom non funzionerà quando uso lm() all'interno dell'istruzione do, ma lo farò se uso biglm(). Questo non sarebbe un problema, ma mi piacerebbe che r^2, F-Statistic e p-val che lo sguardo ritorni abbastanza bene per il tradizionale lm().Errore di ghiera/Dplyr con colpo d'occhio() quando si utilizza lm invece di biglm

Ho guardato altrove e non riesco a trovare un caso simile con questo errore:

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

possibili intuizioni:

?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." 

Ecco il codice:

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 

odio caricare l'intero frame di dati perché so che di solito non è accettabile su S/O, ma non sono sicuro di poter creare un riproducibl esempio senza farlo. https://www.dropbox.com/s/pt6xe4jdxj743ka/testdf.Rda?dl=0

R informazioni sulla sessione su pastebin se lo si desidera here!

+0

posso riprodurre questo quando almeno un coefficiente non è definito a causa della singolarità del modello e quindi non statistica F viene restituito nell'oggetto 'lm' - così' glance' letteralmente non riesce a trovare 'fstatistic'. – aosmith

risposta

6

Sembra un cattivo modello in ErrorDf. L'ho diagnosticato eseguendo un ciclo for.

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

sembra che nessun coefficiente per value potrebbe essere stimato per il modello # 94. Non ho fatto alcuna ulteriore indagine, ma si porta in primo piano l'interessante questione di come broom dovrebbe gestire questo.

3

Mi sono imbattuto in questo post dopo aver riscontrato lo stesso problema. Se lm() non funziona perché alcuni gruppi hanno troppo pochi casi, è possibile risolvere il problema pre-filtrando i dati per rimuovere questi raggruppamenti prima di eseguire il ciclo do(). Il codice generico qui sotto mostra come si possano filtrare i gruppi con meno di 30 punti dati.

0

Ho scritto una funzione per risolvere questo problema dopo aver trovato questo post nella mia risoluzione dei problemi. Probabilmente i manutentori del pacchetto avranno una soluzione più intelligente, ma penso che dovrebbe funzionare nella maggior parte dei casi. Grazie a @Benjamin per l'ispirazione del loop.

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) 
}