bd-j / prospector

Python code for Stellar Population Inference from Spectra and SEDs
http://prospect.readthedocs.io
MIT License
159 stars 75 forks source link

Issue in stellar mass estimation #151

Closed kaiwen-kakuiii closed 5 years ago

kaiwen-kakuiii commented 5 years ago

I used Prospector-alpha model (2018) to fit 151 galaxies from COSMOS. The stellar mass results are quite larger compare to COSMOS results, overall by 0.5 index. I also compare my results to MAGPHYS+AGN results and the there are still overall 0.5 index larger. Is there anything I can do to improve mass estimation? Thanks, Kawien

kaiwen-kakuiii commented 5 years ago

image

moustakas commented 5 years ago

I would double-check the IMF and the adopted cosmology.

kaiwen-kakuiii commented 5 years ago

Thank you for your suggestion! 1.For IMF, I used the default value which is 2: Kroupa (2001). 2.For SFH, I also used the default value 0 which is: Defines the type of star formation history, normalized such that one solar mass of stars is formed over the full SFH. 3.For agebins, I used the current z_red to calculate the correct boundary.

Below is my model: image

jrleja commented 5 years ago

The model printout is helpful! Try running a single object again but using dust_type=4. With dust_type=4, the dust_index variable represents a power-law modification to the Calzetti dust attenuation curve -- so a dust_index of 0.0 is a pure Calzetti curve.

When dust_type=0, the dust_index variable represents something else -- it's the index of a pure power law used for the dust attenuation curve. Allowing a power-law index of >=0 means that the dust is preferentially attenuating red light. This will definitely have a big effect on the masses.

bd-j commented 5 years ago

Yes, thanks for the model printout. Note also that the masses used by default in prospector are the total formed stellar mass, which will be larger than the surviving stellar mass (the latter is likely the value reported by other codes) by a factor of ~1.6 or so.

Also, just FYI when using the continuity sfh and FastStepBasis for the sps object, the value of sfh is overridden.

kaiwen-kakuiii commented 5 years ago

These are very helpful! I think you are right, the other codes focus on 'current' stellar mass. In this case, is there a way to transform total formed stellar mass to surviving stellar mass? I saw the parameter called mass_frac which is the output from get_spectrum(). Is this the right one to use?

As for the dust_type, I tried one galaxy. The mass estimation does get lower, but the fitting result seems worse than before. So, I will just keep using the default one.

kaiwen-kakuiii commented 5 years ago

Below is the fitting results using dust_type=4 : image

jrleja commented 5 years ago

Good point re: masses. It's straightforward to fit in stellar mass using parametric models by setting the mass_units parameter to 'mstar'. Nonparametric models are more tricky, the mass needs to be in 'mformed' because the nonparametric components talk to the total mass formed. You'll have to transform total formed mass to stellar mass after the fit. For a given draw from the posterior 'theta':

spec, mags, sm = model.mean_model(theta,sps=sps,obs=obs) stellar_mass = (10**model.params['logmass']) * sm

I'd suggest doing this for at least a few hundred draws for each object to build a full stellar mass posterior.

Re: dust, agreed that fit doesn't look very good. It's hard to tell what is breaking from here -- are there parameters which are pinned against the priors? Did the previous fits you have prefer dust_index > 0? If you prefer to keep a pure power-law model for the dust attenuation curve, I strongly suggest changing your priors such that you rule out dust_index >= 0 (otherwise your model preferentially attenuates red light).

kaiwen-kakuiii commented 5 years ago

Thank you for your suggestions! For the dust_type issue, I don't see any significant change for posterior distributions. Plus, dust_index is negative for both runs. With dust_type =0, it was like -0.8. With dust_type =4, it is -0.19.

kaiwen-kakuiii commented 5 years ago

With dust_type =4 image

With dust_type =0 image

jrleja commented 5 years ago

Thanks for the plots. Generally those corner plots look ok. It's not clear to me why the dust_type=4 fit would fail like that -- dust_index ~ -0.2 with dust_type=4 is a pretty standard assumption (just slightly steeper than Calzetti). My only suggestion is to make sure that your post-processing code is using the same model as the fitting code, perhaps it was still using dust_type=0 when making those plots as there isn't nearly enough attenuation at blue wavelengths in the model.

--Joel

kaiwen-kakuiii commented 5 years ago

Yes, you are right!!! It turns out I forget to restart the kernel, and jupyter notebook still uses the last version. Now it looks much better! Now, I am testing with my sample and will report if it works or not. Thank you so much for your help! Kaiwen

kaiwen-kakuiii commented 5 years ago

I have a background question: How could prospector measure the total formed mass and surviving mass fraction? Thanks, Kaiwen

jrleja commented 5 years ago

The star formation history+metallicity sets the ratio of (stellar mass / total mass formed), from stellar evolution theory. The normalization of the SED constrains the total mass formed (or equivalently the stellar mass, depending on how the SED fitting routine is set up).

kaiwen-kakuiii commented 5 years ago

That makes sense! And I think right now the mass estimation seems much better compared to other work! Thank you for you help! Kaiwen

image