2012-01-27 13 views
43

I posted earlier today sobre un error que estaba obteniendo al usar la función predict. Pude corregirlo y pensé que estaba en el camino correcto.Predecir() - Tal vez no lo entiendo

Tengo un número de observaciones (reales) y tengo algunos puntos de datos que quiero extrapolar o predecir. Usé lm para crear un modelo, luego traté de usar predict con el valor real que servirá como entrada del predictor.

Este código es todo lo repitió de mi post anterior, pero aquí está:

df <- read.table(text = ' 
    Quarter Coupon  Total 
1 "Dec 06" 25027.072 132450574 
2 "Dec 07" 76386.820 194154767 
3 "Dec 08" 79622.147 221571135 
4 "Dec 09" 74114.416 205880072 
5 "Dec 10" 70993.058 188666980 
6 "Jun 06" 12048.162 139137919 
7 "Jun 07" 46889.369 165276325 
8 "Jun 08" 84732.537 207074374 
9 "Jun 09" 83240.084 221945162 
10 "Jun 10" 81970.143 236954249 
11 "Mar 06" 3451.248 116811392 
12 "Mar 07" 34201.197 155190418 
13 "Mar 08" 73232.900 212492488 
14 "Mar 09" 70644.948 203663201 
15 "Mar 10" 72314.945 203427892 
16 "Mar 11" 88708.663 214061240 
17 "Sep 06" 15027.252 121285335 
18 "Sep 07" 60228.793 195428991 
19 "Sep 08" 85507.062 257651399 
20 "Sep 09" 77763.365 215048147 
21 "Sep 10" 62259.691 168862119', header=TRUE) 

str(df) 
'data.frame': 21 obs. of 3 variables: 
$ Quarter : Factor w/ 24 levels "Dec 06","Dec 07",..: 1 2 3 4 5 7 8 9 10 11 ... 
$ Coupon: num 25027 76387 79622 74114 70993 ... 
$ Total: num 132450574 194154767 221571135 205880072 188666980 ... 

Código:

model <- lm(df$Total ~ df$Coupon, data=df) 

> model 

Call: 
lm(formula = df$Total ~ df$Coupon) 

Coefficients: 
(Intercept) df$Coupon 
    107286259   1349 

Predecir código (basado en la ayuda anterior):

(Estos son los valores del predictor que quiero usar para obtener el valor pronosticado)

Quarter = c("Jun 11", "Sep 11", "Dec 11") 
Total = c(79037022, 83100656, 104299800) 
Coupon = data.frame(Quarter, Total) 

Coupon$estimate <- predict(model, newdate = Coupon$Total) 

Ahora, cuando corro que, me sale este mensaje de error:

Error in `$<-.data.frame`(`*tmp*`, "estimate", value = c(60980.3823396919, : 
    replacement has 21 rows, data has 3 

Mi trama de datos original que he utilizado para construir el modelo tenía 21 observaciones en ella. Ahora estoy tratando de predecir 3 valores basados ​​en el modelo.

O realmente no entiendo esta función, o tengo un error en mi código.

Ayuda sería apreciada.

Gracias

+1

Es casi seguro que necesita utilizar el 'data' argumento de' lm' t conseguir que esto funcione, es decir, 'modelo <- LM (~ Cupón total , data = df) '. Entonces sugeriría 'Cupón $ estimar <- predecir (modelo, newdata = Cupón) $ Total ' –

+0

@BenBolker Estoy de acuerdo con la primera parte, no tan seguro sobre la segunda. Creo que 'predict (model, newdata = Coupon)' debería ser lo que él quiere. – joran

+0

@joran sí, creo que tienes razón. –

Respuesta

65

primer lugar, desea utilizar

model <- lm(Total ~ Coupon, data=df) 

nomodel <-lm(df$Total ~ df$Coupon, data=df).

En segundo lugar, al decir lm(Total ~ Coupon), está ajustando un modelo que usa Total como variable de respuesta, con Coupon como predictor. Es decir, su modelo tiene la forma Total = a + b*Coupon, con a y b los coeficientes a estimar. Tenga en cuenta que la respuesta va en el lado izquierdo de ~ y el (los) predictor (es) a la derecha.

Debido a esto, cuando se pregunta R para dar los valores pronosticados para el modelo, usted tiene que proporcionar un conjunto de nuevas predictor valores, es decir, los nuevos valores de Coupon, no Total.

En tercer lugar, a juzgar por su especificación de newdata, parece que en realidad busca un modelo que se ajuste a Coupon en función de , y no al revés. Para hacer esto:

model <- lm(Coupon ~ Total, data=df) 
new.df <- data.frame(Total=c(79037022, 83100656, 104299800)) 
predict(model, new.df) 
+0

Creo que tienes la fórmula al revés. Además, 'new.df' debe contener' Cupón' en lugar de 'Total'. Además, mi respuesta a la pregunta original también funciona;) –

+1

@ JoshO'Brien: Me estoy saliendo de los nuevos datos que publicó el OP, que especifica los valores de 'Total'. Eso implicaría que realmente está buscando un modelo para predecir el 'Cupón'. –

+0

Pero siempre puso 'Total' en el LHS de la fórmula, ¡como lo hace en la línea de apertura de su publicación! A menos que esté increíblemente confundido, 'Cupón 'está destinado a ser el predictor. (No es que importe tanto como los conceptos que intenta transmitir). –

7

Gracias Hong, ese era exactamente el problema con el que me estaba encontrando. El error que recibe sugiere que el número de filas es incorrecto, pero el problema es que el modelo se ha entrenado usando un comando que termina con los nombres incorrectos para los parámetros.

Esto es realmente un detalle crítico que no es del todo obvio para lm y demás. Algunos de los tutoriales hacen referencia a hacer líneas como lm([email protected]$Palmitic), terminando con los nombres de las variables del área $ Area NOT de olive, por lo que no se puede usar una entrada usando anewdata<-data.frame(Palmitic=2). Si usa lm([email protected],data=olive), los nombres de las variables son correctos y la predicción funciona.

El problema real es que el mensaje de error no indicar el problema en absoluto:

mensaje de advertencia: 'anewdata' tenían 1 filas pero variable (s) encontrado que tienen X filas

+0

Gracias, este es un punto muy importante, recibí el error que mencionaste también.Para aplicar su respuesta a la respuesta de Hong: si la columna en su nuevo.df no se llamó "Total", que es el mismo nombre de columna que el marco de datos original, entonces obtendría el error que usted (y yo) obtuvimos. Por lo tanto, es importante asegurarse de que el nombre de la columna en sus nuevos datos sea el mismo que el del predecesor en su modelo original. – NeonBlueHair

+0

Marcando esto como no una respuesta. El uso del operador '@' indica que estaba tratando con un objeto S4 y que no tiene nada que ver con la pregunta original ni la respuesta. Ha confundido incorrectamente sus dificultades con un problema de tarea no especificado con un problema más simple que fue respondido adecuadamente. –

2

en vez de newdata estás usando newdate en tu código de predicción, verifica una vez. y solo use Coupon$estimate <- predict(model, Coupon) Funcionará.

1

Para evitar errores, un punto importante sobre el nuevo conjunto de datos es el nombre de la variable independiente. Debe ser el mismo que se informa en el modelo. Otra forma es a anidar los dos funciones sin crear un nuevo conjunto de datos

model <- lm(Coupon ~ Total, data=df) 
predict(model, data.frame(Total=c(79037022, 83100656, 104299800))) 
Cuestiones relacionadas