2017-11-28 1 views
1

저는 R에 상당히 익숙하며 (지금까지 SAS/Stata를 사용 해왔음) 주로 생물 통계학에 사용합니다.lapply의 출력 라벨 지정하기

20-ish 설명 변수에서 단 변량 선형 회귀 분석을 실행하고 p 값이 < 0.15 인 회귀 분석을 다중 회귀 분석으로 이동하려고합니다.

이 작업을 좀 더 효율적으로 수행하기 위해 설명 변수가있는 데이터 하위 집합과 결과 변수 만있는 하위 집합을 만들었습니다. 그럼,

my_lms<-lapply(seq_length(ncol), function(i) lm(Fl[,1] ~ Ex[,20])

을 사용하고 내가 사용하고 요약 얻을 그러나

summaries <- lapply(my_lms, summary)

을, 나는 요약과 함께, 그들은 나에게 어떤 표시를주지 않는 것을 발견 각 출력 결과에 대한 열 이름. 오히려, 그것은 단지 나에게 대괄호 (예 : [12])로 열 번호를 제공합니다. 어떤 변수가 어느 출력에 해당하는지 알아내는 것은 매우 번거롭고 오류를 일으킬 수 있습니다. 이 명령을 통해 요약본에 생성 된 설명 변수 열 이름을 레이블에 붙이게 할 수 있습니까?

감사합니다.

+0

'이름 (요약) <- x', 여기서'x'는 할당하고자하는 이름의 벡터입니다. – storaged

+0

아, 더 많은 것을 유지하는 더 편리한 방법이 있다면 좋을 것입니다. 거기에있는 정보. 그러나, 그것의 부재에서 나는 그것을 줄 것이다. – RGM

+0

또한 위의 내용을 사용하여 요약 출력이 베타 계수에 대해 95 %의 신뢰 구간을 제공하지 않는다는 것을 깨달았습니다. 효율적으로 출력 할 수있는 방법이 있습니까? – RGM

답변

1

데이터를 다른 데이터 프레임으로 분리하는 대신 단일 데이터 프레임을 유지하고 lapply 예측 변수의 열 이름을 입력하십시오. 아래는 내장 된 mtcars 데이터 프레임을 사용한 예입니다.

my_lms = lapply(names(mtcars)[-grep("mpg", names(mtcars))], function(n) { 
    lm(paste("mpg ~ ", n), data=mtcars) 
}) 

그러면 요약 또는 신뢰 구간을 인쇄 할 수 있으며 변수의 실제 열 이름이 출력에 나타납니다. 모델을 생성하는 위의 코드에서

lapply(my_lms, summary) 
lapply(my_lms, confint) 

, 우리가 사용하는 데이터 프레임 lm 얘기하는 data 인수를 사용합니다. 그런 다음 모델 수식의 열 이름을 사용합니다.이 수식은 수식 대신 문자열을 사용하여 입력 할 수 있습니다. 이 방법을 사용하면 실제 변수 이름이 요약 출력에 나타납니다.

위에서 언급 한 것처럼 모델 수식 내의 하나 이상의 데이터 프레임에서 벡터를 가져 오면 모델 변수의 열 이름이 요약에 포함되지 않습니다. 또한 일부 보조 기능이 제대로 작동하지 않습니다. 예를 들어

m1 = lm(mtcars[,1] ~ mtcars[,6]) 
predict(m1, newdata=data.frame(wt=1:10)) 

이 경고를 발생시키는 모델 대신 우리는 함수에 입력 된 새로운 데이터를 피팅하는데 사용 된 데이터를 이용하고 Warning message: 'newdata' had 10 rows but variables found have 32 rowspredict 출력 예측.

열 이름의 명명 된 벡터를 사용하면 lapply에 의해 출력 된 목록 요소의 이름이 지정됩니다. 이를 통해 주어진 행을 모델로하는 마크가 추가 된 컬럼이있는 여러 모델의 출력을 포함하는 단일 데이터 프레임을 생성 할 수 있습니다.예를 들어 :

library(broom) 
library(purrr) 

vars = names(mtcars)[-grep("mpg", names(mtcars))] 

my_lms = lapply(setNames(vars, vars), function(n) { 
    lm(paste("mpg ~ ", n), data=mtcars) 
}) 

map_df(my_lms, tidy, .id="Predictor Variable") 
Predictor Variable  term estimate std.error statistic  p.value 
1     cyl (Intercept) 37.88457649 2.073843606 18.2678078 8.369155e-18 
2     cyl   cyl -2.87579014 0.322408883 -8.9196988 6.112687e-10 
3    disp (Intercept) 29.59985476 1.229719515 24.0704115 3.576586e-21 
4    disp  disp -0.04121512 0.004711833 -8.7471515 9.380327e-10 
5     hp (Intercept) 30.09886054 1.633920950 18.4212465 6.642736e-18 
6     hp   hp -0.06822828 0.010119304 -6.7423885 1.787835e-07 
7    drat (Intercept) -7.52461844 5.476662574 -1.3739423 1.796391e-01 
8    drat  drat 7.67823260 1.506705108 5.0960421 1.776240e-05 
9     wt (Intercept) 37.28512617 1.877627337 19.8575753 8.241799e-19 
10     wt   wt -5.34447157 0.559101045 -9.5590441 1.293959e-10 
11    qsec (Intercept) -5.11403815 10.029543299 -0.5098974 6.138544e-01 
12    qsec  qsec 1.41212484 0.559210130 2.5252133 1.708199e-02 
13     vs (Intercept) 16.61666667 1.079711283 15.3899167 8.846603e-16 
14     vs   vs 7.94047619 1.632370025 4.8643850 3.415937e-05 
15     am (Intercept) 17.14736842 1.124602541 15.2474922 1.133983e-15 
16     am   am 7.24493927 1.764421632 4.1061270 2.850207e-04 
17    gear (Intercept) 5.62333333 4.916379125 1.1437957 2.617534e-01 
18    gear  gear 3.92333333 1.308130699 2.9991906 5.400948e-03 
19    carb (Intercept) 25.87233385 1.836807218 14.0854923 9.218370e-15 
20    carb  carb -2.05571870 0.568545640 -3.6157497 1.084446e-03 

다른 모델 정보를 수집하려면, 예를 들어, 수행 할 수 있습니다

map_df(my_lms, confint_tidy, .id="Predictor Variable") 
map_df(my_lms, augment, .id="Predictor Variable") 
map_df(my_lms, glance, .id="Predictor Variable") 

UPDATE를 :을 주석 님의 질문에 답변

  1. names(mtcars)[-grep("mpg", names(mtcars))]의 기능은 무엇입니까?

    names(mtcars)은 모든 이름의 벡터를 반환하지만 결과 변수이기 때문에 mpg을 제외하려고합니다. grep("mpg", names(mtcars))mpg의 인덱스 위치를 mtcars 데이터 프레임에 반환합니다. 1 일 수 있습니다. mpg이 데이터 프레임의 첫 번째 열이기 때문에 발생합니다. 따라서 names(mtcars)[-grep("mpg", names(mtcars))]names(mtcars)[-1]과 같습니다. 즉, 위치 1의 값을 제외한 mtcars의 모든 열 이름 벡터를 반환한다는 것을 의미합니다. 그러나 grep은 알 필요없이 주어진 이름의 열을 제외 할 수 있기 때문에 사용했습니다 데이터 프레임 내의 인덱스 위치 names(mtcars)[-match("mpg", names(mtcars))]과 동일한 결과를 얻을 수 있습니다.

    (names(mtcars)[-grep("mpg", names(mtcars))] 그 이름의 일환으로 mpg를 포함하는 모든 열을 제외하기 때문에 사실, 후자는 안전합니다, 당신은 grep("^mpg$", names(mtcars))을 할 수있는 유일한 mpg에 맞게 grep을 강제로,하지만 어쩌면 문자열 일치의 세부에 도착하면 지금 당장 걱정하고 싶지는 않습니다.)

    부품을 별도로 실행하면 이러한 기능이 어떻게 작동하는지 알 수 있습니다. 예를 들어 grep("mpg", names(mtcars))을 실행합니다.

  2. 왜 인수 vars를 setNames(vars, vars)에 두 번 넣어야합니까?

    vars은 열 이름의 벡터입니다. setNames(vars, vars)은 벡터의 각 요소에 이름을 지정합니다. 출력을보고 단지 vars과 다른 점을 비교하려면 setNames(vars, vars)을 실행하십시오. setNames은 두 개의 인수를 취합니다. 첫 번째는 이름을 설정하려는 객체이고 두 번째 인수는 할당하려는 이름입니다. setNames(vars, LETTERS[1:length(vars)])은 알파벳의 처음 10자를 이름으로 사용합니다.) 의 목록 요소 이름으로이 이름을 사용하면 lapply이됩니다. lapply이 기본적으로 입력 값이 vars 인 출력 목록 요소의 이름을 지정했지만 좋지는 않습니다. setNames을 피하는 방법은 lapply 대신 sapply을 사용하는 것이지만 simplify=FALSE 인수를 추가해야합니다. lm(paste("mpg ~ ", n)을 :

    my_lms = sapply(vars, function(n) { 
        lm(paste("mpg ~ ", n), data=mtcars) 
    }, simplify=FALSE) 
    
  3. 어떻게 당신은 당신이 사용하는 경우 mpg과에 선형 회귀를 실행 R있는 변수를 알 수 있습니까? sapplylapply (이 경우 vars) 입력 벡터 또는 목록을 그 입력 벡터 또는 목록의 각 요소에 대해 기능을 실행 my_lms 작성하는 바로 위 sapply 함수에

    봐.이 경우 실행할 함수를 lm으로 지정합니다. n은 입력 벡터 vars을 다시 참조하는 "더미"인수입니다. 따라서 함수 n의 첫 번째 반복은 인 vars의 첫 번째 요소입니다. 두 번째 반복에서 n

  4. map_df은 (패키지 tidyverse 제품군의 일부 임) purrr 패키지 함수 등 disp이다. maplapply 또는 sapply과 같습니다. map_df은 목록이 아닌 데이터 프레임을 반환하기 때문에 편리합니다.

무료 콘텐츠 평점 : 전체 이용가 설명 R for Data Science이 도움이 될 수 있습니다.

+0

안녕하세요 이것은 훌륭한 대답 인 것처럼 보이지만 내 R 경험을 조금 넘어 설 수 있습니다. 특히 이름 (mtcars) [- grep ("mpg", 이름 (mtcars))] 의 코드는 무엇입니까 합니까? 난 단지 이름 (벡터) <로 이름을 사용하여 사용 해요 - namesvector 당신은 인수가 2 회에 바르 넣어야 할 이유 또한 : 'setNames (바르가 바르) '또한 어떻게 알 수 있습니까 어떤 변수를 사용할 때 MPG와의 선형 회귀를 실행합니다 R : '필름 (붙여 넣기 ("MPG ~", N)를, 데이터 =의 mtcars)' 마지막으로는, 어떤 기능은 다음과 같습니다 'map_df()' 입력 할 때 아무런 설명이 없습니까? map_df into R 기본 질문이 유용합니다. – RGM

+0

내 대답 업데이트를 참조하십시오. – eipi10