Prever () – Talvez eu não esteja entendendo

Eu postei hoje cedo sobre um erro que eu estava usando a function de predict . Consegui corrigir isso e pensei que estava no caminho certo.

Eu tenho um número de observações (factuais) e tenho alguns pontos de dados que eu quero extrapolar ou prever. Eu usei o lm para criar um modelo e, em seguida, tentei usar o predict com o valor real que servirá como a input do preditor.

Este código é todo repetido a partir do meu post anterior, mas aqui 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  model Call: lm(formula = df$Total ~ df$Coupon) Coefficients: (Intercept) df$Coupon 107286259 1349 

Prever código (com base na ajuda anterior):

(Estes são os valores de previsão que eu quero usar para obter o valor previsto)

 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) 

Agora, quando eu executo isso, recebo esta mensagem de erro:

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

Meu quadro de dados original que eu usei para construir o modelo tinha 21 observações nele. Agora estou tentando prever 3 valores com base no modelo.

Eu realmente não entendo essa function ou tenho um erro no meu código.

Ajuda seria apreciada.

obrigado

Primeiro, você quer usar

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

não model < -lm(df$Total ~ df$Coupon, data=df) .

Segundo, dizendo lm(Total ~ Coupon) , você está ajustando um modelo que usa Total como a variável de resposta, com o Coupon como preditor. Ou seja, seu modelo é da forma Total = a + b*Coupon , com b os coeficientes a serem estimados. Note que a resposta vai do lado esquerdo do ~ e do preditor (es) à direita.

Por isso, quando você solicita a R para fornecer valores preditos para o modelo, é necessário fornecer um conjunto de novos valores de previsão , isto é, novos valores de Coupon , não Total .

Em terceiro lugar, a julgar pela sua especificação de newdata , parece que você está realmente depois de um modelo para encheckboxr o Coupon como uma function do Total , e não o contrário. Para fazer isso:

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

Obrigado Hong, esse era exatamente o problema que eu estava enfrentando. O erro que você obtém sugere que o número de linhas está errado, mas o problema é que o modelo foi treinado usando um comando que termina com nomes errados para os parâmetros.

Este é realmente um detalhe crítico que é totalmente não-óbvio para lm e assim por diante. Alguns dos tutoriais fazem referência a fazer linhas como lm(olive$Area@olive$Palmitic) – terminando com nomes variables ​​de oliveira $ Area NOT Area, então criar uma input usando anewdata< -data.frame(Palmitic=2) pode então ser usado. Se você usar lm(Area@Palmitic,data=olive) , os nomes das variables ​​estarão corretos e a previsão funcionará.

O problema real é que a mensagem de erro não indica o problema:

Mensagem de aviso: 'anewdata' tinha 1 linhas, mas variável (s) encontradas para ter linhas X

Em vez de newData você está usando newdate no seu código de previsão, verifique uma vez. e apenas use o Coupon$estimate < - predict(model, Coupon) Ele vai funcionar.

Para evitar erros, um ponto importante sobre o novo dataset é o nome da variável independente. Deve ser o mesmo que o relatado no modelo. Outra maneira é aninhar as duas funções sem criar um novo dataset

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