R 대 SciPy의 로그 정규 분포 적합


10

R을 사용하여 일련의 데이터를 가진 로그 정규 모델을 피팅했습니다. 결과 매개 변수는 다음과 같습니다.

meanlog = 4.2991610 
sdlog = 0.5511349

이 모델을 Scipy로 이전하고 싶습니다. Scipy를 사용하여 1과 3.1626716539637488e + 90의 모양과 스케일을 얻을 수있었습니다. 매우 다른 숫자입니다. 또한 meanlog 및 sdlog의 exp를 사용하려고했지만 기괴한 그래프를 계속 얻습니다.

나는 scipy에서 할 수있는 모든 문서를 읽었 으며이 인스턴스에서 모양 및 배율 매개 변수의 의미에 대해 여전히 혼란 스럽습니다. 함수를 직접 코딩하는 것이 합리적입니까? 나는 scipy를 처음 사용하기 때문에 오류가 발생하기 쉬운 것 같습니다.

SCIPY Lognormal (BLUE) vs. R Lognormal (RED) : Scipy Lognormal (BLUE) vs. R Lognormal (RED)

어떤 방향으로 갈 생각이 있습니까? 그런데 데이터는 R 모델에 매우 적합하므로 파이썬에서 다른 것처럼 보이는 경우 자유롭게 공유하십시오.

감사합니다!

최신 정보:

Scipy 0.11을 실행 중입니다.

다음은 데이터의 하위 집합입니다. 실제 샘플은 38k +이며 평균은 81.53627입니다.

서브 세트 :

x
[60, 170, 137, 138, 81, 140, 78, 46, 1, 168, 138, 148, 145, 35, 82, 126, 66, 147, 88, 106, 80, 54, 83, 13, 102, 54, 134, 34]
numpy.mean (x)
99.071428571428569

또는

PDF를 캡처하는 기능을 연구 중입니다.

def lognoral(x, mu, sigma):
    a = 1 / (x * sigma * numpy.sqrt(2 * numpy.pi) )
    b = - (numpy.log(x) - mu) ^ 2 / (2 * sigma ^ 2)
    p = a * numpy.exp(b)
    return p

그러나 이것은 나에게 다음과 같은 숫자를줍니다 (sdlog와 meanlog가 섞여있는 의미로 여러 가지를 시도했습니다).

>>> lognormal(54,4.2991610, 0.5511349)
0.6994656085799437
 >>> lognormal(54,numpy.exp(4.2991610), 0.5511349)
0.9846125119455129
>>> lognormal(54,numpy.exp(4.2991610), numpy.exp(0.5511349))
0.9302407837304372

이견있는 사람?

최신 정보:

"UPQuark 's 제안으로 다시 실행 :

모양, 위치, 스케일 (1.0, 50.03445923295007, 19.074457156766517)

그러나 그래프의 모양은 21과 비슷합니다.



고마워요, 나는 그것을 발견하고 로그 정규와 "맞춤"을 배웠습니다. 그러나 내 질문은 왜 그렇게 다른 분포를 얻습니까?
릴리안 밀라 그로스 카라스 키요

SciPy 0.9를 사용하고 있습니까? 또한 데이터 또는 그 하위 세트를 게시 할 수 있습니까?
jbowman

업데이트! 그건 그렇고 Scipy 0.11입니다. 내가 읽은 버그는 관련이 없어야한다;)
Lillian Milagros Carrasquillo

답변:


11

나는 scipy lognormal 루틴에 대한 다음 해석에 도달하기 위해 소스 코드를 통해 싸웠다.

xlocscaleLognormal(σ)

여기서 는 "shape"매개 변수입니다. σ

scipy 매개 변수와 R 매개 변수의 동등성은 다음과 같습니다.

loc-해당하는 값이 없습니다.이 값은 데이터에서 빼서 0이 데이터 범위의 최대 값이됩니다.

스케일 - , 변량의 로그의 평균이다. 적합 할 때 일반적으로 데이터 로그의 표본 평균을 사용합니다.expμμ

shape-변수 로그의 표준 편차입니다.

lognorm.pdf(x, 0.55, 0, numpy.exp(4.29))인수가 각각 (x, shape, loc, scale) 인 위치를 호출 하고 다음 값을 생성했습니다.

x pdf

10 0.000106

20 0.002275

30 0.006552

40 0.009979

50 0.114557

60 0.113479

70 0.103327

80 0.008941

90 0.007494

100 0.006155

R 곡선과 잘 어울리는 것 같습니다.


@JBowman에게 감사의 말씀을 전합니다. 이것이 바로 제가 필요한 설명이며 결과는 정확히 나의 분포입니다.
릴리안 밀라 그로스 카라스 키요

8

