programing

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

newstyles 2023. 6. 18. 12:27

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

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

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.

공식에 사용할 수 있는 모든 변수를 의미하는 특별한 식별자가 있습니다..식별자

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~하듯이x1그리고.x2이미 공식에 있습니다.

약간 다른 접근법은 문자열에서 공식을 만드는 것입니다.에서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

예, 물론입니다. 응답을 추가하십시오.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에 대한 나의 정보는 그 과제를 지적합니다.<-보다 권장됨=.

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.

내가 이 해결책을 만들고,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  

```

당신은 소포를 확인할 수 있습니다.leaps그리고 특히 기능.regsubsets()모델 선택을 위한 함수입니다.설명서에 명시된 대로:

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

언급URL : https://stackoverflow.com/questions/5251507/how-to-succinctly-write-a-formula-with-many-variables-from-a-data-frame