Menu

R'de Faktörler: Kategorik Veri, Seviyeler ve Yaygın Tuzaklar

Faktörler, R'nin kategorik veriyi saklama biçimidir: metin etiketleri giymiş tam sayı kodları. Nasıl oluşturulur, nasıl sıralanır, referans seviyesi nasıl ayarlanır - ve faktörden sayıya dönüşüm tuzağından nasıl kaçınılır.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Faktör Aslında Nedir

Faktör, R'nin kategorik veriye - sabit bir olasılıklar menüsünden gelen değerlere - verdiği yanıttır: tedavi grupları, anket yanıtları, tişört bedenleri. Yazdırıldığında bir character vektör gibi görünür, ama öyle değildir. İçeride bir faktör, tam sayı kodlarından oluşan bir vektör artı seviye denen etiketlerden oluşan bir arama tablosudur:

Çıktı önce etiketleri, sonra menüyü listeleyen bir Levels: satırını gösterir. as.integer() mekanizmayı açığa çıkarır: kodlar 3 1 3 2 olarak geri gelir, çünkü her değer aslında seviye tablosuna bir indekstir - ve seviyeler varsayılan olarak verinin geliş sırasına göre değil alfabetik olarak sıralanır (large, medium, small). Yani small kod 3, large kod 1'dir; bu kimsenin sezgisi değildir. Bu alfabetik varsayılanı hatırlayın; aşağıdaki tuzaklardan ikisini o yönetiyor.

Peki düz metinler yerine neden bu iki katmanlı tasarımla uğraşalım? Çünkü istatistiğin buna ihtiyacı var. Bir model "small" değerini bir katsayıyla çarpamaz - ama bilinen üç seviyeyi 0 ve 1'lerden oluşan sütunlara kukla olarak kodlayabilir. lm(), glm(), table() gibi fonksiyonlar ve ANOVA arkasındaki mekanizma; bir değişkenin kategorik olduğunu, kategorilerin tam kümesinin ne olduğunu (veride bulunmayanlar dahil) ve hangi kategorinin temel alındığını bilmek için faktörlere dayanır. Düz character vektörler bunların hiçbirini taşımaz.

Faktör Oluşturma: levels, labels ve table()

factor() varsayılan olarak bulduğu farklı değerleri alır ve seviyelere alfabetik olarak sıralar. Çoğu zaman hem küme hem de sıra üzerinde denetim isteyeceksiniz - levels = geçirin:

Artık seviyeler doğal beden sırasında ilerliyor ve faktörlerle sürekli kullanacağınız tek satırlık frekans sayımı olan table() de sayımları bu sırada bildiriyor. nlevels() kategorileri sayar.

levels = size iki şey daha kazandırır. Verideki, seviye listenizde bulunmayan değerler NA olur (iyi: yazım hataları kendi kategorileri hâline gelmek yerine yüzeye çıkar). Ve sıfır kez geçen seviyeler yine de var olur; böylece anket yanıtlarının bir özeti, seçenek hiç var olmamış gibi davranmak yerine "kesinlikle katılmıyorum: 0" gösterir.

labels =, oluşturma anında seviyeleri yeniden adlandırır; ham veri kodlar kullandığında kullanışlıdır:

Ve as.factor(x), varsayılanlar uygun olduğunda mevcut bir vektör için hızlı dönüştürücüdür.

Sıralı Veri İçin Sıralı Faktörler

Düz faktörler kategorileri sırasız kabul eder - "kırmızı", "mavi"den küçük değildir. Ama bazı kategorik ölçeklerin gerçek bir sıralaması vardır: düşük/orta/yüksek, katılmıyorum/kararsızım/katılıyorum. Bunu ordered = TRUE ile bildirin:

Çıktı artık Levels: low < medium < high gösteriyor ve karşılaştırma operatörleri çalışıyor: bir derecelendirmenin diğerini aşıp aşmadığını sorabilir ya da "medium" ve üstündeki her şeye filtreleyebilirsiniz - sırasız bir faktörde ikisi de hata (aslında uyarı ve NA) verir. Sıralı faktörler ayrıca modellerin değişkeni kodlama biçimini de değiştirir (kukla değişkenler yerine polinom kontrastları); bu genellikle sıralı yordayıcılar için istediğiniz şeydir.

ordered = TRUE yalnızca sıralama gerçek olduğunda kullanın. Sıradan grupları sıralı olarak kodlamak, model çıktısını yanlış okunması kolay biçimlerde değiştirir.

Referans Seviyesi ve relevel()

Bir faktörün ilk seviyesi özeldir: model fonksiyonları onu referans kategorisi olarak ele alır; diğer her seviyenin katsayısı bu temele göre ölçülür. Varsayılan seviye sırası alfabetik olduğundan, siz müdahale etmedikçe temeliniz alfabe tarafından seçilir - ve "control"un alfabetik olarak "aspirin"e yenilmesi bilimsel bir karar değildir.

relevel() bir seviyeyi ilk sıraya yükseltir:

Öncesinde: control, yalnızca alfabetik şans eseri ilk sırada. relevel(..., ref = "control") sonrasında bilerek ilk sırada. Bu yordayıcıyla kurulan bir doğrusal regresyonda treatment katsayısı artık "tedavi, kontrolden nasıl farklı?" sorusunu yanıtlar - gerçekten sorduğunuz soruyu. Bir modelin kategorik katsayıları kafa karıştırıcı göründüğünde önce referans seviyesini kontrol edin.

