Lm formülündeki bırakma değişkeni hala kontrast hatasını tetikler


9

Verilerimin yalnızca bir alt kümesinde lm () çalıştırmaya çalışıyorum ve bir sorunla karşılaşıyorum.

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)

Yukarıdakiler işe yaramıyor çünkü veri kümesinin artık sadece erkekleri var ve bu nedenle cinsiyet değişkeni x3'ü modele dahil edemeyiz. FAKAT...

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

Bu formülde "eksi işareti" gösterimi ile ilgili bir sorun mu? Lütfen tavsiye. Not: Elbette farklı bir şekilde yapabilirim; örneğin, değişkenleri lm () içine koymadan önce hariç tutabilirim. Ama bu konuda bir ders veriyorum ve öğrencileri formülde eksi işareti kullanarak değişkeni hariç tutabileceklerini söylemiş olmakla karıştırmak istemiyorum.


3
Hem çok ilginç model.matrix(y ~ . - x3, data = dt[x3 == "men"])ve model.matrix(y ~ x1 + x2, data = dt[x3 == "men"])(iş lmgörüşmeleri model.matrixiçten). Her iki model matrisi arasındaki tek fark "contrasts"(hala içermekte olan x3) ve daha sonra lmrutin içinde alınan bir özelliktir ve muhtemelen gördüğünüz hataya neden olur. Benim düşüncem, sorunun model.matrixterimleri kaldırırken tasarım matrisini nasıl oluşturduğu ve sakladığı ile ilgili olmasıdır.
Maurits Evers

Ben .basitleştirilmiş bir formül elde etmek için "genişletmek" çalışıyordu terms(y ~ . -x3, data=dt, simplify=TRUE)ama garip bir şekilde hala x3lm
çelişen

1
@MrFlick - Görünmeyen-in-R neg.out=seçeneği ilişkili olabilir. S yardım dosyalarından terms, nerede neg.out=uygulanır: "-" işareti ile girilen terimlerin tedavisini kontrol eden bayrak. DOĞRU ise, koşullar iptal için kontrol edilir ve aksi takdirde yok sayılır. YANLIŞ ise, negatif terimler korunur (negatif sıra ile).
thelatemail

1
@MauritsEvers: verilerin değiştirilmiş bir sürümünü lmçağırır model.matrix. Çok başlayarak başta lmifade aşağıdaki oluşturur ve değerlendirir: mf <- stats::model.frame( y ~ . -x3, dt[x3=="men"], drop.unused.levels=TRUE ). Bu x3tek seviyeli bir faktör haline gelir. model.matrix()daha sonra mforijinal veriler değil çağrılır , bu da gözlemlediğimiz hataya neden olur.
Artem Sokolov

Yanıtlar:


2

Aldığınız hata, x3'ün yalnızca bir değeri olan modelde olması = "men"(@Artem Sokolov'dan aşağıdaki yoruma bakın)

Bunu çözmenin bir yolu önceden ayarlamaktır:

dt = data.table(y = rnorm(100), x1 = rnorm(100), x2 = rnorm(100), x3 = as.factor(c(rep('men',50), rep('women',50)))) # sample data

dmen<-dt[x3 == 'men'] # create a new subsetted dataset with just men

lm( y ~ ., dmen[,-"x3"]) # now drop the x3 column from the dataset (just for the model)

Veya her ikisini de aynı adımda yapabilirsiniz:

lm( y ~ ., dt[x3 == 'men',-"x3"])

Genel olarak, bu güzel bir çözüm. Doğru gereken bir şey olduğunu -x3bir formülde yok değil neden lmsütuna çıkarmak için çalışıyoruz düşünmek. "Modelde x3 kullanma" amacı doğru bir şekilde iletilir, ancak sorun, lmçağrıların tek düzeyli bir faktör haline gelmesine model.frame( ..., drop.unused.levels=TRUE )neden olur . x3model.matrix()
Artem Sokolov

Açıkladığınız için teşekkürler Artem Sokolov, bu yanlış açıklamayı cevabımdan çıkardım.
Dylan_Gomes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.