SciPy의 로그 정규 분포는 SciPy의 모든 분포에 대한 일반 프레임 워크에 적합 합니다 . 모두 scale 및 location 키워드가 있습니다 (명시 적으로 제공되지 않은 경우 기본값은 0 및 1). 이를 통해 모든 분포는 정규화 된 규격에서 분포 통계에 대한 명확한 의미로 이동 및 확장 될 수 있습니다. 분포에는 일반적으로 하나 이상의 "모양"매개 변수가 있습니다 (정규 분포와 같은 일부는 추가 매개 변수가 필요하지 않음).

이 일반적인 접근 방식은 모든 분포를 잘 통합하지만 로그 정규형의 경우 다른 패키지가 매개 변수를 정의하는 방식으로 인해 혼란을 일으킬 수 있습니다. 그러나 meanlog (기본 분포의 평균) 및 sdlog (기본 분포의 표준 편차) 인 경우 모든 로그 정규 분포를 일치시키는 것은 매우 간단합니다.

먼저 location 매개 변수를 0으로 설정하십시오. 그런 다음 shape 매개 변수를 sdlog 값으로 설정하십시오. 마지막으로 scale 매개 변수를 math.exp (meanlog)로 설정하십시오. 따라서 rv = scipy.stats.lognorm (0.5511349, scale = math.exp (4.2991610))은 pdf가 R 생성 곡선과 정확히 일치하는 분포 객체를 만듭니다. x = numpy.linspace (0,180,1000); plot (x, rv.pdf (x))가 확인합니다.

기본적으로 SciPy 로그 정규 분포는 location 매개 변수를 0으로 설정할 때 표준과 정확하게 일치하는 표준 로그 정규 분포의 일반화입니다.

.fit 방법으로 데이터를 피팅 할 때 키워드, f0..fn, floc 및 fshape를 사용하여 모양, 위치 및 / 또는 스케일 매개 변수를 고정하고 다른 변수에만 맞출 수 있습니다. 대수 정규 분포의 경우 일반적으로 위치 매개 변수를 0으로 고정해야한다는 것을 알고 있으므로 매우 유용합니다. 따라서 scipy.stats.lognorm.fit (dataset, floc = 0)은 항상 위치 매개 변수를 0으로 반환하고 다른 매개 변수 만 변경합니다 모양 및 스케일 매개 변수.


3

Scipy lognormal fit은 모양, 위치 및 배율을 반환합니다. 방금 샘플 가격 데이터 배열에서 다음을 실행했습니다.

shape, loc, scale = st.lognorm.fit(d_in["price"])

이것은 합리적인 추정치 1.0, 0.09, 0.86을 제공하며, 플롯 할 때 세 가지 모수를 모두 고려해야합니다.

모양 모수는 기본 정규 분포의 표준 편차이며, 척도는 정규 평균의 지수입니다.

도움이 되었기를 바랍니다.


답장을 보내 주셔서 감사합니다! 이 값 (loc, scale, shape)이 있으면 관심있는 각 x에 대한 pdf (x)를 찾으려고 노력합니다 (여기서는 0에서 180 사이의 값입니다). scipy.stats.lognorm.pdf (i, loc, scale, shape) 그러나, 이것을 플로팅하면 위의 플롯을 얻습니다.
릴리안 밀라 그로스 카라스 키요

OK 모양과 스케일 만 언급하는 것을 보았으므로 fit ()에서 기본적으로 세 개의 매개 변수가 반환됩니다. 또한 모양 및 배율 매개 변수의 의미에 대해 혼란 스럽다고 말했으며이를 해결하려고했습니다. 그래도 귀하의 경우와 같이 대수 정규 적합 반환 터무니없는 값은 없었습니다. 위치 매개 변수는 무엇입니까?
upquark

그 질문에 답하기 위해 질문을 업데이트했습니다. 이것에 대해 생각해 주셔서 감사합니다.
릴리안 밀라 그로스 카라스 키요

scipy.stats.lognorm.pdf (i, loc, scale, shape) 대신 scipy.stats.lognorm.pdf (x, shape, loc, scale)를 호출하십시오.
upquark

고마워, upquark, 나는 비슷한 결과와 함께 그 일을했습니다. 그래프의 전체 모양은 R의 예상 결과와 계속 매우 다릅니다. 실제로 R의 분포와 완전히 다른 분포처럼 보입니다.
릴리안 밀라 그로스 카라스 키요

1

대수에 대한 Scipy의 분포는 R의 분포와 같지 않거나 일반적으로 익숙한 분포와 같지 않습니다. John D Cook은 이에 대해 언급했습니다 : http://www.johndcook.com/blog/2010/02/03/statistical-distributions-in-scipy/ http://www.johndcook.com/distributions_scipy.html

그러나 파이썬에서 로그 정규 밀도 함수를 사용하는 방법에 대한 결론을 찾지 못했습니다. 누군가가 이것에 추가하고 싶다면 자유롭게 느끼십시오.

지금까지 내 해결책은 0에서 180으로 평가 된 로그 노멀 pdf를 사용하고 파이썬 스크립트에서 사전으로 사용하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.