데이터 프레임에서 많은 변수가있는 수식을 간결하게 작성하는 방법은 무엇입니까?


127

반응 변수와 3 개의 공변량을 포함하는 데이터가 있다고 가정합니다 (장난감 예).

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

선형 회귀를 데이터에 맞추고 싶습니다.

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

각각의 개별 공변량을 작성할 필요가 없도록 공식을 작성하는 방법이 있습니까? 예를 들어,

fit = lm(y ~ d)

(데이터 프레임의 각 변수가 공변량이되기를 원합니다.) 저는 실제로 데이터 프레임에 50 개의 변수가 있기 때문에 질문하는 것이므로 x1 + x2 + x3 + etc.



답변:


202

모든 변수를 의미하는 수식에서 사용할 수있는 특수 식별자가 있습니다 .. 바로 식별자입니다.

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)

다음과 같은 작업을 수행하여 하나를 제외한 모든 변수를 사용할 수도 있습니다 (이 경우 x3는 제외됨).

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

기술적 으로는 공식에 아직 언급 되지 않은 모든 변수를. 의미 합니다 . 예를 들면

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

어디 .까지나 참고 것 x3같은 x1x2화학식 이미.


데이터 프레임 'd'에는 4 개의 열 (y, x1, x2 및 x3)이 있습니다. 그렇다면 수식이 "y ~."이면 오른쪽은 왼쪽에 나열된 열을 제외한 "모든 열"을 의미합니까?
stackoverflowuser2010

1
@ stackoverflowuser2010 예, .기술적으로 data 공식없는 모든 변수를 의미합니다 .
Gavin Simpson

1
@theforestecologist data는 공식의 변수가 해당 목록에서 조회되는 목록임을 의미하면 예입니다. 데이터 프레임, 목록 또는 환경은 data인수에 허용되는 옵션입니다 . 그것이 의미하는 바가 아니라면 조금 더 확장해야합니다.
Gavin Simpson

@Gavin. 그것이 내가 의미하는 바입니다. 감사. 데이터 [[x]]를 나열된 변수와 실제 변수 이름 (예 : 'x3')으로 사용하는 방법은 무엇입니까? 예를 들어, 다음 작업을 어떻게 만들 수 있습니까?lm(d[[1]] ~ d[[3]] + ., data = d)
theforestecologist

그것은 떨어져 작업 names목록; 당신이 가지고 있다고 말하면 ll <- list(y = rnorm(10), x = rnorm(10), z = rnorm(10), zz = runif(10))다음 작품이 작동합니다 lm(y ~ x + ., data = ll). 따라서 이미 목록이 아니라면 이와 같은 데이터를 가질 이유가별로 없지만 작동합니다. 수식 요소의 길이가 같아야한다는 요구 사항은 목록에있는 항목에 몇 가지 제한을 둡니다. 더 복잡한 객체는 원하는 요소를 추출하기 위해 코드가 필요할 수 있습니다. 경우 d[[1]]데이터 프레임했다 / 당신이 작동하도록 코드가 필요 매트릭스
개빈 심슨

66

약간 다른 접근 방식은 문자열에서 수식을 만드는 것입니다. 에서 formula도움말 페이지 다음과 같은 예를 찾을 수 있습니다 :

## 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= "+")))

그런 다음 생성 된 공식을 보면 다음을 얻을 수 있습니다.

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
이것은 파일에서 이러한 값을 읽는 데 매우 효과적입니다. 감사!
Ben Sidhom 2014

참고 as.formula 부분은 mustt입니다
진화 왕

7

예, 물론 y데이터 프레임의 첫 번째 열로 응답 을 추가 하고 호출 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  

또한, R 지점에 대한 내 정보를 그 임무로에서 <-이상 권장합니다 =.


감사! 예, 나는 모든 사람들이 항상 <-를 사용하라고 말하는 것을 알고 있지만 아무도 이유를 말하지 않고 =를 입력하는 것이 더 쉽습니다 =).
grautur 2011 년

2
@gratur 한 가지 이유는 foo(bar <- 1:10)일과 같은 것 (그리고 bar생성됨)이지만 의 인수 가 아니고 생성 foo(bar = 1:10)하지 않기 때문에 실패 할 수 있다는 것 입니다. barfoobar
Gavin Simpson

2
계수는 왜 x3 NA?
ziyuang

6

juba의 방법의 확장은 reformulate이러한 작업을 위해 명시 적으로 설계된 함수 인를 사용 하는 것입니다.

## 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의 예에서 가장 쉬운 해결책은 다음과 같습니다.

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

또는

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

참고 그 data.frame에 종속 변수를 추가하는 d <- cbind(y, d)것이 바람직하다뿐만 아니라 그것의 사용을 허용하기 때문에 reformulate, 또한 그것의 미래 사용을 허용하기 때문에 lm같은 기능의 객체 predict.


2

이 솔루션을 빌드하고 reformulate변수 이름에 공백이 있으면 상관하지 않습니다.

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

패키지 leaps및 특히 regsubsets() 모델 선택을위한 기능 기능을 확인할 수 있습니다 . 문서에 명시된대로 :

철저한 검색, 전진 또는 후진 단계적 또는 순차적 교체를 통한 모델 선택

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.