Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lincoln Index - Three parameter model #62

Closed
zjachc opened this issue Sep 22, 2022 · 17 comments
Closed

Lincoln Index - Three parameter model #62

zjachc opened this issue Sep 22, 2022 · 17 comments

Comments

@zjachc
Copy link

zjachc commented Sep 22, 2022

I am receiving the following error when I attempt to compute the likelihood in the three parameter model:
for N, p0, p1 in joint3_pmf.index:

ValueError: not enough values to unpack (expected 3, got 2)

I think the issue is that when I attempt to use make_joint using p1 and the joint2_pmf, I do not get the triplet, but rather only the pair, mean p1 is not attaching and thus the multi-index only has 2 items instead of three.

Do you have any suggestions about how best to fix?

Thank you

@zjachc
Copy link
Author

zjachc commented Sep 22, 2022

Here is the entire script leading up to the problem:

Priors

params N, p0, p1, reuse prior_N

qs = np.linspace(0, 1, num=51)
prior_p0 = make_uniform(qs, name='p0')
prior_p1 = make_uniform(qs, name='p1')

Assemble into joint prior w/ 3-dim

put first two into DataFrame

joint2 = make_joint(prior_p0, prior_N)
joint2.shape

Stack and put result into a Pmf

joint2_pmf = Pmf(joint2.stack())
joint2_pmf.head(3)

Use make_joint again to add in 3rd param

joint3 = make_joint(prior_p1, joint2_pmf)
joint3.shape

joint3.head(3)

result is a DataFrame w/ values of N & p0 in a multi-index that goes down the rows

and values of p1 in an index that goes across the columns

apply stack again

joint3_pmf = Pmf(joint3.stack())
joint3_pmf.head(3)

joint3_pmf.shape

Loop that computes the likelihoods

likelihood = joint3_pmf.copy()
observed = data.sum()
x = data.copy()

for N, p0, p1 in joint3_pmf.index:
x[0] = N - observed
y = compute_probs(p0, p1)
likelihood[N, p0, p1] = multinomial.pmf(x, N, y)

@AllenDowney
Copy link
Owner

Hi. To make sure I understand the question, are you reporting an error in my code or asking for help debugging?

@zjachc
Copy link
Author

zjachc commented Sep 22, 2022

Hi - I used to code as it was written in the book and received an error; however, I'm not sure if there is a code error or a different issue and wanted to see if you had a suggestion as to why the code won't work as written.

@AllenDowney
Copy link
Owner

Here's the notebook where you can run the code (which works for me):

https://colab.research.google.com/github/AllenDowney/ThinkBayes2/blob/master/notebooks/chap15.ipynb

In the notebook you can print some of the intermediate values, or check the shape of the arrays/DataFrames. That should help with debugging.

@zjachc
Copy link
Author

zjachc commented Sep 22, 2022

Shapes of the arrays match what was expected in the book. As do the heads up until joint3_pmf. At that point, the triplet doesn't show up, only a pair. It seems there is some issue with make_joint, Pmf, and stack, which has worked fine until now.

@AllenDowney
Copy link
Owner

When you run the code in the notebook I linked, does it work?

@zjachc
Copy link
Author

zjachc commented Sep 22, 2022

Yes, it does. I understand the problem is on my end.

Do you have any thoughts as to why this issue emerged in this instance of the three-parameter, but never before?

@AllenDowney
Copy link
Owner

If you display joint3_pmf.index, does it have three columns?

@zjachc
Copy link
Author

zjachc commented Sep 22, 2022

Yes - here's the first row:

MultiIndex([((0.0, 0.0), 32)

@zjachc
Copy link
Author

zjachc commented Sep 22, 2022

MultiIndex([((0.0, 0.0), 32),
((0.0, 0.0), 37),
((0.0, 0.0), 42),
((0.0, 0.0), 47),
((0.0, 0.0), 52),
((0.0, 0.0), 57),
((0.0, 0.0), 62),
((0.0, 0.0), 67),
((0.0, 0.0), 72),
((0.0, 0.0), 77),
...
((1.0, 1.0), 302),
((1.0, 1.0), 307),
((1.0, 1.0), 312),
((1.0, 1.0), 317),
((1.0, 1.0), 322),
((1.0, 1.0), 327),
((1.0, 1.0), 332),
((1.0, 1.0), 337),
((1.0, 1.0), 342),
((1.0, 1.0), 347)],
length=166464)

@AllenDowney
Copy link
Owner

AllenDowney commented Sep 22, 2022 via email

@zjachc
Copy link
Author

zjachc commented Sep 22, 2022

Thank you Allen - I will go through the code again. After running into the issue, I re-wrote the code and still had the problem and then copied it directly, but still no joy.

@AllenDowney
Copy link
Owner

Maybe put it in a Colab notebook. That would eliminate the environmental explanation. In the process, you might find the problem. If not, you could share the notebook with me.

@zjachc
Copy link
Author

zjachc commented Sep 22, 2022

I will do that.

@zjachc
Copy link
Author

zjachc commented Sep 22, 2022

Here's the script:

Three parameter model

Priors

params N, p0, p1, reuse prior_N

prior_N

qs = np.arange(32, 350, step=5)
prior_N = make_uniform(qs, name='N')
prior_N.head(3)

prior_p0, prior_p1

qs = np.linspace(0, 1, num=51)
prior_p0 = make_uniform(qs, name='p0')
prior_p1 = make_uniform(qs, name='p1')

prior_p0.head(3)
prior_p1.head(3)

Assemble into joint prior w/ 3-dim

put first two into DataFrame

joint2 = make_joint(prior_p0, prior_N)
joint2.shape
joint2.head(10)

Stack and put result into a Pmf

joint2_pmf = Pmf(joint2.stack())
joint2_pmf.head(10)

Use make_joint again to add in 3rd param

joint3 = make_joint(prior_p1, joint2_pmf)
joint3.shape

joint3.head(10)

result is a DataFrame w/ values of N & p0 in a multi-index that goes down the rows

and values of p1 in an index that goes across the columns

apply stack again

joint3_pmf = Pmf(joint3.stack())
joint3_pmf.head(10)
joint3_pmf.index

joint3_pmf.shape

Loop that computes the likelihoods

likelihood = joint3_pmf.copy()
observed = data.sum()
x = data.copy()

from scipy.stats import multinomial

for N, p0, p1 in joint3_pmf.index:
x[0] = N - observed
y = compute_probs(p0, p1)
likelihood[N, p0, p1] = multinomial.pmf(x, N, y)

@zjachc
Copy link
Author

zjachc commented Sep 22, 2022

It's an environment issue, works in Jupyter but not Spyder unfortunately.

@zjachc
Copy link
Author

zjachc commented Sep 22, 2022

What's interesting is that this does not work in Jupyter but does work in Spyder.

The following was copied directly - no modification.

Result is that the contour plot won't render. However, Spyder did not have this issue.

observed = k01 + k10 + k11

for N, p in joint_pmf.index:
k00 = N - observed
x = [k00, k01, k10, k11]
q = 1-p
y = [qq, qp, pq, pp]
likelihood[N, p] = multinomial.pmf(x, N, y)


TypeError Traceback (most recent call last)
Input In [24], in <cell line: 3>()
6 q = 1-p
7 y = [qq, qp, pq, pp]
----> 8 likelihood[N, p] = multinomial.pmf(x, N, y)

TypeError: 'numpy.float64' object does not support item assignment

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants