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