[r] 동적 변수 개수가있는 공식

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?)
   }
}



답변

다음을 참조하십시오 ?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


답변

자주 잊혀지는 함수는 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


답변

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

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

lm(Y ~ foo[,factors])


답변

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

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

이렇게 :

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


답변

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

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, ...)


답변