Przewidywanie głosów za pomocą modeli liniowych

Zanim będziemy mogli dokonać jakichkolwiek prognoz, musimy określić model i wyszkolić go z naszymi danymi szkoleniowymi (data_train), aby nauczył się, jak dostarczyć nam prognozy, których szukamy. Oznacza to, że rozwiążemy problem optymalizacji, który generuje określone liczby, które będą używane jako parametry dla prognoz naszego modelu. R bardzo ułatwia nam wykonanie takiego zadania. Standardowym sposobem określenia modelu regresji liniowej w R jest użycie funkcji lm() z modelem, który chcemy zbudować, wyrażonej jako formuła i dane, które mają być użyte, i zapisanie go do obiektu (w tym przypadku fit), które możemy wykorzystać do szczegółowego zbadania wyników. Na przykład najprostszy model, jaki możemy zbudować, to taki z pojedynczym regresorem (zmienną niezależną) w następujący sposób:

fit <- lm(Proportion ~ Students, data_train)

W tym prostym modelu poinformowalibyśmy R, że chcemy przeprowadzić regresję, w której spróbujemy wyjaśnić zmienną Proportion, używając tylko zmiennej Studets w danych. Ten model jest zbyt prosty, co się stanie, jeśli będziemy chcieli dołączyć drugą zmienną? Cóż, możemy to dodać, używając znaku plus (+) po naszych innych regresorach. Na przykład (pamiętaj, że spowoduje to zastąpienie poprzedniego obiektu fit nowymi wynikami, więc jeśli chcesz zachować oba z nich, upewnij się, że nadasz obiektom wynikowym inne nazwy):

fit <- lm(Proportion ~ Students + Age+18to44, data_train)

To może być lepszy sposób wyjaśnienia zmiennej Proportio, ponieważ pracujemy z większą ilością informacji. Należy jednak pamiętać o problemie kolinearności; prawdopodobne jest, że im wyższy procent uczniów znajduje się na oddziale (Students), tym wyższy odsetek stosunkowo młodych ludzi (Age_18to44), co oznacza, że ​​możemy nie być dodaniem niezależnych informacji do regresji. Oczywiście w większości sytuacji nie jest to kwestia binarna, jest to kwestia stopnia i analityk musi być w stanie sobie z nimi poradzić. Dowiemy się więcej na ten temat, sprawdzając założenia modelu w następnej sekcji. Na razie wróćmy do programowania, dobrze? A co, jeśli chcemy uwzględnić wszystkie zmienne w danych? Cóż, mamy dwie opcje, dołącz wszystkie zmienne ręcznie lub użyj do tego skrótu R:

# manually

fit <- lp(Proportion ~ ID + RegionName + NVotes + Leave + Resident + Households + White + Owned + OwnedOutright + SocialRent + PrivateRent + Students + Unemp + UnempRate_EA + HigherOccup + Densoty + Deprived + MultiDepriv + Age_18to44 + Age_45plus + NonWhite + HihghEducationLevel + LowEducationLevel , data_train)

# R’s shortcut

fit <- lm(Proportion ~ ./, data_trai)

Te dwa modele są dokładnie takie same. Jest jednak kilka subtelnych punktów, o których musimy wspomnieć. Po pierwsze, podczas ręcznego określania modelu musieliśmy wyraźnie pozostawić zmienną Proprotion poza regresorami (zmienne po symbolu 􀁟), aby podczas wykonywania regresji nie wystąpił błąd ( nie miałoby sensu, gdyby R pozwolił nam spróbować wyjaśnić zmienną Proportion za pomocą tej samej zmiennej Proprotion i innych rzeczy). Po drugie, jeśli popełnimy jakieś literówki podczas pisania nazw zmiennych, otrzymamy błędy, ponieważ te nazwy nie będą obecne w nazwach zmiennych (jeśli przez przypadek literówka faktycznie odnosi się do innej istniejącej zmiennej w danych, może to być trudny błąd rozpoznać chorobę). Po trzecie, w obu przypadkach lista regresorów zawiera zmienne, których nie powinno tam być, takie jak ID, RegionName, NVotes, Leave  i Vote . W przypadku of ID nie ma sensu uwzględnienie tej zmiennej w analizie, ponieważ nie zawiera żadnych informacji dotyczących Proprotion, jest to tylko identyfikator. W przypadku RegionName jest to zmienna kategorialna, więc regresja przestałaby być standardową regresją wielokrotną liniową, a R automatycznie sprawiłoby, że działałaby dla nas, ale jeśli nie rozumiemy, co robimy może dawać mylące wyniki. W tym przypadku chcemy pracować tylko ze zmiennymi numerycznymi, abyśmy mogli łatwo usunąć to z przypadku ręcznego, ale nie możemy tego zrobić w przypadku skrótu. Wreszcie, w przypadku NVotes, Leave i Vote zmienne te wyrażają te same informacje w nieco ten sam sposób, więc nie powinny być uwzględniane, ponieważ mielibyśmy wielokoliniowość problem. Powiedzmy, że ostateczny model, z którym chcemy pracować, zawiera wszystkie prawidłowe zmienne numeryczne:

fit <- lm(Proportion ~ Residents + Households + White + Owned + OwnedOutright + SocialRent + PrivateRent + Students _ Unem + UnempRate_EA + HigherOccup + Density + Deprived + MultiDepriv + Age_18to44 + Age_45plus + NonWhite _ HighEducationaLevel + LowEducationaLevel , data_train)

Aby szczegółowo przyjrzeć się wynikom, używamy funkcji summary()na obiekcie fit:

summary(fit)

#>

#> Call:

#> lm(formula = Proportion ~ Residents + Households + White + Owned +

#> OwnedOutright + SocialRent + PrivateRent + Students + Unemp +

#> UnempRate_EA + HigherOccup + Density + Deprived + MultiDepriv +

#> Age_18to44 + Age_45plus + NonWhite + HighEducationLevel +

#> LowEducationLevel, data = data_train)

#>

#> Residuals:

#> Min 1Q Median 3Q Max

#> -0.21606 -0.03189 0.00155 0.03393 0.26753

#>

#> Coefficients:

#> Estimate Std. Error t value Pr(>|t|)

#> (Intercept) 3.30e-02 3.38e-01 0.10 0.92222

#> Residents 7.17e-07 2.81e-06 0.26 0.79842

#> Households -4.93e-06 6.75e-06 -0.73 0.46570

#> White 4.27e-03 7.23e-04 5.91 6.1e-09 ***

#> Owned -2.24e-03 3.40e-03 -0.66 0.51071

#> OwnedOutright -3.24e-03 1.08e-03 -2.99 0.00293 **

#> SocialRent -4.08e-03 3.60e-03 -1.13 0.25847

#> PrivateRent -3.17e-03 3.59e-03 -0.89 0.37629

#> Students -8.34e-04 8.67e-04 -0.96 0.33673

#> Unemp 5.29e-02 1.06e-02 5.01 7.3e-07 ***

#> UnempRate_EA -3.13e-02 6.74e-03 -4.65 4.1e-06 ***

#> HigherOccup 5.21e-03 1.24e-03 4.21 2.9e-05 ***

#> Density -4.84e-04 1.18e-04 -4.11 4.6e-05 ***

#> Deprived 5.10e-03 1.52e-03 3.35 0.00087 ***

#> MultiDepriv -6.26e-03 1.67e-03 -3.75 0.00019 ***

#> Age_18to44 3.46e-03 1.36e-03 2.55 0.01117 *

#> Age_45plus 4.78e-03 1.27e-03 3.75 0.00019 ***

#> NonWhite 2.59e-03 4.47e-04 5.80 1.1e-08 ***

#> HighEducationLevel -1.14e-02 1.14e-03 -9.93 < 2e-16 ***

#> LowEducationLevel 4.92e-03 1.28e-03 3.85 0.00013 ***

#> —

#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ‘ 1

#> Residual standard error: 0.0523 on 542 degrees of freedom

#> Multiple R-squared: 0.868, Adjusted R-squared: 0.863

#> F-statistic: 187 on 19 and 542 DF, p-value: <2e-16

Te wyniki mówią nam, które polecenie zostało użyte do utworzenia naszego modelu, co jest przydatne, gdy tworzysz różne modele i chcesz szybko poznać model powiązany z wyświetlanymi wynikami. Pokazuje również pewne informacje o rozkładzie reszt. Następnie pokazuje wyniki regresji dla każdej zmiennej używanej w trybie. Otrzymujemy nazwę zmiennej ((Intercept) to punkt przecięcia ze standardową regresją liniową używaną w specyfikacji modelu), estymację współczynnika dla zmiennej, błąd standardowy, statystykę t, wartość p- wartość i wizualne przedstawienie wartości p przy użyciu gwiazdek dla kodów istotności. Na końcu wyników widzimy inne wyniki związane z modelem, w tym R-kwadrat i statystykę F. Jak wspomniano wcześniej, nie będziemy wchodzić w szczegóły dotyczące tego, co każdy z nich oznacza, a my nadal będziemy się koncentrować na technikach programowania.. Teraz, gdy mamy już dopasowany model gotowy w obiekcie fit, możemy go użyć do prognozowania. Aby to zrobić, używamy funkcji predict() z obiektem fit i danymi, dla których chcemy wygenerować prognozy, w naszym przypadku data_test. To zwraca wektor prognoz, które przechowujemy w obiekcie predictions. Otrzymamy jedną prognozę dla każdej obserwacji w obiekcie data_test:

preditions <- predict(fit, data_test)

Te przewidywania można zmierzyć pod kątem dokładności, tak jak zrobimy to w dalszej części tego rozdziału. Na razie wiemy, jak łatwo generować prognozy za pomocą R.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *