He encontrado peculiaridad mientras que el uso de predecir y lm función en R. me dieron resultados diferentes para el marco de datos y de vectores para los mismos datos.

DataFrame código:

data(mtcars)
fitCar<-lm(mtcars$mpg~mtcars$wt)
predict(fitCar,
        data.frame(x=mean(mtcars$wt)),
        interval="confidence")

De salida:

     fit       lwr      upr
1  23.282611 21.988668 24.57655
2  21.919770 20.752751 23.08679
3  24.885952 23.383008 26.38890
4  20.102650 19.003004 21.20230
5  18.900144 17.771469 20.02882
6  18.793255 17.659216 19.92729
7  18.205363 17.034274 19.37645
8  20.236262 19.136179 21.33635
9  20.450041 19.347720 21.55236
10 18.900144 17.771469 20.02882
11 18.900144 17.771469 20.02882
12 15.533127 14.064349 17.00190
13 17.350247 16.104455 18.59604
14 17.083024 15.809403 18.35664
15  9.226650  6.658271 11.79503
16  8.296712  5.547468 11.04596
17  8.718926  6.052112 11.38574
18 25.527289 23.927797 27.12678
19 28.653805 26.519252 30.78836
20 27.478021 25.554415 29.40163
21 24.111004 22.715653 25.50635
22 18.472586 17.319886 19.62529
23 18.926866 17.799465 20.05427
24 16.762355 15.452833 18.07188
25 16.735633 15.423002 18.04826
26 26.943574 25.112491 28.77466
27 25.847957 24.198041 27.49787
28 29.198941 26.963760 31.43412
29 20.343151 19.242185 21.44412
30 22.480940 21.268498 23.69338
31 18.205363 17.034274 19.37645
32 22.427495 21.219818 23.63517

Mensaje de advertencia:

‘nuevosdatos’ tenía 1 fila, pero las variables presentes en los 32 filas

Cuando me separe de datos en el vector, tengo respuesta diferente

El código para que el vector de

predict(fit,data.frame(x=mean(x)), interval="confidence")

De salida:

    fit   lwr   upr
1 20.09 18.99 21.19

¿Cuál es la razón de esta diferencia?

3 Comentarios

  1. 77

    Este es un problema de la utilización de diferentes nombres entre sus data y su newdata y no es un problema entre el uso de vectores o dataframes.

    Cuando se ajustan a un modelo con el lm función y, a continuación, utilizar predict para hacer predicciones, predict intenta encontrar los mismos nombres en su newdata. En el primer caso el nombre de x conflictos con mtcars$wt y, por tanto, de obtener la advertencia.

    Ver aquí un ejemplo de lo que quiero decir:

    Esto es lo que hice y no sale un error:

    a <- mtcars$mpg
    x <- mtcars$wt
    
    #here you use x as a name
    fitCar <- lm(a ~ x) 
    #here you use x again as a name in newdata.
    predict(fitCar, data.frame(x = mean(x)), interval = "confidence") 
    
           fit      lwr      upr
    1 20.09062 18.99098 21.19027

    Ver que en este caso se ajuste a su modelo con el nombre de x y también predecir utilizando el nombre de x en su newdata. De esta manera se consigue ninguna advertencia y que es lo que esperaba.

    Vamos a ver qué pasa cuando voy a cambiar el nombre a algo más cuando me ajuste del modelo:

    a <- mtcars$mpg
    #name it b this time
    b <- mtcars$wt 
    
    fitCar <- lm(a ~ b) 
    #here I am using name x as previously
    predict(fitCar, data.frame(x = mean(x)), interval = "confidence") 
    
             fit       lwr      upr
    1  23.282611 21.988668 24.57655
    2  21.919770 20.752751 23.08679
    3  24.885952 23.383008 26.38890
    4  20.102650 19.003004 21.20230
    5  18.900144 17.771469 20.02882
    Warning message:
    'newdata' had 1 row but variables found have 32 rows 

    La única cosa que yo hice ahora fue cambiar el nombre x cuando se ajusta el modelo a b y predecir utilizando el nombre x en el newdata. Como puedes ver tengo el mismo error en su pregunta.

    Espero que esto está claro ahora!

    • Y por qué me aparece el mismo error en este caso? install.packages("car") library(car) data(Quartet) lmfit = lm(Quartet$y2 ~ poly(Quartet$x,2,raw=TRUE)) newdata = data.frame(x = c(3,6,15)) predict(lmfit, newdata, interval = "confidence", level = 0.95)
    • En su caso, ya de volver a usar la plena Quartet$x nombre de predecir también buscará esta en la newdata. Como no hay Quartet$x en nuevosdatos pero sólo newdata$x se produce un error.
    • También, si usted tiene una nueva pregunta por favor pregunte como uno nuevo. No use los comentarios para hacer diferentes preguntas. Este es un problema diferente de la mencionada en la pregunta.
    • En el último de los dos casos descritos en esta respuesta, ¿qué es R haciendo? ¿Por qué se dan cinco líneas de salida?
  2. 9

    En la fórmula de la función lm no se refieren a las variables mediante el datasetname$variablename patrón. En lugar de utilizar variablename + variablename …Esto no va a lanzar la advertencia: ‘nuevosdatos’ había nrow(de prueba) de la fila, pero las variables presentes en los nrow(tren) filas.

    • Esta es la respuesta correcta
    • Funciona, pero ¿sabes por qué?
  3. 8

    Una forma de evitar esto sin hacer nombres es el uso de los siguientes:

    fitCar<-lm(mpg ~ wt, mtcars) #here you use x as a name
    predict(fitCar,data.frame(wt=mean(mtcars$wt)), interval="confidence") 

Dejar respuesta

Please enter your comment!
Please enter your name here