Współczynnik R: zmienna kategoryczna i zmienne ciągłe

⚡ Inteligentne podsumowanie

Funkcja Factor w języku R przechowuje dane kategoryczne w postaci wektora kodów całkowitych sparowanego z zestawem poziomów. W ten sposób język oddziela ograniczoną grupę kategorii od ciągłego pomiaru.

  • 🏷️ Struktura: Czynnik zawiera kody całkowite oraz atrybut poziomów, dzięki czemu każda kategoria jest weryfikowana na podstawie ustalonej listy.
  • 🧩 Kreacja: factor() konwertuje wektor znaków, a class() potwierdza zmianę wyniku ze znaku na czynnik.
  • 🔘 Nominalny: Bez argumentu poziomów R sortuje kategorie samodzielnie, więc nie ma żadnego domniemanego rankingu ze względu na kolor skóry lub płeć.
  • 📊 Porządkowy: Przyjęcie wartości ordered = TRUE z wyraźnym wektorem poziomów ustala ranking od najniższego do najwyższego.
  • 🔢 ciągły: Kolumny liczbowe i całkowite domyślnie pozostają ciągłe, jak pokazuje class(mtcars$mpg).
  • ⚠️ Pułapka konwersji: as.numeric() na współczynniku zwraca kody poziomów, dlatego najpierw należy przeczytać etykietę za pomocą levels().
  • ???? Konserwacja: relevel() ustawia linię bazową modelu, a droplevels() czyści kategorie pozostawione przez podzbiór.

Czynnik w zmiennej kategorycznej R i zmiennych ciągłych

Co to jest współczynnik w R?

Czynnik w R to zmienna używana do kategoryzowania i przechowywania danych, mająca ograniczoną liczbę różnych wartości. Przechowuje dane jako wektor wartości całkowitych. Czynnik w R jest również znany jako zmienna kategoryczna, która przechowuje zarówno wartości ciągów znaków, jak i wartości całkowite jako poziomy. Czynnik jest najczęściej używany w modelowaniu statystycznym i eksploracyjnej analizie danych w R.

Wewnętrznie czynnik to dwa obiekty podróżujące razem: wektor całkowity kodów i atrybut znaku o nazwie poziomyKażdy kod jest pozycją w tym wektorze poziomów, dlatego drukowanie czynnika pokazuje słowa, podczas gdy usuń klasę() pokazuje liczby.

W zbiorze danych możemy wyróżnić dwa typy zmiennych: kategoryczny oraz ciągły.

  • W statystyce opisowej zmiennych kategorycznych w R wartość jest ograniczona i zwykle opiera się na określonej skończonej grupie. Na przykład zmienną kategoryczną w R mogą być kraje, rok, płeć, zawód.
  • Zmienna ciągła może jednak przyjmować dowolne wartości, od liczb całkowitych po liczby dziesiętne. Na przykład możemy mieć przychody, cenę akcji itd.

Warto zachować to rozróżnienie, ponieważ R automatycznie wybiera dla każdego z nich inne wartości domyślne. Kolumna liczbowa jest podsumowywana średnią i medianą, a czynnik – liczbą zliczeń na poziomie. Przechowywanie kategorii jako tekstu lub liczby zmienia zatem uzyskaną analizę. Szerszy zestaw trybów przechowywania omówiono w przewodniku. Typy danych i operatory R.

Zmienne kategorialne

Zmienne kategoryczne w R są przechowywane w czynniku. Sprawdźmy poniższy kod, aby przekonwertować zmienną znakową na zmienną czynnikową w R. Wiele procedur modelowania i uczenia maszynowego nie może przetwarzać surowego tekstu, dlatego kategorie muszą zostać zakodowane jako poziomy lub liczby przed dopasowaniem modelu.

Składnia

factor(x = character(), levels, labels = levels, ordered = is.ordered(x))

W dokumentacji podstawowej wersji R udokumentowano dwa kolejne argumenty, których skrócona wersja powyżej nie uwzględnia: wykluczaćktóry usuwa wartości przed utworzeniem zestawu poziomów i nmax, górna granica liczby poziomów, która przyspiesza konwersję bardzo dużych wektorów.

argumenty:

  • x:Wektor danych kategorycznych w R. Musi być ciągiem znaków lub liczbą całkowitą, nie dziesiętną.
  • poziomy: Wektor możliwych wartości przyjmowanych przez x. Ten argument jest opcjonalny. Wartością domyślną jest unikalna lista elementów wektora x, posortowanych rosnąco.
  • Etykiety:Dodaj etykietę do danych kategorycznych x w R. Na przykład, 1 może przyjąć etykietę mężczyzna, a 0 etykietę kobieta.
  • wykluczać:Wektor wartości do usunięcia po utworzeniu zestawu poziomów. Wykluczone wartości stają się wartościami NA w wyniku.
  • zamówiony:Flaga logiczna określająca, czy poziomy należy traktować jako uporządkowane, zgodnie z podaną kolejnością.
  • nmax:Opcjonalne górne ograniczenie liczby poziomów, przydatne w przypadku długich wektorów.

Przykład:

Przekształćmy wektor znaków na czynnik i potwierdźmy zmianę za pomocą class().

# Create gender vector
gender_vector <- c("Male", "Female", "Female", "Male", "Male")
class(gender_vector)
# Convert gender_vector to a factor
factor_gender_vector <-factor(gender_vector)
class(factor_gender_vector)

Wyjście:

## [1] "character"
## [1] "factor"

Klasa przełączyła się ze znaku na czynnik, a nic w wydrukowanych wartościach się nie zmieniło. Ważne jest, aby przekształcić ciąg do zmiennej czynnikowej w R przed zadaniem uczenia maszynowego, ponieważ w tym momencie kategorie stają się ustalonym, sprawdzonym zestawem.

Zmienną kategoryczną w R można podzielić na nominalna zmienna kategoryczna oraz porządkowa zmienna kategoryczna.

Nominalna zmienna kategoryczna

Nominalna zmienna kategoryczna ma kilka wartości, ale ich kolejność nie ma znaczenia. Na przykład mężczyzna lub kobieta. Nominalne zmienne kategoryczne w R nie mają żadnego uporządkowania.

# Create a color vector
color_vector <- c('blue', 'red', 'green', 'white', 'black', 'yellow')
# Convert the vector to factor
factor_color <- factor(color_vector)
factor_color

Wyjście:

## [1] blue   red    green  white  black  yellow
## Levels: black blue green red white yellow

Na podstawie parametru factor_color nie możemy określić kolejności. Lista poziomów jest alfabetyczna tylko dlatego, że nie podano argumentu „levels”, więc R sam posortował unikalne wartości. To sortowanie jest zgodne z aktywnym ustawieniem regionalnym, a nie ze zwykłym kodem ASCII, co jest jednym z powodów, dla których poziomy należy jawnie określać, gdy kolejność ma znaczenie.

Porządkowa zmienna kategoryczna

Zmienne porządkowe kategoryczne mają naturalną kolejność. Ranking wynika z kolejności wektora przekazanego do poziomy Argument, a ordered = TRUE oznacza, że ​​R traktuje tę sekwencję jako ranking, a nie pustą listę. Ustawienie ordered = FALSE nie odwraca rankingu; po prostu generuje zwykły nieuporządkowany czynnik. Aby uszeregować od najwyższego do najniższego, należy odwrócić sam wektor poziomów.

Przykład:

Możemy użyć podsumowania, aby policzyć wartości każdej zmiennej czynnikowej w R.

# Create Ordinal categorical vector 
day_vector <- c('evening', 'morning', 'afternoon', 'midday', 'midnight', 'evening')
# Convert `day_vector` to a factor with ordered level
factor_day <- factor(day_vector, order = TRUE, levels =c('morning', 'midday', 'afternoon', 'evening', 'midnight'))
# Print the new variable
factor_day

Wyjście:

## [1] evening   morning   afternoon midday    
midnight  evening

Konsola najpierw wyświetla wartości, a pod nimi ranking. Kolejny blok otwiera się z wierszem „Levels”, nadal zakomentowanym, więc ranking pozostaje widoczny, podczas gdy wywołanie funkcji summary() jest dołączane do poprzedniego kodu.

## Levels: morning < midday < afternoon < evening < midnight
# Append the line to above code
# Count the number of occurence of each level
summary(factor_day)

Wyjście:

##   morning    midday afternoon   evening  midnight
##         1         1         1         2         1

R uporządkował poziom od „rano” do „północy”, zgodnie z argumentem „levels”. Ponieważ czynnik jest uporządkowany, operatory porównania, takie jak < i >, również na nim działają, czego nie robią w przypadku nominalnego czynnika koloru powyżej.

Zmienne ciągłe

Zmienne klasy ciągłej są wartością domyślną w R. Są one przechowywane jako liczby lub liczby całkowite. Widać to na poniższym zestawie danych. mtcars to wbudowany zbiór danych. Gromadzi on informacje o różnych typach samochodów. Możemy go zaimportować za pomocą mtcars i sprawdzić klasę zmiennej mpg (mila na galon). Zwraca wartość liczbową, co oznacza zmienną ciągłą.

dataset <- mtcars
class(dataset$mpg)

Wydajność

## [1] "numeric"

Nie każda kolumna liczbowa jest rzeczywiście ciągła. W tym samym zbiorze danych cyl zawiera tylko wartości 4, 6 i 8, a am zawiera tylko 0 i 1, więc obie są kategoriami, które są przechowywane jako liczby. Konwersja tych wartości za pomocą funkcji factor() przed modelowaniem zapobiega traktowaniu przez R odstępu między 4 a 6 cylindrami jako wartości mierzonej. Ruch odwrotny, czyli podzielenie ciągłej kolumny na pasma, jest obsługiwany przez funkcję cut().

Poziomy czynników i etykiety w R

Atrybut poziomów to część współczynnika, na której dostosowywanie poświęcisz najwięcej czasu, ponieważ kontroluje on zarówno to, co jest drukowane, jak i to, co model traktuje jako linię bazową. Cztery podstawowe atrybuty pomocnicze R pokrywają niemal każdy przypadek.

Funkcjonować Co to robi Typowe zastosowanie
poziomy(f) Odczytuje lub zamienia nazwy poziomów Zmiana nazw skrótów na czytelne etykiety
nlevels(f) Zwraca liczbę poziomów Sprawdzanie kategorii nie spowodowało eksplozji po dołączeniu
relevel(f, ref) Przesuwa się o jeden poziom do przodu Wybór punktu bazowego dla regresji
poziomy zrzutu(f) Usuwa poziomy z zerową liczbą obserwacji Czyszczenie po podzbiorze lub filtrowaniu

Poniższy blok stosuje wszystkie cztery czynniki koloru i płci utworzone wcześniej.

# Inspect the levels of an existing factor
levels(factor_color)          # the level names, in the order R stored them
nlevels(factor_color)         # how many distinct levels exist

# Rename the levels in place (the new vector must follow the same order)
levels(factor_color) <- c('Black', 'Blue', 'Green', 'Red', 'White', 'Yellow')

# Attach labels at creation time instead of renaming afterwards
gender_coded <- factor(c(1, 0, 0, 1, 1), levels = c(0, 1), labels = c('female', 'male'))

# Make 'male' the reference level that modelling functions compare against
gender_coded <- relevel(gender_coded, ref = 'male')

# Remove levels that survived a subset but no longer occur in the data
subset_color <- droplevels(factor_color[1:3])

Warto pamiętać o dwóch szczegółach. Przypisanie do levels() zmienia nazwy według pozycji, więc niedopasowany wektor po cichu zmienia etykiety niewłaściwej kategorii. A podzbiór zachowuje każdy oryginalny poziom do momentu wywołania droplevels(), dlatego filtrowane ramka danych nadal można wykreślać puste słupki. Etykiety Argument jest znowu inny: nadaje poziomom nazwy w momencie tworzenia, a zduplikowane etykiety łączą kilka wartości wejściowych w jeden poziom.

Jak przekonwertować czynnik na wartość liczbową lub znakową w R

To najczęstszy błąd czynnika w R. Ponieważ czynnik przechowuje kody całkowite, wywołanie funkcji as.numeric() zwraca te kody, a nie wartości widoczne na ekranie. Czynnik z lat 2021–2023 zwraca wartości 1, 2 i 3.

# A factor whose labels happen to look like numbers
year_factor <- factor(c('2021', '2023', '2022', '2023'))

# WRONG: this returns the internal codes 1, 3, 2, 3 - not the years
as.numeric(year_factor)

# RIGHT: read the label through the levels attribute first
as.numeric(levels(year_factor))[year_factor]

# Equivalent and easier to remember, but slightly slower
as.numeric(as.character(year_factor))

# Back to plain text
as.character(year_factor)

Podstawowa dokumentacja języka R zaleca as.numeric(levels(f))[f] jako poprawną i nieco szybszą ścieżkę, a as.numeric(as.character(f)) jako łatwiejszy do odczytania odpowiednik. Obie metody najpierw odczytują etykietę, a następnie konwertują.

  • Współczynnik charakteru: as.character(f) zwraca etykiety jako zwykły tekst.
  • Kody współczynnika na liczby całkowite: as.integer(f) lub unclass(f) gdy kody są tym, czego faktycznie chcesz.
  • Charakter do czynnika: factor(x) lub szybszy skrót as.factor(x).
  • Numeryczne na czynnikowe: współczynnik(x) dla kodów dyskretnych, cięcie(x, przerwy) dla wartości ciągłych wymagających podziału na pasma.

Jedno zabezpieczenie dotyczy wszystkich z nich. Jeśli wartość w x nie pojawia się w wektorze poziomów, factor() ustawia ten element na NA zamiast zgłaszać błąd, więc przypadkowa spacja lub różnica w kapitalizacji może dyskretnie usunąć wiersze. Porównywanie unikalnych wartości przed i po konwersji lub sortowanie ramki danych w nowej kolumnie szybko ujawnia problem.

Czynnik kontra znak kontra liczba w R: kiedy używać każdego z nich

Wczesny wybór trybu przechowywania znacznie oszczędza późniejsze debugowanie. Tabela porównuje trzy tryby, w jakich może być przechowywana kolumna tekstu lub kodów.

Właściwość Czynnik Postać Numeryczne
Zapisane jako Kody całkowite plus atrybut poziomów Smyczki Doubles lub liczby całkowite
Stały zestaw wartości Tak, zdefiniowane przez poziomy Nie Nie
Niestandardowa kolejność wyświetlania Tak, przez poziomy Tylko alfabetycznie Tylko numeryczne
Arytmetyka Niedozwolone Niedozwolone Dozwolony
Kontrasty modeli Zbudowane automatycznie Najpierw zmuszony Traktowany jako pomiar

Użyj czynnik gdy wartości pochodzą ze znanej, zamkniętej listy, gdy kolejność wyświetlania lub rankingowania ma znaczenie lub gdy kolumna zasila model lub legendę wykresu. Użyj charakter do dowolnego tekstu, identyfikatorów i wszystkiego, co będziesz analizować lub łączyć, na przykład nazw, notatek i kodów, które stale pojawiają się z nowymi wartościami. Użyj numeryczna tylko wtedy, gdy odległość między dwiema wartościami ma znaczenie.

Poniższy blok pokazuje najszybsze sposoby sprawdzenia, co faktycznie posiadasz.

# Ask R what each column of a data frame actually is
sapply(mtcars, class)

# Direct membership tests
is.factor(factor_day)
is.ordered(factor_day)

# unclass() exposes the integer codes hiding behind the labels
unclass(factor_color)

Dwa nawyki zapewniają uczciwość wyboru. Uruchom sapply(df, class) po każdym imporcie, ponieważ pojedynczy błąd w kolumnie liczbowej zamienia całą kolumnę w tekst. I przekonwertuj na czynnik jak najpóźniej, po oczyszczeniu i połączeniu danych, aby… dplyr połączenia i filtry nadal porównują zwykłe ciągi znaków, a nie niedopasowane zestawy poziomów.

FAQ

Jeśli nie podano wartości, funkcja „levels” wywołuje funkcję „unique()” i sortuje wartości w kolejności rosnącej. To sortowanie zależy od aktywnej lokalizacji, więc nie zawsze jest to zwykły kod ASCII. Argument „levels” należy podać jawnie, gdy kolejność ma znaczenie.

Funkcja table(f) zwraca nazwaną liczbę dla każdego poziomu, a prop.table(table(f)) konwertuje te liczby na proporcje. Obie funkcje utrzymują puste poziomy widoczne, co czyni je przydatnymi do wyszukiwania kategorii, które zniknęły po przefiltrowaniu. ramka danych.

Funkcja factor() dopasowuje każdy element do podanych poziomów, a każda wartość bez dopasowania staje się wartością NA zamiast zgłaszać błąd. Przed konwersją sprawdź setdiff(unique(x), your_levels) i zwróć uwagę na spacje lub różnice w wielkości liter w danych źródłowych.

Funkcja cut() dzieli wektor numeryczny w podanych punktach przerwania i zwraca współczynnik. Przekaż etykiety dla czytelnych nazw pasm i zwróć ordered_result = TRUE, gdy pasma są klasyfikowane. Funkcja findInterval() to szybsza alternatywa, gdy potrzebny jest tylko indeks bin.

Od wersji R 4.0.0 domyślna wartość fabryczna dla data.frame() i read.csv() to stringsAsFactors = FALSE, więc kolumny tekstowe pozostają znakowe. Starsze skrypty, które opierały się na automatycznej konwersji, muszą teraz jawnie wywoływać factor() dla modelowanych kolumn.

Less niż kiedyś. W podstawowym dokumencie referencyjnym R zaznaczono, że identyczne ciągi znaków współdzielą teraz pamięć, więc różnica jest w większości przypadków niewielka. Współczynniki nadal się opłacają, ponieważ walidują kategorie i ustalają kolejność poziomów w modelach i wykresach.

Większość funkcji modelowania akceptuje czynniki bezpośrednio i automatycznie tworzy kontrasty pozorne, podczas gdy wiele uczenie maszynowe Pakiety oczekują macierzy numerycznej. Model.matrix() lub kodowanie one-hot wypełnia tę lukę, a uporządkowany czynnik może zachować swoją rangę.

Tak. Drugi pilot GitHub Działa w RStudio 2023.09.0 i nowszych wersjach i sugeruje uzupełnienia na podstawie komentarzy i kodu w otwartym pliku. Kolejność poziomów i obsługę NA należy traktować jako sugestie do weryfikacji, a nie fakty.

Podsumuj ten post następująco: