데이터 프레임에서 변수가 많은 공식을 간단하게 작성하는 방법은 무엇입니까?
반응 변수와 세 개의 공변량이 포함된 데이터가 있다고 가정합니다(장난감 예제).
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
'programing' 카테고리의 다른 글
만료일을 기준으로 중복된 레코드를 선택적으로 삭제하는 SQL (0) | 2023.06.18 |
---|---|
TypeScript의 콘솔 입력 (0) | 2023.06.18 |
GUI 없이 Excel(xls) 파일을 쉼표로 구분된(csv) 파일로 변환 (0) | 2023.06.18 |
Duplicate User Form in Excel VBA (0) | 2023.06.18 |
MySQL: 다른 테이블의 값에서 테이블의 기존 데이터 "패치" (0) | 2023.06.18 |