Bir veri çerçevesinden birçok değişken içeren bir formül nasıl kısaca yazılır?


127

Bir yanıt değişkenine ve üç ortak değişken içeren bir veriye sahip olduğumu varsayalım (oyuncak örneği olarak):

y = c(1,4,6)
d = data.frame(x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))

Verilere doğrusal bir regresyon uydurmak istiyorum:

fit = lm(y ~ d$x1 + d$x2 + d$y2)

Formülü yazmanın bir yolu var mı, böylece her bir kovaryantı ayrı ayrı yazmam gerekmez mi? Örneğin

fit = lm(y ~ d)

(Veri çerçevesindeki her değişkenin bir ortak değişken olmasını istiyorum.) Soruyorum çünkü aslında veri çerçevemde 50 değişken var, bu yüzden yazmaktan kaçınmak istiyorum x1 + x2 + x3 + etc.



Yanıtlar:


202

Bir formülde tüm değişkenleri ifade etmek için kullanabileceğiniz özel bir tanımlayıcı vardır, bu .tanımlayıcıdır.

y <- c(1,4,6)
d <- data.frame(y = y, x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))
mod <- lm(y ~ ., data = d)

Biri dışındaki tüm değişkenleri kullanmak için de bunun gibi şeyler yapabilirsiniz (bu durumda x3 hariçtir):

mod <- lm(y ~ . - x3, data = d)

Teknik olarak, .anlamına gelir , tüm değişkenler olup daha önce formül belirtilen . Örneğin

lm(y ~ x1 * x2 + ., data = d)

burada .sadece referans olacaktır x3olarak x1ve x2formül zaten.


Veri çerçevesi 'd' 4 sütun içerir (y, x1, x2 ve x3). Yani formül "y ~." İse, sağ taraf sol tarafta listelenenler dışındaki "tüm sütunlar" anlamına mı geliyor?
stackoverflowuser2010

1
@ stackoverflowuser2010 Evet, .teknik data olarak formülde yer almayan tüm değişkenler anlamına gelir .
Gavin Simpson

1
@theforestecologist data, formüldeki değişkenlerin bu listeden arandığı bir listeyi kastediyorsanız , evet. Bir veri çerçevesi, liste veya ortam, dataargüman için kabul edilebilir seçeneklerdir . Demek istediğin bu değilse, biraz daha genişletmen gerekecek.
Gavin Simpson

@Gavin. Demek istediğim buydu. Teşekkürler. Verileri [[x]] listelenmiş bir değişken olarak gerçek değişken adı (örneğin, 'x3') olarak kullanarak bu yöntemi nasıl kullanabilirim? Örneğin, aşağıdakileri nasıl çalıştırırım ?:lm(d[[1]] ~ d[[3]] + ., data = d)
theforestecologist

namesListenin dışında çalışır ; Eğer söylüyorlar ll <- list(y = rnorm(10), x = rnorm(10), z = rnorm(10), zz = runif(10)), sonra aşağıdaki işleri: lm(y ~ x + ., data = ll). Dolayısıyla, zaten bir liste olmadığı sürece verilerinizin böyle olması için pek bir neden yok, ama işe yarıyor. Formül öğelerinin aynı uzunlukta olması şartı, bir listede sahip olduklarınıza bazı kısıtlamalar getirir. Daha karmaşık nesneler muhtemelen istediğiniz öğeleri çıkarmak için koda ihtiyaç duyar; d[[1]]bir veri çerçevesi / matris olsaydı , bunun işe yaraması için koda ihtiyacınız var
Gavin Simpson

66

Biraz farklı bir yaklaşım, formülünüzü bir dizeden oluşturmaktır. Gelen formulayardım sayfasında aşağıdaki örnek bulacaksınız:

## Create a formula for a model with a large number of variables:
xnam <- paste("x", 1:25, sep="")
fmla <- as.formula(paste("y ~ ", paste(xnam, collapse= "+")))

Oluşturulan formüle bakarsanız şunu elde edersiniz:

R> fmla
y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + 
    x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + 
    x22 + x23 + x24 + x25

1
Bu, bu değerleri bir dosyadan okumak için çok işe yarar. Teşekkürler!
Ben Sidhom

As. formülü bölümünün bir zorunluluk olduğuna dikkat edin
Jinhua Wang

7

Evet elbette, yanıtı veri yçerçevesine ilk sütun olarak ekleyin ve çağırın lm():

d2<-data.frame(y,d)
> d2
  y x1 x2 x3
1 1  4  3  4
2 4 -1  9 -4
3 6  3  8 -2
> lm(d2)

Call:
lm(formula = d2)

Coefficients:
(Intercept)           x1           x2           x3  
    -5.6316       0.7895       1.1579           NA  

Ayrıca, R ile ilgili bilgilerim ile atamanın <-tavsiye edildiğine işaret ediyor =.


Teşekkürler! Evet, herkesin her zaman <- kullanılmasını söylediğini biliyorum, ancak kimse neden ve = yazmak daha kolay =) demiyor.
grautur

2
@gratur Bunun bir nedeni, foo(bar <- 1:10)iş gibi (ve baryaratılmış) şeylerin foo(bar = 1:10)başarısız olmasıdır bar, çünkü bir argüman foodeğildir ve barikisini de yaratmaz .
Gavin Simpson

2
Katsayısı neden x3 NA?
ziyuang

6

Juba'nın yönteminin bir uzantısı, reformulateböyle bir görev için açıkça tasarlanmış bir işlev kullanmaktır .

## Create a formula for a model with a large number of variables:
xnam <- paste("x", 1:25, sep="")

reformulate(xnam, "y")
y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + 
    x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + 
    x22 + x23 + x24 + x25

OP'deki örnek için, buradaki en kolay çözüm,

# add y variable to data.frame d
d <- cbind(y, d)
reformulate(names(d)[-1], names(d[1]))
y ~ x1 + x2 + x3

veya

mod <- lm(reformulate(names(d)[-1], names(d[1])), data=d)

Bağımlı değişkeni data.frame'e eklemenin d <- cbind(y, d)sadece kullanımına izin verdiği için reformulatedeğil, aynı zamanda lmnesnenin ileride predict.


2

Ben bu çözümü geliştiriyorum, reformulatedeğişken isimlerinde boşluklar varsa umursamıyor.

add_backticks = function(x) {
    paste0("`", x, "`")
}

x_lm_formula = function(x) {
    paste(add_backticks(x), collapse = " + ")
}

build_lm_formula = function(x, y){
    if (length(y)>1){
        stop("y needs to be just one variable")
    }
    as.formula(        
        paste0("`",y,"`", " ~ ", x_lm_formula(x))
    )
}

# Example
df <- data.frame(
    y = c(1,4,6), 
    x1 = c(4,-1,3), 
    x2 = c(3,9,8), 
    x3 = c(4,-4,-2)
    )

# Model Specification
columns = colnames(df)
y_cols = columns[1]
x_cols = columns[2:length(columns)]
formula = build_lm_formula(x_cols, y_cols)
formula
# output
# "`y` ~ `x1` + `x2` + `x3`"

# Run Model
lm(formula = formula, data = df)
# output
Call:
    lm(formula = formula, data = df)

Coefficients:
    (Intercept)           x1           x2           x3  
        -5.6316       0.7895       1.1579           NA  

`


0

Paketi leapsve özellikle regsubsets() model seçimi için fonksiyon fonksiyonlarını kontrol edebilirsiniz . Belgelerde belirtildiği gibi:

Kapsamlı arama, ileri veya geri adım adım veya sıralı değiştirme ile model seçimi

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.