Eine beliebte und leistungsstarke numerische Optimierungsmethode ist Brents Methode. Brents Methode ist ein Wurzelfindungsalgorithmus, der verschiedene Techniken wie die Bisektionsmethode, die Sekantenmethode und die inverse quadratische Interpolation kombiniert. Weitere Einzelheiten zu seiner Implementierung in Statsmodels finden Sie Hier.
In Python sieht die Implementierung folgendermaßen aus:
def solve_power(self, effect_size=None, nobs1=None, alpha=None, energy=None,
ratio=1., various='two-sided'):
print('--- Arguments: ---')
print('effect_size:', effect_size, 'nobs1:', nobs1, 'alpha:', alpha, 'energy:', energy, 'ratio:', ratio, 'various:', various, 'n')# Test that solely nobs1 is None
kwds = dict(effect_size=effect_size, nobs1=nobs1, alpha=alpha,
energy=energy, ratio=ratio, various=various)
key = (okay for okay,v in kwds.gadgets() if v is None)
assert(key == ('nobs1'))
# Test that the effect_size will not be 0
if kwds('effect_size') == 0:
increase ValueError('Can't detect an effect-size of 0. Attempt altering your effect-size.')
# Initialize the counter
self._counter = 0
# Outline the operate that we wish to discover the basis of
# We wish to discover nobs1 s.t. present energy = goal energy, i.e. present energy - goal energy = 0
# So func = present energy - goal energy
def func(x):
kwds('nobs1') = x
target_power = kwds.pop('energy') # at all times the identical goal energy laid out in key phrases, e.g. 0.8
current_power = self.energy(**kwds) # present energy given the present nobs1, be aware that self.energy doesn't have energy as an argument
kwds('energy') = target_power # add again energy to kwds
fval = current_power - target_power
print(f'Iteration {self._counter}: nobs1 = {x}, present energy - goal energy = {fval}')
self._counter += 1
return fval
# Get the beginning values for nobs1, given the brentq_expanding algorithm
# Within the authentic code, that is the self.start_bqexp dictionary arrange within the __init__ technique
bqexp_fit_kwds = {'low': 2., 'start_upp': 50.}
# Clear up for nobs1 utilizing brentq_expanding
print('--- Fixing for optimum nobs1: ---')
val, _ = brentq_expanding(func, full_output=True, **bqexp_fit_kwds)
return val
1.2. Schreiben einer abgespeckten Model von tt_ind_solve_power, die eine exakte Implementierung der statistischen Ableitung ist und die gleiche Ausgabe wie die ursprüngliche Funktion erzeugt
Die Quelldatei in Statsmodels ist verfügbar Hier. Während die ursprüngliche Funktion so geschrieben ist, dass sie leistungsfähiger ist, ist es aufgrund ihrer Generalisierbarkeit auch schwieriger, ein Gespür für die Funktionsweise des Codes zu entwickeln.
Daher habe ich den Quellcode Zeile für Zeile durchgesehen und ihn von 1.600 Codezeilen auf 160 und von über 10 Funktionen auf nur 2 vereinfacht, während ich gleichzeitig sichergestellt habe, dass die Implementierung identisch bleibt.
Der abgespeckte Code enthält nur zwei Funktionen unter der Klasse TTestIndPower und folgt exakt der in Teil 1 erläuterten statistischen Ableitung:
- Leistungdas die Leistung bei einer bestimmten Stichprobengröße berechnet
- löse_powerdie die minimale Stichprobengröße ermittelt, die eine Zielleistung mit der Brent-Methode erreicht
Dies ist der vollständige Code für die abgespeckte Model mit einem Take a look at, um zu überprüfen, ob er die gleiche Ausgabe wie die Originalfunktion erzeugt: