Python: функция Numpy Gamma выдает неверное среднее значение для параметра масштаба - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь нарисовать 1000 сэмплов (каждый размером 227) из гамма-метода numpy.random, поэтому каждое значение сэмпла должно быть i.i.d (независимым и одинаково распределенным). Однако среднее значение для параметра масштаба неверно.

Мой параметр формы (альфа) равен 0,375, а мой параметр масштаба (лямбда) равен 1,674

Согласно моему учебнику, здесь приведены формулы оценочных значений для этих двух параметров:

alpha = ( xbar ^ 2 ) / ( sigma_hat ^ 2 )
lambda = ( xbar ) / ( sigma_hat ^ 2 )

Я думаю, что я мог использовать метод Pandas .apply () неправильно или моя функция get_lambda_hat неверна.

# In[11]:

# Import libraries:

import pandas as pd
import numpy as np
from numpy.random import gamma # gamma function
import seaborn as sns # plotting library

# plot histograms immediately:
get_ipython().run_line_magic('matplotlib', 'inline')


# In[12]:


# Define functions

def get_samples_from_gamma_dist( num_of_samples, size_of_samples, alpha, lamb ):
    '''
    Returns table with ( num_of_samples ) rows and ( size_of_samples ) columns.
    Cells in the table are i.i.d sample values from numpy's gamma function
    with shape parameter ( alpha ) and scale parameter ( lamb ).
    '''
    return pd.DataFrame( 
            data = gamma( 
                    shape = alpha, 
                    scale = lamb, 
                    size = 
                        ( 
                            num_of_samples, 
                            size_of_samples 
                        )
                )
            )

# Returns alpha_hat of a sample:
get_alpha_hat = lambda sample : ( sample.mean()**2 ) / sample.var()

# Returns lambda_hat of a sample:
get_lambda_hat = lambda sample : sample.mean() / sample.var()


# In[13]:


# Retrieve samples

# Declaring variables...
my_num_of_samples = 1000
my_size_of_samples = 227
my_alpha = 0.375
my_lambda = 1.674

# Initializing table...
data = get_samples_from_gamma_dist( 
    num_of_samples= my_num_of_samples, 
    size_of_samples= my_size_of_samples, 
    alpha= my_alpha, 
    lamb= my_lambda 
)

# Getting estimated parameter values from each sample...
alpha_hats = data.apply( get_alpha_hat, axis = 1 ) # apply function across the table's columns
lambda_hats = data.apply( get_lambda_hat, axis = 1 ) # apply function across the table's columns


# In[14]:


# Plot histograms:

# Setting background of histograms to 'whitegrid'...
sns.set_style( style = 'whitegrid' )

# Plotting the sample distribution of alpha_hat...
sns.distplot( alpha_hats, 
             hist = True, 
             kde = True, 
             bins = 50, 
             axlabel = 'Estimates of Alpha',
             hist_kws=dict(edgecolor="k", linewidth=2),
             color = 'red' )


# In[15]:


# Plotting the sample distribution of lambda_hat...
sns.distplot( lambda_hats, 
             hist = True, 
             kde = True, 
             bins = 50, 
             axlabel = 'Estimates of Lambda',
             hist_kws=dict(edgecolor="k", linewidth=2),
             color = 'purple' )


# In[16]:


# Print results:

print( "Mean of alpha_hats =", alpha_hats.mean(), '\n'  )

print( "Mean of lambda_hats =", lambda_hats.mean(), '\n' ) # about 0.62

print( "Standard Error of alpha_hats =", alpha_hats.std( ddof = 0 ), '\n'  )

print( "Standard Error of lambda_hats =", lambda_hats.std( ddof = 0 ), '\n'  )

После того, как я построил гистограммы оценочных значений альфа и лямбда соответственно, я заметил, что распределение образца альфа центрировано почти идеально на 0,375, но распределение образца лямбды центрировано около 0,62, что далеко от 1,674. Я пытался играть с другими значениями лямбды, но, похоже, она никогда не центрируется правильно.

Я бы хотел знать, есть ли у кого-нибудь предложения по решению этой проблемы. Я включил весь код из файла .py, загруженного из сеанса моего ноутбука jupyter.

1 Ответ

0 голосов
/ 16 января 2019

Fixed. Функция вероятности массы гамма-функции реализована в numpy.random иначе, чем в моем учебнике.

Я получил правильное среднее значение, установив параметр 'scale' в теле get_samples_from_gamma_dist () в 1 / lamb:

def get_samples_from_gamma_dist( num_of_samples, size_of_samples, alpha, lamb ):
'''
Returns table with ( num_of_samples ) rows and ( size_of_samples ) columns.
Cells in the table are i.i.d sample values from numpy's gamma function
with shape parameter ( alpha ) and scale parameter ( 1 / lamb ).
'''
return pd.DataFrame( 
        data = gamma( 
                shape = alpha, 
                scale = 1 / lamb, 
                size = 
                    ( 
                        num_of_samples, 
                        size_of_samples 
                    )
            )
        )
...