2015-10-16 5 views
5

Ich versuche, eine einfache multinomial Regression in R Bootstrap, und ich erhalte eine Fehlermeldung:Bootstrap Multinomiale Regression in R

Error in is.data.frame(data) : object 'd' not found

Was seltsam ist, ist wirklich, dass ich den gleichen Code verwenden (dazu angepasst besonderes Problem) wie in einem Tutorial für Boot-Paket at Quick-R, und das gleiche funktioniert auch, wenn ich andere Funktion (wie lm()) verwenden. Sicher mache ich etwas Dummes, aber ich sehe was nicht. Bitte, wenn jemand helfen kann, würde ich mich sehr freuen.

Dies ist ein Beispiel:

require(foreign) 
require(nnet) 
require(boot) 

# an example for multinomial logistic regression 
ml = read.dta('http://www.ats.ucla.edu/stat/data/hsbdemo.dta') 
ml = ml[,c(5,7,3)] 

bs <- function(formula, data, indices) { 
    d = data[indices,] # allows boot to select sample 
    fit = multinom(formula, data=d) 
    s = summary(fit) 
    return(list(fit$coefficients, fit$standard.errors)) 
} 

# 5 replications 
results = list() 
results <- boot(
    data=ml, statistic=bs, R=5, parallel='multicore', 
    formula=prog~write 
) 
+0

Bitte schreiben Sie die Ausgabe von 'traceback()' in Ihrer Frage. –

+0

Ich habe etwas untersucht, und das könnte zu einer Lösung führen: Es gibt etwas in der Umgebung (gesehen durch Drucken von str (fit) aus der 'bs'-Funktion. Es ist global gesetzt, wenn Sie eine Formel übergeben und Formel haben die Umgebung, in der sie erstellt wurden (siehe Formel) .Sie sehen jedoch nicht, wie Sie es jetzt beheben können. – Heroka

Antwort

0

Der Fehler tritt in dem summary() Teil, auch das von multinom() zurück Objekt nicht coefficients und standard.errors. Es scheint, dass summary.multinom() wiederum den Hessian aus Ihren Daten berechnet, d, die aus irgendeinem Grund (wahrscheinlich ein Problem mit dem Umfang) nicht gefunden werden kann. Eine schnelle Lösung ist Hess = TRUE hinzuzufügen:

bs <- function(formula, data, indices) { 
    d = data[indices,] # allows boot to select sample 
    fit = multinom(formula, data=d, Hess = TRUE) 
    s = summary(fit) 
    return(cbind(s$coefficients, s$standard.errors)) 
} 

# 5 replications 
results = list() 
results <- boot(
    data=ml, statistic=bs, R=5, parallel='multicore', 
    formula=prog~write 
) 
0

Multinomial logistische Regression liefert eine Matrix von Koeffizienten unter Verwendung der coef() Funktion. Dies unterscheidet sich von einem lm oder glm Modell, das einen Vektor von Koeffizienten zurückgibt.

library(foreign)  # read.dta() 
library(nnet)  # multinom() 
require(boot)  # boot() 

# an example for multinomial logistic regression 
ml = read.dta('http://www.ats.ucla.edu/stat/data/hsbdemo.dta') 
ml = ml[,c(5,7,3)] 

names(ml) 

bs <- function(formula, data, indices) { 
    d = data[indices,] # allows boot to select sample 
    fit = multinom(formula, data=d, maxit=1000, trace=FALSE) 
    #s = summary(fit) 
    #return(list(fit$coefficients, fit$standard.errors)) 

    estimates <- coef(fit) 
    return(t(estimates)) 
} 

# enable parallel 

library(parallel) 
cl <- makeCluster(2) 
clusterExport(cl, "multinom") 

# 10000 replications 
set.seed(1984) 

results <- boot(
    data=ml, statistic=bs, R=10000, parallel = "snow", ncpus=2, cl=cl, 
    formula=prog~write 
) 

# label the estimates 

subModelNames <- colnames(results$t0) 
varNames <- rownames(results$t0) 

results$t0 

estNames <- apply(expand.grid(varNames,subModelNames),1,function(x) paste(x,collapse="_")) 

estNames 

colnames(results$t) <- estNames 

# summary of results 

library(car) 

summary(results) 

confint(results, level=0.95, type="norm") 
confint(results, level=0.95, type="perc") 
confint(results, level=0.95, type="bca") 

# plot the results 

hist(results, legend="separate")