2017-12-23 38 views
0

이 질문에 불충분하게 말하면서 사과하지만, 웹 검색을 몇 시간 동안 해본 후에 나는이 질문에 대해 이전에 대답하지 않았다고 확신합니다. 이 문제가 정확히 무엇을 의미하는지 자세히 설명하기 위해 최선을 다할 것입니다.다중 회귀 분석에서 열 이름을 동적으로 참조합니다.

데이터 세트 요약 : 사용되는 데이터는 파이썬 코드에서 검색되어 개별 CSV 문서에 저장된 재무 데이터 (열기, 높음, 낮음, 닫기)입니다. lapply을 사용하여 문서를 읽고 저장했습니다. 일을 단순하게 유지하기 위해 현재 집중적으로 다루는 것은 일별 비율 변경 또는 (닫기/시프트 (닫기)) - 1입니다. 이 문제를 해결하기 위해 모든 NA 및 데이터에서 완료되지 않은 시세 표시를 제거했습니다.

필자는 1000 개의 행 (일)에 걸쳐있는 98 개의 열 (시세 표시기)의 데이터 프레임 (목록에서 변환)을 가지고 있습니다. 데이터 프레임/매트릭스 내의 값은 매일 매일 각 시세 표시에 대한 일별 비율 변경입니다.

목표 : 다른 모든 열 (~ .)을 사용하여 동적으로 열 이름을 참조하여 각 열에 lm() 수식을 적용하는 방법을 알고 싶습니다.

샘플 데이터 세트 :

lm_aapl <- lm(AAPL ~ ., data=df) 

하지만 동적 오류로 실행하지 않고 열 이름을 참조하는 방법을 찾을 수 없었습니다 : 다음을 수행 할 정도로 간단하다

aapl_pct_chg <- c(.02, .03, .01, -.05, -.01) 
tmus_pct_chg <- c(-.01, -.02, .05, .01, -.03) 
akam_pct_chg <- c(.1, -.2, .3, -.03, -.07) 
intc_pct_chg <- c(.01, .03, .02, .01, .1) 
de_pct_chg <- c(-.01, -.05, .05, .1, -.03) 

df <- as.data.frame(cbind(aapl_pct_chg, tmus_pct_chg, akam_pct_chg, intc_pct_chg, de_pct_chg)) 

names(df) <- c("AAPL", "TMUS", "AKAM", "INTC", "DE") 

. 이것이 의미하는 바는 이상적으로는 다른 모든 열을 사용하여 각 열에서 lm() 모델을 캡처 할 수있는 수식을 실행할 수 있다는 것입니다.

도움이되었던 몇 가지 답변 된 질문이 있습니다. (사과하고, 조직화되어 있지 않으며, 500 가지 방법으로 시도해 보았습니다.) 그러나 해결하지 못한 질문이 있습니다. 가장 가까운 곳은 내가 원하는대로하는 공식이지만, AAPL을 예측할 때 AAPL의 가치를 포함 할 것입니다. 이는 좋은 모델로 이끌지 만 원하는 것은 아닙니다.

답변

0

당신은 당신이 쉽게 문자열로 공식의 벡터를 만들 수도 동적 문을 작성하고 eval()를 사용하고 나머지 모든 변수를 대표하는 모델 식에 .를 사용할 수 있기 때문에 parse() 그것을

names(df) <- c("AAPL", "TMUS", "AKAM", "INTC", "DE") 
for (n in names(df)) { 
    code <- paste0("lm_", n , " <- lm(", n, " ~ ., data=df)") 
    eval(parse(text=code)) 
} 
+0

그것은 정말 나쁜 아이디어가 있어요 코드를 텍스트로 저장하십시오 (따라서'eval (parse (text = ...))'). 언어로 작업 할 때조차도 표현이나 다른 언어 객체로 작업하는 것이 일반적입니다. – alistaire

+0

@alistaire 나는 동의한다. 그러나 그것은 내가 생각해내는 것이다. –

1

을 해석 할 수 있습니다 paste. 일반적인 다음 단계는 lapply 또는 이와 유사한 방법으로 문자열 전체를 반복하고 문자열에 as.formula (벡터화되지 않음)을 호출 한 다음 수식을 적용하는 것입니다. 모두 함께,

df <- data.frame(AAPL = c(0.02, 0.03, 0.01, -0.05, -0.01), 
       TMUS = c(-0.01, -0.02, 0.05, 0.01, -0.03), 
       AKAM = c(0.1, -0.2, 0.3, -0.03, -0.07), 
       INTC = c(0.01, 0.03, 0.02, 0.01, 0.1), 
       DE = c(-0.01, -0.05, 0.05, 0.1, -0.03)) 

models <- lapply(paste(names(df), '~ .'), 
       function(f){ lm(as.formula(f), data = df) }) 

models[[1]] 
#> 
#> Call: 
#> lm(formula = as.formula(f), data = df) 
#> 
#> Coefficients: 
#> (Intercept)   TMUS   AKAM   INTC   DE 
#>  0.01941  0.52529  0.02116  -0.33372  -0.70687 

참고 수식에서 스플 라이스 할 경우, 사용할 수 있도록 호출, 아주 예쁜하지 substituteeval 결과 표현 :

models <- lapply(paste(names(df), '~ .'), function(f){ 
    eval(substitute(lm(frm, data = df), 
        list(frm = as.formula(f)))) 
}) 

models[[2]] 
#> 
#> Call: 
#> lm(formula = TMUS ~ ., data = df) 
#> 
#> Coefficients: 
#> (Intercept)   AAPL   AKAM   INTC   DE 
#> -0.03694  1.90370  -0.04028  0.63530  1.34566 
+0

이것은 완벽하게 작동했습니다. 감사합니다. 나중에 참조 할 수 있도록 적합 값, 계수 등을 저장하는 것이 어떻겠습니까?코드를 간결하게 유지하면서 접근성을 향상시킬 수 있습니까? 당신의 도움을 이해하십시오 – ThatsMrLongCut

+0

당신이 원한다면 익명의 기능 안에서 추출 할 수 있습니다. 그러나 보통 당신이 나중에 필요로하는 것들을 선택할 수 있도록 모델 목록을 저장하는 것이 가장 좋습니다. 'lapply (모델, broom :: tidy)'와'lapply (모델, broom :: glance)'또는'lapply (models, coef)' – alistaire