2011-02-10 7 views
6

Me gustaría llamar a predict (...) dentro de una función en R. Tengo algunos problemas relacionados con el alcance, pero no puedo entender qué está mal o Como arreglarlo. ¿Alguien puede ayudar? Ejemplo:Llamando predict() dentro de una función R

df <- data.frame(x=1:20, binary.outcome=1*(runif(20, 0, 1) > 0.60)) 
summary(df) 
logit.model <- glm(df$binary.outcome ~ df$x, family=binomial("logit"), data=df) 
summary(logit.model) 

PredictOnNewData <- function() { 
    df <- data.frame(x=51:100) 
    df$probability <- round(predict(logit.model, df, type="response"), digits=3) 
    return(df) 
} 

PredictOnNewData() 

La última línea falla con:

Error en $<-.data.frame (*tmp*, "probabilidad", valor = c (0,274, 0,282, : reemplazo ha 20 filas, de datos tiene 50 Además: mensaje de advertencia: 'NewData' tenía 50 filas pero variable (s) encontrado tener 20 filas

Si entiendo el mensaje de error correctamente, parece que el objeto df que estoy pasando para predecir (...) se está evaluando como el df en el entorno principal/global. Ese tiene 20 filas y fue utilizado para entrenamiento. Pero quiero que la llamada para predecir (...) se evalúe en el otro marco de datos df, el que creo dentro de la función PredictOnNewData. ¿Cómo puedo hacer que eso ocurra (sin cambiar los nombres de mis marcos de datos)?

[Ahora que vuelvo a leer esto - ¿estoy haciendo esto al revés? En la línea (df $ probability < - ...), uno de los dfs se está evaluando de forma incorrecta, pero ¿cuál es?]

También he intentado obtener ("df", envir = sys. marco()), para ser explícita sobre el deseo del objeto df definida en el marco de función actual:

PredictOnNewData <- function() { 
    df <- data.frame(x=51:100) 
    # df$probability <- round(predict(logit.model, df, type="response"), digits=3) 
    df$probability <- round(predict(logit.model, get("df", envir=sys.frame()), type="response"), digits=3) 
    return(df) 
} 

PredictOnNewData() 

... devuelve el mismo error que la última vez.

Por favor ayuda!


Es definitivamente posible llamar a predecir en un marco de datos más grande que lo que se usó como datos de entrenamiento. Un ejemplo (se ejecuta correctamente):

df <- data.frame(x=1:20, binary.outcome=1*(runif(20, 0, 1) > 0.60)) 
summary(df) 
logit.model <- glm(df$binary.outcome ~ df$x, family=binomial("logit"), data=df) 
summary(logit.model) 
df <- data.frame(x=1:100) 
df$probability <- round(predict(logit.model, df, type="response"), digits=3) 
df 

eso es exactamente lo que quiero hacer - excepto que yo quiero la segunda df para ser creado por una función. ¿Cómo puedo hacer eso?

Respuesta

8

Debe usar los argumentos de datos y fórmula correctamente si desea que predict funcione correctamente. El argumento de datos es un marco de datos y el argumento de fórmula se compone de nombres de columnas y operadores (de fórmulas). Tampoco me gusta la extrapolación salvaje implícita fuera del rango del dominio de desarrollo, pero lo ignoraremos por el momento. Pruebe esta modificación menor:

df <- data.frame(x=1:20, binary.outcome=1*(runif(20, 0, 1) > 0.60)) 
summary(df) 
logit.model <- glm(binary.outcome ~ x, family=binomial("logit"), data=df) 
summary(logit.model) 

PredictOnNewData <- function() { 
    df <- data.frame(x=51:100) 
    df$probability <- round(predict(logit.model, newdata=df, type="response"), digits=3) 
    return(df) 
} 

PredictOnNewData() 
Cuestiones relacionadas