2013-08-19 15 views
7

Mam model liniowy, w którym jedna z niezależnych zmiennych jest czynnikiem i gdzie próbuję tworzyć prognozy na zestawie danych, który zawiera nowy poziom czynnika (poziom czynnika, który nie był w zestawie danych model został oszacowany). Chcę być w stanie przewidzieć obserwacje z nowym poziomem czynników, ręcznie określając współczynnik, który zostanie zastosowany do czynnika. Załóżmy na przykład, że szacuję dzienne wielkości sprzedaży dla trzech typów sklepów i wprowadzam do zbioru danych czwarty typ magazynu. Nie mam żadnych danych historycznych, ale mógłbym założyć, że zachowa się jak ważona kombinacja innych sklepów, dla których mam współczynniki modelu.Ręczne ustawienie współczynnika dla nowego poziomu czynnika przy przewidywaniu

Jeśli spróbuję zastosować predict.lm() do nowych danych, otrzymam błąd informujący mnie, że czynnik ma nowe poziomy (to ma sens).

df <- data.frame(y=rnorm(100), x1=factor(rep(1:4,25))) 
lm1 <- lm(y ~ x1, data=df) 
newdata <- data.frame(y=rnorm(100), x1=factor(rep(1:5,20))) 
predict(lm1, newdata) 

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
    factor x2 has new levels 5 

Mogłem ręcznie przewidzieć, po prostu pomnożyć współczynniki przez poszczególne kolumny w data.frame. Jest to jednak kłopotliwe, biorąc pod uwagę, że prawdziwy model, z którym pracuję, ma wiele zmiennych i terminów interakcji, a ja chcę być w stanie łatwo przełączać się między różnymi specyfikacjami modelu, zmieniając formułę modelu. Czy istnieje sposób, aby zasadniczo dodać nowy współczynnik do obiektu modelu, a następnie użyć go do tworzenia prognoz? Jeśli nie, czy istnieje inne podejście, które jest mniej kłopotliwe niż ręczne ustawienie całego kroku przewidywania?

+0

'? Update' może pokazać, jak manipulować formułą programowo bez uciekania się do używania łańcuchów. – dardisco

+0

Bardziej szczegółowe informacje na temat tego, jak chcesz przewidzieć nowy poziom, będą dobre. "Pewna kombinacja ważona" nie jest zbyt precyzyjna. –

+0

Jeśli chcesz wypróbować to w wielu modelach i przy różnych wartościach współczynników dla dodatkowego poziomu czynników, możesz napisać funkcję, która to zrobi. Chciałbym wydobyć "model.matrix" i "współczynniki" z obiektu Lm, wstawić poziom czynnika i współczynnik, a następnie użyć mnożenia macierzy w celu uzyskania prognoz. – Edwin

Odpowiedz

1

Assumming chcesz być na poziomie 5 równo ważony, można konwertować do matrycy, podłącz w 25%, i pomnożyć ją przez współczynniki z modelu ...

n.mat <- model.matrix(~x1, data=newdata) 
n.mat[n.mat[,5] == 1, 2:4] <- .25 
n.mat <- n.mat[,-5] 
n.prediction <- n.mat %*% coef(lm1) 
0

Oto co może:

  1. Za pomocą rbind ułożyć stos treningu i zestawów danych testowych.
  2. Factorize predyktorów.
  3. Podziel stos z powrotem na szkolenie i testuj zestawy danych.

W ten sposób wszystkie poziomy będą obecne w obu zestawach danych.

Powiązane problemy