Próbuję uruchomić lm () tylko na podzbiorze moich danych i napotkałem problem.
dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data
lm( y ~ ., dt) # Use all x: Works
lm( y ~ ., dt[x3 == 'men']) # Use all x, limit to men: doesn't work (as expected)
Powyższe nie działa, ponieważ w zestawie danych są teraz tylko mężczyźni, dlatego nie możemy włączyć do modelu zmiennej x3, zmiennej płci. ALE...
lm( y ~ . -x3, dt[x3 == 'men']) # Exclude x3, limit to men: STILL doesn't work
lm( y ~ x1 + x2, dt[x3 == 'men']) # Exclude x3, with different notation: works great
Czy to problem z notacją „znak minus” w formule? Proszę o poradę. Uwaga: Oczywiście mogę to zrobić w inny sposób; na przykład, mógłbym wykluczyć zmienne przed umieszczeniem ich w lm (). Ale prowadzę zajęcia na ten temat i nie chcę mylić uczniów, którzy już powiedzieli, że mogą wykluczyć zmienną za pomocą znaku minus w formule.
.aby uzyskać uproszczoną formułę, terms(y ~ . -x3, data=dt, simplify=TRUE)ale dziwnie nadal zachowuje x3atrybut zmiennych, który się lm
neg.out=opcja niezaimplementowana w R może być powiązana. Z plików pomocy S dla terms, gdzie neg.out=jest zaimplementowany: flaga kontrolująca sposób traktowania haseł wprowadzanych znakiem „-”. Jeśli PRAWDA, warunki zostaną sprawdzone pod kątem anulowania i w inny sposób zignorowane. Jeśli FAŁSZ, negatywne warunki zostaną zachowane (w kolejności ujemnej).
lmwywołuje model.matrixzmodyfikowaną wersję danych. Na samym początku, lmkomponuje i ocenia następujące wyrażenie: mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE ). To powoduje, x3że staje się czynnikiem jednopoziomowym. model.matrix()są następnie wywoływane mf, a nie oryginalne dane, co powoduje błąd, który obserwujemy.
model.matrix(y ~ . - x3, data = dt[x3 == "men"])imodel.matrix(y ~ x1 + x2, data = dt[x3 == "men"])praca (lmpołączeniamodel.matrixwewnętrzne). Jedyną różnicą między obiema matrycami modelu jest"contrasts"atrybut (który wciąż zawierax3), który zostaje później wykryty wlmprocedurze, prawdopodobnie powodując błąd, który widzisz. Mam więc wrażenie, że problem dotyczy sposobumodel.matrixtworzenia i przechowywania matrycy projektu podczas usuwania terminów.