2016-10-27 2 views
1

나는이 작업을 수행하는 방법에 대해 꽤 합리적인 생각이 있다고 생각하지만, 모든 단계에서 100 % 확실하지는 않습니다. 이 질문은 대부분 제가 가장 효율적인 방법으로 이것을 수행하고 내 수학이 실제로 (내 통계 지식이 완전히 완벽하지 않으므로) 소리가 나는지 확인하기위한 온 전성 검사로 주로 사용됩니다.Python에서 많은 회귀를 계산하는 가장 빠른 방법은 무엇입니까?

어쨌든, 내가 뭘하려는거야에 대한 몇 가지 설명 :

은 내가 일부 선형 회귀 분석을 수행하고자하는 시계열 데이터를 많이 가지고있다. 특히 500 가지 변수에 대한 대략 2000 건의 관찰 결과가 있습니다. 각 변수에 대해 두 가지 설명 변수 (약 2000 개의 관측치가있는 두 개의 추가 벡터)를 사용하여 회귀 분석을 수행해야합니다. 따라서 각각의 500 가지 Y에 대해 Y = aX_1 + bX_2 + e에서 ab을 찾아야합니다.

까지 지금까지 회귀 분석을 수행하기 위해 statsmodels 패키지의 OLS 함수를 사용했습니다. 그러나 내가 알 수있는 한, 내 문제를 해결하기 위해 statsmodels 패키지를 사용하고 싶다면 일반적으로 비효율적 인 것처럼 수백 번 호출해야합니다.

그래서 대신 오랫동안 정말 감동하지 않은 통계를 다시 살펴보기로 결정했습니다. 내 지식이 여전히 정확하다면 모든 관측을 약 2000x500의 하나의 큰 Y 행렬에 넣을 수 있습니다. 그런 다음 설명 변수를 대략 2000x2 인 X 행렬에 붙이고 모든 결과를 얻습니다 (X'Y)/(X'X)을 계산하여 나의 회귀의 500. 기본 numpy 항목 (matrix.I를 사용하여 * 및 역수를 사용하는 행렬 곱셈)을 사용하여이 작업을 수행하는 경우 수백 개의 statsmodel OLS 호출을 수행하는 것보다 훨씬 빠를 것이라고 추측합니다.

  • 내가 여러 번 statsmodels를 호출 이전 방법보다 더 빨리 일을하고있는 NumPy와 물건인가 :

    여기에 내가 가지고있는 질문은? 그렇다면, 내가 원하는 것을 성취하는 가장 빠르고 효율적인 방법입니까? 나는 그것이 그렇다고 추측하고 있지만 더 나은 방법을 안다면 나는 그것을 듣고 기뻐할 것입니다. (분명히 나는 ​​이런 식으로 많은 회귀를 계산할 필요가있는 최초의 사람이 아니다.)

  • 행렬에 누락 된 데이터를 어떻게 처리합니까? 내 시계열 데이터가 훌륭하고 완벽하지 않아 때때로 값이 누락됩니다. Numpy에서 정규 행렬 곱셈을 시도하면 NA 값이 전파되고 최종 결과로 주로 NAs 행렬로 끝납니다. 독립적으로 각 회귀 분석을 수행하면 회귀 분석을 수행하기 전에 NAs가 포함 된 행을 삭제할 수 있지만 큰 2000x500 행렬에서이 작업을 수행하면 다른 일부 변수에서 실제가 아닌 비어있는 데이터가 삭제됩니다. , 나는 분명히 그런 일이 일어나기를 원하지 않는다.
  • 처음 매트릭스를 매트릭스에 배치하기 전에 시계열 데이터가 실제로 올바르게 정렬되도록하는 가장 효율적인 방법은 무엇입니까? 내 관측치의 시작일과 종료일은 반드시 같을 필요는 없으며 어떤 시리즈에서는 다른 관측치가없는 날도있을 수 있습니다. 이 작업을 수행하는 방법을 선택해야한다면 모든 관측 내용을 날짜로 인덱싱 된 팬더 데이터 프레임에 넣을 것입니다. 그렇다면 팬더는 모든 작업을 나를 위해 모든 작업을 완료하게 될 것이며, 작업이 완료된 후에 기본 ndarray를 추출 할 수 있습니다. 이것이 최선의 방법입니까, 아니면 팬더에 다른 방식으로 행렬을 만들지 않고 피할 수있는 오버 헤드가 있습니까? 반복 statsmodels를 호출
+0

어쩌면 http://codereview.stackexchange.com/이 귀하의 질문에 더 좋은 곳입니까? http://codereview.stackexchange.com/tour를 참조하십시오. – boardrider

답변

2

몇 가지 간단한 답변

1) 가장 빠른 방법이 아니다.매개 변수, 예측 및 잔차가 필요하고 동일한 설명 변수가 필요한 경우 보통은 params = pinv(x).dot(y)을 사용합니다. 여기서 y는 2 차원이고 나머지는 계산합니다. 문제는 추론, 신뢰 구간 및 유사한 작업이 필요하므로 속도가 중요하지 않고 제한된 결과 집합 만 필요하지 않으면 통계 모델 OLS가 훨씬 더 편리합니다.

이것은 모든 y와 x가 동일한 관측 색인, 누락 된 값 및 틈이없는 경우에만 작동합니다.

제외 : 설정은 향후 멀지 않은 시점에 통계 모델에서 지원할 수있는 다 변수 선형 모델입니다.

2) 및 3) 누락 된 셀이 있거나 관찰 (색인)이 완전히 겹쳐지지 않으면 사례 1)의 빠른 단순 선형 대수가 작동하지 않습니다. 아날로그 대 패널 데이터에서 첫 번째 경우에는 "균형"패널이 필요하고 다른 경우에는 "불균형"데이터가 포함됩니다. 표준적인 방법은 데이터를 블록 대각선 형식으로 설명 변수와 쌓는 것입니다. 이것은 메모리를 대량으로 증가시키기 때문에 스파 스 매트릭스와 스파 스 선형 대수를 사용하는 것이 좋습니다. 스파 스 문제를 해결하고 해결하는 것이 개별 OLS 회귀를 반복하는 것보다 빠르다는 구체적인 사례에 따라 다릅니다.

특수 코드 : (그냥 생각) : 케이스 2에서

) 완전히 중복 또는 cellwise하지 누락 된 값에, 우리는 여전히 모든 y를 모든 x'x 및 x'y 행렬을 계산해야 즉 그 중 500 개. 500 x 2 x 2의 회귀 변수를 가지고도 큰 메모리는 필요하지 않습니다. 따라서 누락 된 마스크를 교차 곱 계산의 가중치로 사용하여 매개 변수, 예측 및 잔차를 계산할 수 있습니다. numpy는 내가 아는 한 linalg.inv를 벡터화했습니다. 그래서 저는 이것이 몇 가지 벡터화 된 계산으로 수행 될 수 있다고 생각합니다.

관련 문제