Evaluating type-A uncertainty
Type-A evaluation of uncertainty involves statistical analysis of data (in contrast to type-B evaluation, which uses some means other than statistical analysis).
The shorter name ta has been defined as an alias for type_a,
to resolve the names of objects defined in this module.
Sample estimates
estimate()returns an uncertain number defined from the statistics of a sample of data.
multi_estimate_real()returns a sequence of related uncertain real numbers defined from the multivariate statistics calculated from a sample of data.
multi_estimate_complex()returns a sequence of related uncertain complex numbers defined from the multivariate statistics of a sample of data.
estimate_digitized()returns an uncertain number for the mean of a sample of digitized data.
mean()returns the mean of a sample of data.
standard_uncertainty()evaluates the standard uncertainty associated with the sample mean.
standard_deviation()evaluates the standard deviation of a sample of data.
variance_covariance_complex()evaluates the variance and covariance associated with the mean real component and mean imaginary component of the data.
Least squares regression
line_fit()performs an ordinary least-squares straight line fit to a sample of data.
line_fit_wls()performs a weighted least-squares straight line fit to a sample of data. The weights are assumed to be exact.
line_fit_rwls()performs a weighted least-squares straight line fit to a sample of data. The weights are only assumed normalise the variability of observations.
line_fit_wtls()performs a weighted total least-squares straight line fit to a sample of data.
Merging uncertain components
merge()combines results from a type-A and type-B analysis of the same data.
Module contents
- class LineFitOLS(a, b, ssr, N)
Class to hold the results of an ordinary least-squares regression to data.
It can also be used to apply the results of a regression analysis.
Added in version 1.2.
- property N
The number of points in the sample
- property a_b
Return the intercept
aand slopebas a tuple of uncertain numbers
- property intercept
Return the intercept as an uncertain number.
- property slope
Return the slope as an uncertain number.
- property ssr
Sum of the squared residuals
The sum of the squared deviations between values predicted by the model and the actual data.
If weights are used during the fit, the squares of weighted deviations are summed.
- x_from_y(yseq, x_label=None, y_label=None)
Estimate the stimulus
xcorresponding to the responses inyseq- Parameters:
yseq – a sequence of
yobservationsx_label – a label for the return uncertain number
xy_label – a label for the estimate of y based on
yseq
Note
When
x_labelis defined, the uncertain number returned will be declared an intermediate result (usingresult())Example
>>> x_data = [0.1, 0.1, 0.1, 0.3, 0.3, 0.3, 0.5, 0.5, 0.5, ... 0.7, 0.7, 0.7, 0.9, 0.9, 0.9] >>> y_data = [0.028, 0.029, 0.029, 0.084, 0.083, 0.081, 0.135, 0.131, ... 0.133, 0.180, 0.181, 0.183, 0.215, 0.230, 0.216] >>> fit = type_a.line_fit(x_data,y_data) >>> x0 = fit.x_from_y( [0.0712, 0.0716] ) >>> x0 ureal(0.2601659751037...,0.01784461112558...,13.0)
- y_from_x(x, s_label=None, y_label=None)
Return an uncertain number
ythat predicts the response tox- Parameters:
x – a real number, or an uncertain real number
s_label – a label for an elementary uncertain number associated with observation variability
y_label – a label for the return uncertain number y
This is a prediction of a single future response
yto a stimulusxThe variability in observations is based on residuals obtained during regression.
An uncertain real number can be used for
x, in which case the associated uncertainty will also be propagated intoy.Note
When
y_labelis defined, the uncertain number returned will be declared an intermediate result (usingresult())
- class LineFitRWLS(a, b, ssr, N)
Class to hold the results of a relative weighted least-squares regression. The weights provided normalise the variability of observations.
Added in version 1.2.
- property N
The number of points in the sample
- property a_b
Return the intercept
aand slopebas a tuple of uncertain numbers
- property intercept
Return the intercept as an uncertain number.
- property slope
Return the slope as an uncertain number.
- property ssr
Sum of the squared residuals
The sum of the squared deviations between values predicted by the model and the actual data.
If weights are used during the fit, the squares of weighted deviations are summed.
- x_from_y(yseq, s_y, x_label=None, y_label=None)
Estimate the stimulus
xcorresponding to the responses inyseq- Parameters:
yseq – a sequence of further observations of
ys_y – a scale factor for the uncertainty of the
yseqx_label – a label for the return uncertain number x
y_label – a label for the estimate of y based on
yseq
Note
When
x_labelis defined, the uncertain number returned will be declared an intermediate result (usingresult())
- y_from_x(x, s_y, s_label=None, y_label=None)
Return an uncertain number
ythat predicts the response tox- Parameters:
x – a real number, or an uncertain real number
s_y – a scale factor for the response uncertainty
s_label – a label for an elementary uncertain number associated with observation variability
y_label – a label for the return uncertain number y
Returns a single future response
ypredicted for a stimulusx.Because there is different variability in the response to different stimuli, the scale factor
s_yis required. It is assumed that the standard deviation in theyvalue is proportional tos_y.An uncertain real number can be used for
x, in which case the associated uncertainty is also propagated intoy.Note
When
y_labelis defined, the uncertain number returned will be declared an intermediate result (usingresult())
- class LineFitWLS(a, b, ssr, N)
Class to hold the results of a weighted least-squares regression. The weight factors provided are assumed to correspond exactly to the variability of observations.
Added in version 1.2.
- property N
The number of points in the sample
- property a_b
Return the intercept
aand slopebas a tuple of uncertain numbers
- property intercept
Return the intercept as an uncertain number.
- property slope
Return the slope as an uncertain number.
- property ssr
Sum of the squared residuals
The sum of the squared deviations between values predicted by the model and the actual data.
If weights are used during the fit, the squares of weighted deviations are summed.
- x_from_y(y_data, u_y_data, x_label=None, y_label=None)
Estimate the stimulus
xcorresponding to the responses iny_data- Parameters:
y_data – a sequence of further observations of
yu_y_data – the standard uncertainty of the
y_dataelementsx_label – a label for the return uncertain number x
y_label – a label for the estimate of y based on
y_data
The variations in
y_datavalues are assumed to result from independent random effects.Note
When
x_labelis defined, the uncertain number returned will be declared an intermediate result (usingresult())
- y_from_x(x, s_y, s_label=None, y_label=None)
Return an uncertain number
ythat predicts the response tox- Parameters:
x – a real number, or an uncertain real number
s_y – response variability uncertainty
s_label – a label for an elementary uncertain number associated with response variability
y_label – a label for the return uncertain number y
Returns a single future response
ypredicted for a stimulusx.The standard uncertainty
s_yis used to create an additive component of uncertainty associated with variability in theyvalue.An uncertain real number can be used for
x, in which case the associated uncertainty is also propagated intoy.Note
When
y_labelis defined, the uncertain number returned will be declared an intermediate result (usingresult())
- class LineFitWTLS(a, b, ssr, N)
This object holds results from a TLS linear regression to data.
Added in version 1.2.
- property N
The number of points in the sample
- property a_b
Return the intercept
aand slopebas a tuple of uncertain numbers
- property intercept
Return the intercept as an uncertain number.
- property slope
Return the slope as an uncertain number.
- property ssr
Sum of the squared residuals
The sum of the squared deviations between values predicted by the model and the actual data.
If weights are used during the fit, the squares of weighted deviations are summed.
- estimate(seq, label=None)
Return an uncertain number for the mean of the data in
seq- Parameters:
seq – a sequence of data
label (str) – a label for the returned uncertain number
- Return type:
The elements of
seqmay be real numbers, complex numbers, or uncertain real or complex numbers. Note that only the value of uncertain numbers will be used.The function returns an
UncertainRealwhen the mean of the data is real, and anUncertainComplexwhen the mean of the data is complex.In a type-A evaluation, the sample mean provides an estimate of the quantity of interest. The uncertainty in this estimate is the standard deviation of the sample mean (or the sample covariance of the mean, in the complex case).
Examples:
>>> data = range(15) >>> type_a.estimate(data) ureal(7.0,1.1547005383792515,14) >>> data = [(0.91518731126816899+1.5213442955575518j), ... (0.96572684493613492-0.18547192979059401j), ... (0.23216598132006649+1.6951311687588568j), ... (2.1642786101267397+2.2024333895672563j), ... (1.1812532664590505+0.59062101107787357j), ... (1.2259264339405165+1.1499373179910186j), ... (-0.99422341300318684+1.7359338393131392j), ... (1.2122867690240853+0.32535154897909946j), ... (2.0122536479379196-0.23283009302603963j), ... (1.6770229536619197+0.77195994890476838j)] >>> type_a.estimate(data) ucomplex((1.059187840567141+0.9574410497332932j), u=[0.28881665310241805,0.2655555630050262], r=-0.3137404512459525, df=9)
- estimate_digitized(seq, delta, label=None, truncate=False)
Return an uncertain number for the mean of digitized data in
seq- Parameters:
seq (float,
UncertainRealorUncertainComplex) – datadelta (float) – digitization step size
label (str) – label for uncertain number returned
truncate (bool) – if
True, truncation, rather than rounding, is assumed
- Return type:
A sequence of data that has been formatted with fixed precision can completely conceal a small amount of variability in the original values, or merely obscure that variability.
This function recognises the possible interaction between truncation, or rounding, errors and random errors in the underlying data. The function evaluates the mean of the data and evaluates the uncertainty in this mean.
Set the argument
truncatetoTrueif data have been truncated, instead of rounded.See reference: R Willink, Metrologia, 44 (2007) 73-81
Examples:
# LSD = 0.0001, data varies between -0.0055 and -0.0057 >>> seq = (-0.0056,-0.0055,-0.0056,-0.0056,-0.0056, ... -0.0057,-0.0057,-0.0056,-0.0056,-0.0057,-0.0057) >>> type_a.estimate_digitized(seq,0.0001) ureal(-0.005627272727272...,1.9497827808661...e-05,10) # LSD = 0.0001, data varies between -0.0056 and -0.0057 >>> seq = (-0.0056,-0.0056,-0.0056,-0.0056,-0.0056, ... -0.0057,-0.0057,-0.0056,-0.0056,-0.0057,-0.0057) >>> type_a.estimate_digitized(seq,0.0001) ureal(-0.005636363636363...,1.52120004824377...e-05,10) # LSD = 0.0001, no spread in data values >>> seq = (-0.0056,-0.0056,-0.0056,-0.0056,-0.0056, ... -0.0056,-0.0056,-0.0056,-0.0056,-0.0056,-0.0056) >>> type_a.estimate_digitized(seq,0.0001) ureal(-0.0056,2.8867513459481...e-05,10) # LSD = 0.0001, no spread in data values, fewer points >>> seq = (-0.0056,-0.0056,-0.0056) >>> type_a.estimate_digitized(seq,0.0001) ureal(-0.0056,3.2914029430219...e-05,2)
- line_fit(x, y, label=None)
Return a least-squares straight-line fit to the data
- Parameters:
x – sequence of stimulus data (independent-variable)
y – sequence of response data (dependent-variable)
label – suffix to label the uncertain numbers a and b
- Returns:
an object containing regression results
- Return type:
Performs an ordinary least-squares regression of
ytox.Example:
>>> x = [1,2,3,4,5,6,7,8,9] >>> y = [15.6,17.5,36.6,43.8,58.2,61.6,64.2,70.4,98.8] >>> result = type_a.line_fit(x,y) >>> a,b = result.a_b >>> a ureal(4.8138888888888...,4.8862063121833...,7) >>> b ureal(9.4083333333333...,0.8683016476563...,7) >>> y_p = a + b*5.5 >>> dof(y_p) 7.0
Added in version 1.2.
- line_fit_rwls(x, y, s_y, dof=None, label=None)
Return a relative weighted least-squares straight-line fit
The
s_yvalues are used to scale variability in theydata. It is assumed that the standard deviation of eachyvalue is proportional to the correspondings_yscale factor. The unknown common factor in the uncertainties is estimated from the residuals.- Parameters:
x – sequence of stimulus data (independent-variable)
y – sequence of response data (dependent-variable)
s_y – sequence of scale factors
dof – degrees of freedom
label – suffix to label the uncertain numbers a and b
- Returns:
an object containing regression results
- Return type:
The optional argument
dofcan be used to choose the number of degrees of freedom attributed to the uncertain numbers returned for the slope and intercept. By default, the degrees of freedom is N - 2, where N is the length of the data sequence. However, when the elements ofs_yare not all equal this value will be too high. The argument may be set as appropriate.Example:
>>> x = [1,2,3,4,5,6] >>> y = [3.014,5.225,7.004,9.061,11.201,12.762] >>> s_y = [0.2,0.2,0.2,0.4,0.4,0.4] >>> fit = type_a.line_fit_rwls(x,y,s_y) >>> a, b = fit.a_b >>> >>> print(fit) Relative Weighted Least-Squares Results: Intercept: 1.14(12) Slope: 1.973(41) Correlation: -0.87 Sum of the squared residuals: 1.3395217958... Number of points: 6
Changed in version 1.4.1:
dofkeyword argument addedAdded in version 1.2.
- line_fit_wls(x, y, u_y, dof=None, label=None)
Return a weighted least-squares straight-line fit
- Parameters:
x – sequence of stimulus data (independent-variable)
y – sequence of response data (dependent-variable)
u_y – sequence of uncertainties in the response data
dof – degrees of freedom
label – suffix to label the uncertain numbers a and b
- Returns:
an object containing regression results
- Return type:
The optional argument
dofcan be used to choose the number of degrees of freedom attributed to the uncertain numbers returned for the slope and intercept. By default, infinite degrees of freedom is used, because weighting is provided for theydata suggesting that the dispersion is known.Example:
>>> x = [1,2,3,4,5,6] >>> y = [3.2, 4.3, 7.6, 8.6, 11.7, 12.8] >>> u_y = [0.5,0.5,0.5,1.0,1.0,1.0] >>> fit = type_a.line_fit_wls(x,y,u_y) >>> fit.a_b InterceptSlope(a=ureal(0.8852320675105...,0.5297081435088...,inf), b=ureal(2.056962025316...,0.177892016741...,inf))
Changed in version 1.4.1:
dofkeyword argument addedAdded in version 1.2.
- line_fit_wtls(x, y, u_x, u_y, a0_b0=None, r_xy=None, dof=None, label=None)
Return a total least-squares straight-line fit
- Parameters:
x – sequence of independent-variable data
y – sequence of dependent-variable data
u_x – sequence of uncertainties in
xu_y – sequence of uncertainties in
ya0_b0 – a pair of initial estimates for the intercept and slope
r_xy – correlation between x-y pairs
dof – degrees of freedom
label – suffix labeling the uncertain numbers a and b
- Returns:
an object containing the fitting results
- Return type:
The optional argument
a_bcan be used to provide a pair of initial estimates for the intercept and slope.The optional argument
dofcan be used to choose the number of degrees of freedom attributed to the uncertain numbers returned for the slope and intercept. By default, the degrees of freedom are infinite, because weighting is provided for thexandydata suggesting that the dispersion is known.Based on paper by M Krystek and M Anton, Meas. Sci. Technol. 22 (2011) 035101 (9pp)
Example:
# Pearson-York test data see, e.g., # Lybanon, M. in Am. J. Phys 52 (1) 1984 >>> x=[0.0,0.9,1.8,2.6,3.3,4.4,5.2,6.1,6.5,7.4] >>> wx=[1000.0,1000.0,500.0,800.0,200.0,80.0,60.0,20.0,1.8,1.0] >>> y=[5.9,5.4,4.4,4.6,3.5,3.7,2.8,2.8,2.4,1.5] >>> wy=[1.0,1.8,4.0,8.0,20.0,20.0,70.0,70.0,100.0,500.0] # standard uncertainties required for weighting >>> ux=[1./math.sqrt(wx_i) for wx_i in wx ] >>> uy=[1./math.sqrt(wy_i) for wy_i in wy ] >>> result = ta.line_fit_wtls(x,y,ux,uy) >>> intercept, slope = result.a_b >>> intercept ureal(5.47991018...,0.29193349...,inf) >>> slope ureal(-0.48053339...,0.057616740...,inf)
Changed in version 1.4.1:
dofkeyword argument addedAdded in version 1.2.
- mean(seq, *args, **kwargs)
Return the arithmetic mean of data in
seq- Parameters:
If
seqcontains real or uncertain real numbers, a real number is returned.If
seqcontains complex or uncertain complex numbers, a complex number is returned.Example:
>>> data = range(15) >>> type_a.mean(data) 7.0
Note
When
seqis an emptyndarrayor andarraycontaining anyNaNelementsNaNis returned.In other cases, a
ZeroDivisionErroris raised when there are no elements inseq.
- merge(a, b, TOL=1e-13)
Combine the uncertainty components of
aandb- Parameters:
a – an uncertain real or complex number
b – an uncertain real or complex number
TOL – float
- Returns:
an uncertain number with the value of
aand the uncertainty components ofaandbcombined
The absolute difference between the values of
aandbmust be less thanTOLand the components of uncertainty associated withaandbmust be distinct, otherwise aRuntimeErrorwill be raised.Use this function to combine results from type-A and type-B uncertainty analyses performed on a common sequence of data.
Note
Some judgement will be required as to when it is appropriate to merge uncertainty components.
There is a risk of ‘double-counting’ uncertainty if type-B components are contributing to the variability observed in the data, and therefore assessed in a type-A analysis.
Changed in version 1.3.3: Added the TOL keyword argument.
Example:
# From Appendix H3 in the GUM # Thermometer readings (degrees C) t = (21.521,22.012,22.512,23.003,23.507, 23.999,24.513,25.002,25.503,26.010,26.511) # Observed differences with calibration standard (degrees C) b = (-0.171,-0.169,-0.166,-0.159,-0.164, -0.165,-0.156,-0.157,-0.159,-0.161,-0.160) # Arbitrary offset temperature (degrees C) t_0 = 20.0 # Calculate the temperature relative to t_0 t_rel = [ t_k - t_0 for t_k in t ] # A common systematic error in all differences e_sys = ureal(0,0.01) b_type_b = [ b_k + e_sys for b_k in b ] # Type-A least-squares regression y_1_a, y_2_a = type_a.line_fit(t_rel,b_type_b).a_b # Type-B least-squares regression y_1_b, y_2_b = type_b.line_fit(t_rel,b_type_b) # `y_1` and `y_2` have uncertainty components # related to the type-A analysis as well as the # type-B systematic error y_1 = type_a.merge(y_1_a,y_1_b) y_2 = type_a.merge(y_2_a,y_2_b)
- multi_estimate_complex(seq_of_seq, labels=None)
Return a sequence of uncertain complex numbers
- Parameters:
seq_of_seq – a sequence of sequences of data
labels – a sequence of str labels
- Return type:
a sequence of
UncertainComplex
The sequences in
seq_of_seqmust all be the same length. Each sequence contains data that is associated with a particular quantity. An uncertain number for that quantity will be created from sample statistics. The covariance between the different quantities will also be evaluated.A sequence of elementary uncertain complex numbers is returned. These uncertain numbers are considered to be related, allowing a degrees-of-freedom calculations to be performed on derived quantities.
Example:
# From Appendix H2 in the GUM >>> I = [ complex(x) for x in (19.663E-3,19.639E-3,19.640E-3,19.685E-3,19.678E-3) ] >>> V = [ complex(x) for x in (5.007,4.994,5.005,4.990,4.999)] >>> P = [ complex(0,p) for p in (1.0456,1.0438,1.0468,1.0428,1.0433) ] >>> v,i,p = type_a.multi_estimate_complex( (V,I,P) ) >>> get_correlation(v.real,i.real) -0.355311219817512 >>> z = v/i*exp(p) >>> z.real ureal(127.732169928102...,0.071071407396995...,4.0) >>> get_correlation(z.real,z.imag) -0.588429784423515...
- multi_estimate_real(seq_of_seq, labels=None)
Return a sequence of uncertain real numbers
- Parameters:
seq_of_seq – a sequence of sequences of data
labels – a sequence of str labels
- Return type:
seq of
UncertainReal
The sequences in
seq_of_seqmust all be the same length. Each sequence contains a sample of data associated with a particular quantity. An uncertain number will be created for the quantity from sample statistics. The covariance between the different quantities will also be evaluated.A sequence of elementary uncertain numbers is returned. These uncertain numbers are considered to be related, allowing a degrees-of-freedom calculations to be performed on derived quantities.
Example:
# From Appendix H2 in the GUM >>> V = [5.007,4.994,5.005,4.990,4.999] >>> I = [19.663E-3,19.639E-3,19.640E-3,19.685E-3,19.678E-3] >>> phi = [1.0456,1.0438,1.0468,1.0428,1.0433] >>> v,i,p = type_a.multi_estimate_real((V,I,phi),labels=('V','I','phi')) >>> v ureal(4.999...,0.0032093613071761...,4, label='V') >>> i ureal(0.019661,9.471008394041335...e-06,4, label='I') >>> p ureal(1.04446...,0.0007520638270785...,4, label='phi') >>> r = v/i*cos(p) >>> r ureal(127.732169928102...,0.071071407396995...,4.0)
- standard_deviation(seq, mu=None)
Return the sample standard deviation
- Parameters:
seq – sequence of data
mu – the arithmetic mean of
seq
If
seqcontains real or uncertain real numbers, the sample standard deviation is returned.If
seqcontains complex or uncertain complex numbers, the standard deviation in the real and imaginary components is evaluated, as well as the correlation coefficient between the components. The results are returned in a pair of objects: aStandardDeviationnamedtuple and a correlation coefficient.Only the values of uncertain numbers are used in calculations.
Examples:
>>> data = range(15) >>> type_a.standard_deviation(data) 4.47213595499958 >>> data = [(0.91518731126816899+1.5213442955575518j), ... (0.96572684493613492-0.18547192979059401j), ... (0.23216598132006649+1.6951311687588568j), ... (2.1642786101267397+2.2024333895672563j), ... (1.1812532664590505+0.59062101107787357j), ... (1.2259264339405165+1.1499373179910186j), ... (-0.99422341300318684+1.7359338393131392j), ... (1.2122867690240853+0.32535154897909946j), ... (2.0122536479379196-0.23283009302603963j), ... (1.6770229536619197+0.77195994890476838j)] >>> sd,r = type_a.standard_deviation(data) >>> sd StandardDeviation(real=0.913318449990377, imag=0.8397604244242309) >>> r -0.31374045124595246
- standard_uncertainty(seq, mu=None)
Return the standard uncertainty associated with the sample mean
- Parameters:
seq – sequence of data
mu – the arithmetic mean of
seq
- Return type:
float or
StandardUncertainty
If
seqcontains real or uncertain real numbers, the standard uncertainty of the sample mean is returned.If
seqcontains complex or uncertain complex numbers, the standard uncertainties of the real and imaginary components are evaluated, as well as the sample correlation coefficient are returned in aStandardUncertaintynamedtupleOnly the values of uncertain numbers are used in calculations.
Example:
>>> data = range(15) >>> type_a.standard_uncertainty(data) 1.1547005383792515 >>> data = [(0.91518731126816899+1.5213442955575518j), ... (0.96572684493613492-0.18547192979059401j), ... (0.23216598132006649+1.6951311687588568j), ... (2.1642786101267397+2.2024333895672563j), ... (1.1812532664590505+0.59062101107787357j), ... (1.2259264339405165+1.1499373179910186j), ... (-0.99422341300318684+1.7359338393131392j), ... (1.2122867690240853+0.32535154897909946j), ... (2.0122536479379196-0.23283009302603963j), ... (1.6770229536619197+0.77195994890476838j)] >>> u,r = type_a.standard_uncertainty(data) >>> u StandardUncertainty(real=0.28881665310241805, imag=0.2655555630050262) >>> u.real 0.28881665310241805 >>> r -0.31374045124595246
- variance_covariance_complex(seq, mu=None)
Return the sample variance-covariance matrix
- Parameters:
seq – sequence of data
mu – the arithmetic mean of
seq
- Returns:
a 4-element sequence
If
muisNonethe mean will be evaluated bymean().seqmay contain numbers or uncertain numbers. Only the values of uncertain numbers are used in calculations.Variance-covariance matrix elements are returned in a
VarianceCovariancenamedtuple; they can be accessed using the attributes.rr,.ri,,irand.ii.Example:
>>> data = [(0.91518731126816899+1.5213442955575518j), ... (0.96572684493613492-0.18547192979059401j), ... (0.23216598132006649+1.6951311687588568j), ... (2.1642786101267397+2.2024333895672563j), ... (1.1812532664590505+0.59062101107787357j), ... (1.2259264339405165+1.1499373179910186j), ... (-0.99422341300318684+1.7359338393131392j), ... (1.2122867690240853+0.32535154897909946j), ... (2.0122536479379196-0.23283009302603963j), ... (1.6770229536619197+0.77195994890476838j)] >>> type_a.variance_covariance_complex(data) VarianceCovariance(rr=0.8341505910928249, ri=-0.24062910264062262, ir=-0.24062910264062262, ii=0.7051975704291644) >>> v = type_a.variance_covariance_complex(data) >>> v[0] 0.8341505910928249 >>> v.rr 0.8341505910928249 >>> v.ii 0.7051975704291644