동적 변수 개수가있는 공식


82

data.frame foo_data_frame이 있고 다른 열에 의해 대상 열 Y의 회귀를 찾고자 한다고 가정 합니다. 이를 위해 일반적으로 몇 가지 공식과 모델이 사용됩니다. 예를 들면 :

linear_model <- lm(Y ~ FACTOR_NAME_1 + FACTOR_NAME_2, foo_data_frame)

수식이 정적으로 코딩되면 잘 작동합니다. 일정한 수의 종속 변수 (예 : 2)로 여러 모델을 루팅하려면 다음과 같이 처리 할 수 ​​있습니다.

for (i in seq_len(factor_number)) {
  for (j in seq(i + 1, factor_number)) {
    linear_model <- lm(Y ~ F1 + F2, list(Y=foo_data_frame$Y,
                                         F1=foo_data_frame[[i]],
                                         F2=foo_data_frame[[j]]))
    # linear_model further analyzing...
  }
}

내 질문은 프로그램 실행 중에 변수 수가 동적으로 변경 될 때 동일한 영향을 미치는 방법입니다.

for (number_of_factors in seq_len(5)) {
   # Then root over subsets with #number_of_factors cardinality.
   for (factors_subset in all_subsets_with_fixed_cardinality) {
     # Here I want to fit model with factors from factors_subset.
     linear_model <- lm(Does R provide smth to write here?)
   }
}

2
감사! 귀하의 중간 예는 귀하의 질문에 대한 해결책이 필요하지 않았으며 훨씬 더 간단한 일을 할 수 있음을 깨달았습니다!
마크 아담 슨

답변:


103

다음을 참조하십시오 ?as.formula.

factors <- c("factor1", "factor2")
as.formula(paste("y~", paste(factors, collapse="+")))
# y ~ factor1 + factor2

여기서은 factors모형에서 사용하려는 요인의 이름을 포함하는 문자형 벡터입니다. 이를 lm모델에 붙여 넣을 수 있습니다 . 예 :

set.seed(0)
y <- rnorm(100)
factor1 <- rep(1:2, each=50)
factor2 <- rep(3:4, 50)
lm(as.formula(paste("y~", paste(factors, collapse="+"))))

# Call:
# lm(formula = as.formula(paste("y~", paste(factors, collapse = "+"))))

# Coefficients:
# (Intercept)      factor1      factor2  
#    0.542471    -0.002525    -0.147433

66

자주 잊혀지는 함수는 reformulate입니다. 에서 ?reformulate:

reformulate 문자형 벡터에서 수식을 만듭니다.


간단한 예 :

listoffactors <- c("factor1","factor2")
reformulate(termlabels = listoffactors, response = 'y')

다음 공식이 생성됩니다.

y ~ factor1 + factor2


명시 적으로 문서화되어 있지는 않지만 상호 작용 용어를 추가 할 수도 있습니다.

listofintfactors <- c("(factor3","factor4)^2")
reformulate(termlabels = c(listoffactors, listofintfactors), 
    response = 'y')

산출 할 것입니다 :

y ~ factor1 + factor2 + (factor3 + factor4)^2


3
@JorisMeys 그리고 상호 작용 용어를 추가 할 수 있기 때문에 훨씬 좋습니다! 나는 수년간 비슷한 해결책을 찾고 있었다 ..
landroni

x 변수에 공백이 있으면 어떻게됩니까? "factor 1", "factor 2"등을 말하세요.
axiom

11

또 다른 옵션은 공식에서 행렬을 사용하는 것입니다.

Y = rnorm(10)
foo = matrix(rnorm(100),10,10)
factors=c(1,5,8)

lm(Y ~ foo[,factors])

3
+1하지만 상호 작용 효과를 사용할 수 없다는 사실을 알고 있어야합니다. 이를 위해 모델 매트릭스도 구성 할 수 있습니다 (참조 ?model.matrix)
Joris Meys

4

실제로 공식이 필요하지 않습니다. 이것은 작동합니다 :

lm(data_frame[c("Y", "factor1", "factor2")])

이렇게 :

v <- c("Y", "factor1", "factor2")
do.call("lm", list(bquote(data_frame[.(v)])))

+1 매우 정확하지만 상호 작용 효과가있는 행렬을 구성하려면 model.matrix를 사용해야합니다.
Joris Meys

0

일반적으로 응답 열의 이름을 변경하여이 문제를 해결합니다. 동적으로 수행하는 것이 더 쉽고 깔끔 할 수 있습니다.

model_response <- "response_field_name"
setnames(model_data_train, c(model_response), "response") #if using data.table
model_gbm <- gbm(response ~ ., data=model_data_train, ...)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.