2016-05-17 7 views
0

Ich versuche, eine benutzerdefinierte Funktion zu schreiben. Ich habe den Arbeitscode:Eine benutzerdefinierte Funktion schreiben: Fehler in eval (expr, envir, enclos): Objekt nicht gefunden

m <- lm(age ~ religion * degree * country + gender, WVS) 
e_df <- data.frame(e <- effect("religion:degree:country", m)) 
e_df$predictor <- paste(e_df[,3], e_df[,2], e_df[,1], sep="\n\n") # merge first three columns 
ifelse(names(e_df)=="fit", "age", names(e_df))->names(e_df) # rename column 1 
print(subset(e_df, select = c(predictor, age, se)), digits = 3) 

Ich versuchte, es in die benutzerdefinierte Funktion zu schreiben:

"Fehler

threewaycovar<- function(outcome, V1, V2, V3, covar, d) 
{require(effects) 
m <- lm(outcome ~ V1 * V2 * V3 + covar, d) 
e <- effect("V1:V2:V3", m) 
e_df <- data.frame(e) 
e_df$predictor <- paste(e_df[,3], e_df[,2], e_df[,1], sep="\n\n") # merge  first three columns 
ifelse(names(e_df)=="fit", "outcome", names(e_df))->names(e_df) # rename column 1 
op <-(subset(e_df, select = c(predictor, outcome, se))) 
return(op)} 

jedoch die benutzerdefinierte Funktion hält das Geben mir die Fehlermeldung in eval (expr, envir, enclos): Objekt 'Ergebnis' nicht gefunden ".

Ich bin nicht sicher, warum ich diese Fehlermeldung erhalte. Ich habe versucht, es zu laufen

threewaycovar(WVS$age, WVS$religion, WVS$degree, WVS$country, WVS$gender, WVS) 

mit habe ich diesen Beitrag Error in eval(expr, envir, enclos) - contradiction? und nahm einen Verweis auf Spaltennummern aus, die nach wie vor zu den Ergebnissen, aber meine Funktion bezieht funktioniert nicht. Kann mir jemand sagen, warum meine Funktion nicht funktioniert?

Bearbeite als Antwort auf Kommentare: WVS ist ein Standard-Paket in R enthalten, so dass meine Daten reproduzierbar sind. Mein Traceback ist

14 eval(expr, envir, enclos) 
13 eval(predvars, data, env) 
12 model.frame.default(outcome ~ V1 * V2 * V3 + covar + (V1 + V2 + 
V3 + covar), data = structure(list(poverty = structure(c(1L, 2L, 1L, 3L, 1L, 2L, 3L, 1L, 1L, 1L, 1L, 2L, 1L, 3L, 1L, 3L, 3L, 1L, 2L, 2L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 2L, 1L, 3L, 1L, ... 
11 model.frame(outcome ~ V1 * V2 * V3 + covar + (V1 + V2 + V3 + 
covar), data = structure(list(poverty = structure(c(1L, 2L, 1L, 3L, 1L, 2L, 3L, 1L, 1L, 1L, 1L, 2L, 1L, 3L, 1L, 3L, 3L, 1L, 2L, 2L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 2L, 1L, 3L, 1L, 1L, ... 
10 eval(expr, envir, enclos) 
9 eval(call("model.frame", ff, data = data, subset = subset, na.action = naa), 
envir) 
8 expand.model.frame(mod, all.predictors) 
7 na.omit(expand.model.frame(mod, all.predictors)) 
6 Analyze.model(focal.predictors, mod, xlevels, default.levels, 
formula.rhs, partial.residuals = partial.residuals, quantiles = quantiles, 
x.var = x.var, data = data, typical = typical) 
5 Effect.lm(predictors, mod, vcov. = vcov., ...) 
4 Effect(predictors, mod, vcov. = vcov., ...) 
3 effect.default("V1:V2:V3", m) 
2 effect("V1:V2:V3", m) 
1 threewaycovar(WVS$age, WVS$religion, WVS$degree, WVS$country, 
WVS$gender, WVS) 

Ich versuche, eine Funktion zu machen, die mir die geschätzten Mittelwert und Standardfehler für eine Drei-Wege-Interaktion geben wird für mindestens ein Co-variate steuern. Oben ist was ich bisher versucht habe.

+1

Sie sollten einige Beispieleingabedaten angeben, um Ihr Problem [reproduzierbar] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) zu vereinfachen dir zu helfen. Die Ausgabe von 'traceback()' wäre nützlich, um zu sehen, welche Funktion den Fehler verursacht. Es wäre auch besser zu beschreiben, was Sie versuchen, anstatt nur zu zeigen, wie Sie es versucht haben. Es kann bessere Wege geben, – MrFlick

+1

'ifelse (Namen (e_df) ==" passen "," Ergebnis ", Namen (e_df)) -> Namen (e_df)' – HubertL

+0

@HubertL danke für Ihren Kommentar, aber ich bekomme immer noch die gleiche Fehlermeldung. – Jim

Antwort

3

Das Hauptproblem, das Sie haben, ist, Sie können Variablen nicht einfach in Formeln oder Ausdrücke werfen. Hier ist ein Neuschreiben der Funktion, bei der Sie Spaltennamen als Zeichenfolgen anstelle von Vektorwerten übergeben.

Hier erstellen wir unsere Formel dynamisch als String und behalten dabei die ursprünglichen Namen aus dem Datensatz bei.