(Yalnızca ilk sırayı değil, tam yeniden sıralamayı istiyorsanız factor() fonksiyonuna yeniden eksiksiz bir levels = vektörü geçirin.)

Klasik Tuzak: Bir Faktörü Sayıya Dönüştürmek

Bazen sayılar faktör olarak gelir - genellikle sayısal olmayan başıboş bir değer içeren bir CSV sütunu yüzünden. Geri dönüştürmek bariz görünür ve akılda kalıcı biçimde ters gider:

as.numeric(f) 2 1 3 döndürür. 20, 10, 30 değil - seviye kodları. Seviyeler alfabetik olarak "10", "20", "30" şeklinde sıralanır, dolayısıyla "20" seviye 2'dir ve şuna dönüşür... 2. Hata yok, uyarı yok, verinizin yerini sessizce alan makul görünen küçük tam sayılar. Bu yüzden geri çekilen analizler oldu.

Doğru yol character üzerinden gider: as.numeric(as.character(f)) önce etiketleri metin olarak geri kazanır, sonra metni sayı olarak ayrıştırır - 20 10 30. Bu deyimi kazıyın: faktörden sayıya dönüşüm her zaman as.character() üzerinden gider.

droplevels() ve stringsAsFactors Hikâyesi

Bir faktörden alt küme almak, artık görünmeyen kategoriler için bile tam seviye kümesini korur:

large filtrelendikten sonra table() onu hâlâ bildirir - 0 sayımıyla. Bazen bu tam olarak doğrudur (boş kategorinin görünür olmasını istersiniz). Olmadığında - sıfır sayımlı gruplar grafikleri karmaşıklaştırır ve katmanlı analizleri bozabilir - droplevels() gözlemi olmayan seviyeleri atar.

Eski kodu ya da Stack Overflow yanıtlarını okurken ihtiyaç duyacağınız tarihsel bir not: R 4.0'dan (2020) önce data.frame() ve read.csv() her character sütunu otomatik olarak faktöre dönüştürüyordu - stringsAsFactors = TRUE varsayılandı. On yıllık eğitim içeriği, kimsenin istemediği faktörler için geçici çözümlerle dolu. R 4.0'dan beri varsayılan FALSE: metinler metin olarak kalır ve faktörleri, veri çerçevenizdeki bir değişken gerçekten kategorik olduğunda bilinçli olarak siz oluşturursunuz. Doğru alışkanlık budur - açık, bilinçli ve sizin seçtiğiniz seviyelerle kurulmuş faktörler.

Buradan Ne Çıkarıyorsunuz

  • Faktör = tam sayı kodları + seviye etiketleri; istatistiksel fonksiyonlara bir değişkenin kategorik olduğunu söyleyen şeydir.
  • Kategori kümesini ve sırasını levels = ile denetleyin, labels = ile yeniden adlandırın, table() ile sayın.
  • ordered = TRUE, gerçekten sıralı ölçekler için karşılaştırmaları etkinleştirir.
  • İlk seviye modelin temelidir - onu relevel(f, ref = ...) ile bilinçli olarak ayarlayın.
  • Asla doğrudan as.numeric(f) yapmayın - her zaman as.numeric(as.character(f)).
  • droplevels(), alt küme aldıktan sonra kullanılmayan seviyeleri temizler; R 4.0'dan beri siz faktör yapmadıkça metinler metin olarak kalır.

Sırada: veri çerçeveleri - faktörlerin, sayıların ve metinlerin tek bir tablonun sütunları olarak birlikte yaşadığı yer.

Sıkça Sorulan Sorular

R'de faktör nedir?

Faktör, R'nin kategorik veri türüdür - seviye (level) denen sabit bir olasılıklar kümesinden alınan değerler. İçeride, tam sayı kodlarından oluşan bir vektör ile seviye etiketlerinden oluşan bir tablodur; istatistiksel fonksiyonların kategorileri serbest metin gibi değil doğru biçimde ele almasını (saymasını, modellerde kukla kodlamasını) sağlayan şey budur.

R'de bir faktör sayıya nasıl dönüştürülür?

Character üzerinden gidin: as.numeric(as.character(f)). Doğrudan as.numeric(f) çağırmak, etiketlerin gösterdiği değerleri değil içteki seviye kodlarını (1, 2, 3, ...) döndürür - yani "20" gösteren bir faktör 2 olarak geri gelebilir. Bu, R'deki en yaygın sessiz hatalardan biridir.

R'de relevel() ne yapar?

Seçilen bir seviyeyi ilk konuma taşır: relevel(group, ref = "control"). İlk seviye, lm() ve glm() gibi model fonksiyonlarının diğer her seviyeyi kendisiyle karşılaştırdığı referans (temel) kategoridir; bu yüzden onu bilinçli seçmek regresyon katsayılarının kastettiğiniz anlama gelmesini sağlar.

Faktörüm neden hâlâ kaldırdığım seviyeleri gösteriyor?

Bir faktörden alt küme almak, bazı seviyeler artık geçmese bile tam seviye kümesini korur; bu yüzden table() sıfır sayımlı kategoriler gösterir ve modeller onlara hâlâ yer ayırır. Kullanılmayan seviyeleri atmak için alt küme üzerinde droplevels() çalıştırın.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA