আমি একটি জেনারেটেড সাধারণ বিতরণ ( উইকিপিডিয়া এন্ট্রি ) ব্যবহার করে উদ্ভিদ ছত্রাকের মডেলিং করছি , যার সম্ভাবনা ঘনত্বের কার্যকারিতা রয়েছে:
যেখানে দূরত্ব ভ্রমণ করেছে, হল একটি স্কেল প্যারামিটার, এবং আকৃতির পরামিতি। ভ্রমণের গড় দূরত্বটি এই বিতরণের মানক বিচ্যুতি দ্বারা দেওয়া হয়:
এই সুবিধাজনক কারণ এটি একটি সূচকীয় আকৃতি জন্য করতে পারবেন যখন , একটি গসিয়ান আকৃতি যখন , এবং একটি leptokurtic বন্টন জন্য। এই বিতরণটি নিয়মিতভাবে উদ্ভিদ ছত্রভঙ্গ সাহিত্যে ছড়িয়ে যায়, যদিও এটি সাধারণভাবে খুব বিরল, এবং তাই এটি সম্পর্কে তথ্য খুঁজে পাওয়া শক্ত।
সর্বাধিক আকর্ষণীয় পরামিতিগুলি হল এবং এর অর্থ ছত্রভঙ্গ দূরত্ব।
আমি অনুমান করার চেষ্টা করছি এবং এমসিএমসি ব্যবহার করে, কিন্তু আমি নমুনা প্রস্তাব মান একটি কার্যকর উপায় নিয়ে আসা সংগ্রাম করছি। এখনও অবধি, আমি মেট্রোপলিস-হেস্টিংস ব্যবহার করেছি এবং ইউনিফর্ম বিতরণ থেকে এবং পেয়েছি, এবং আমি প্রায় 200-400 মিটার উত্তরোত্তর ছড়িয়ে পড়ার দূরত্ব পেয়েছি যা জৈবিক ধারণা তৈরি করে। তবে, রূপান্তরটি সত্যই ধীর এবং আমি নিশ্চিত নই যে এটি সম্পূর্ণ পরামিতি স্থানটি অন্বেষণ করছে।
তার চতুর জন্য একটি ভাল প্রস্তাব বন্টন নিয়ে আসা এবং কারণ তারা একে অপরের উপর নির্ভর করে, তাদের নিজস্ব অনেক অর্থ করেও। গড় ছড়িয়ে পড়ার দূরত্বের একটি স্পষ্ট জৈবিক অর্থ রয়েছে, তবে একটি নির্দিষ্ট গড় ছড়িয়ে দেওয়া দূরত্বকে এবং এর অসীম বহু সংমিশ্রণ দ্বারা ব্যাখ্যা করা যেতে পারে । যেমন এবং পোস্টে পরস্পর সম্পর্কিত হয়।
এখন পর্যন্ত আমি মেট্রোপলিস হেস্টিংস ব্যবহার করেছি, তবে আমি এখানে অন্য যে কোনও অ্যালগোরিদম খোলামেলা তা ব্যবহার করে চলেছি।
প্রশ্ন: এমন যেকোনো কেউ প্রস্তাব মান আঁকা আরও কার্যকর উপায় সুপারিশ এবং ?
সম্পাদনা: সিস্টেম সম্পর্কে অতিরিক্ত তথ্য: আমি একটি উপত্যকার পাশাপাশি গাছপালার একটি জনসংখ্যা অধ্যয়ন করছি। দাতা উদ্ভিদ এবং যে উদ্ভিদগুলি তারা পরাগায়িত করে তার মধ্যে পরাগের মধ্য দিয়ে ভ্রমণ করা দূরত্বগুলির বন্টন নির্ধারণের লক্ষ্য। আমার কাছে থাকা ডেটাগুলি হ'ল:
- প্রতিটি সম্ভাব্য পরাগ দাতার জন্য অবস্থান এবং ডিএনএ
- Ma০ টি মাতৃগাছের (যেমন পরাগ গ্রহণকারী) নমুনা থেকে সংগ্রহ করা বীজগুলি জন্মানো এবং জিনোটাইপ করা হয়েছে।
- প্রতিটি মাতৃ গাছের জন্য অবস্থান এবং ডিএনএ।
আমি দাতা উদ্ভিদের পরিচয় জানি না, তবে জেনেটিক ডেটা থেকে এটি নির্ধারণ করা যেতে পারে যে প্রতিটি দানাদারের দাতা কোন দাতা। আসুন এই তথ্যগুলি সম্ভাব্য জি এর ম্যাট্রিক্সে প্রতিটি বংশের জন্য একটি সারি এবং প্রতিটি পরীক্ষার্থী দাতার জন্য একটি কলামে অন্তর্ভুক্ত রয়েছে, যা কেবলমাত্র জেনেটিক তথ্যের ভিত্তিতে প্রতিটি প্রার্থীর প্রতিটি সন্তানের জনক হওয়ার সম্ভাবনা দেয় gives জি গণনা করতে প্রায় 3 সেকেন্ড সময় নেয় এবং প্রতিটি পুনরাবৃত্তিতে পুনরায় গণনা করা দরকার, যা জিনিসগুলি যথেষ্ট গতিতে ধীর করে দেয়।
যেহেতু আমরা সাধারণত আশা করি নিকটস্থ প্রার্থী দাতাগুলি পিতৃপুরুষ হওয়ার সম্ভাবনা বেশি, তাই আপনি যদি যৌথভাবে পিতৃত্ব অনুমান করেন এবং ছত্রভঙ্গ হন তবে পিতৃত্বের অনুমান আরও সঠিক। ম্যাট্রিক্স ডিতে জি এর সমান মাত্রা রয়েছে এবং এতে মা ও প্রার্থী এবং পরামিতিগুলির কিছু ভেক্টরের মধ্যে দূরত্বের একটি কার্যকারিতা ভিত্তিক পিতৃত্বের সম্ভাবনা রয়েছে। ডি এবং জি-তে উপাদানগুলি গুণমান পিতৃত্বের জেনেটিক এবং স্থানিক ডেটার যৌথ সম্ভাবনা দেয়। গুণিত মানগুলির পণ্য বিচ্ছুরণ মডেলের সম্ভাবনা দেয়।
উপরে বর্ণিত হিসাবে আমি ছড়িয়ে ছিটিয়ে মডেল করতে জিএনডি ব্যবহার করে আসছি। আসলে আমি খুব সহজেই জিএনডি এবং অভিন্ন বিতরণের মিশ্রণ ব্যবহার করেছি যাতে একাকী সুযোগের কারণে পিতৃত্বের উচ্চতর সম্ভাবনা থাকার সম্ভাবনা খুব বেশি দূরে প্রার্থীদের (জেনেটিক্স অগোছালো) যা উপেক্ষা করা হলে জিএনডি এর আপাত লেজকে ফুলে উঠবে। সুতরাং ছড়িয়ে যাওয়ার দূরত্ব এর সম্ভাবনা হ'ল:
যেখানে জিএনডি থেকে বিচ্ছুরণের দূরত্বের সম্ভাবনা, এন প্রার্থীদের সংখ্যা এবং ( ) জিএনডি ছড়িয়ে দিতে কতটা অবদান রাখে তা নির্ধারণ করে।
সুতরাং দুটি অতিরিক্ত বিবেচনা রয়েছে যা গণনার ভার বাড়িয়ে তোলে:
- বিচ্ছুরিত দূরত্বটি জানা যায় না তবে প্রতিটি পুনরাবৃত্তিতে অনুমান করা আবশ্যক এবং এটি করার জন্য জি তৈরি করা ব্যয়বহুল।
- ওভার সংহত করার জন্য একটি তৃতীয় প্যারামিটার, , রয়েছে।
এই কারণগুলির জন্য গ্রিড ইন্টারপোলেশন সম্পাদন করা আমার কাছে এতো সামান্য জটিল বলে মনে হয়েছিল তবে আমি অন্যথায় দৃ convinced় বিশ্বাসী হয়ে সন্তুষ্ট।
উদাহরণ
আমি যে পাইথন কোডটি ব্যবহার করেছি তার একটি সরল উদাহরণ এখানে। আমি জেনেটিক ডেটা থেকে পিতৃত্বের অনুমানকে সরল করে দিয়েছি, যেহেতু এতে প্রচুর অতিরিক্ত কোড জড়িত হবে এবং 0 এবং 1 এর মধ্যে মানগুলির ম্যাট্রিক্সের সাথে এটি প্রতিস্থাপন করা হয়েছে।
প্রথমে জিএনডি গণনা করার জন্য ফাংশনগুলি সংজ্ঞায়িত করুন:
import numpy as np
from scipy.special import gamma
def generalised_normal_PDF(x, a, b, gamma_b=None):
"""
Calculate the PDF of the generalised normal distribution.
Parameters
----------
x: vector
Vector of deviates from the mean.
a: float
Scale parameter.
b: float
Shape parameter
gamma_b: float, optional
To speed up calculations, values for Euler's gamma for 1/b
can be calculated ahead of time and included as a vector.
"""
xv = np.copy(x)
if gamma_b:
return (b/(2 * a * gamma_b )) * np.exp(-(xv/a)**b)
else:
return (b/(2 * a * gamma(1.0/b) )) * np.exp(-(xv/a)**b)
def dispersal_GND(x, a, b, c):
"""
Calculate a probability that each candidate is a sire
assuming assuming he is either drawn at random form the
population, or from a generalised normal function of his
distance from each mother. The relative contribution of the
two distributions is controlled by mixture parameter c.
Parameters
----------
x: vector
Vector of deviates from the mean.
a: float
Scale parameter.
b: float
Shape parameter
c: float between 0 and 1.
The proportion of probability mass assigned to the
generalised normal function.
"""
prob_GND = generalised_normal_PDF(x, a, b)
prob_GND = prob_GND / prob_GND.sum(axis=1)[:, np.newaxis]
prob_drawn = (prob_GND * c) + ((1-c) / x.shape[1])
prob_drawn = np.log(prob_drawn)
return prob_drawn
এরপরে 2000 প্রার্থী এবং 800 বংশের অনুকরণ করুন। বংশের মা এবং প্রার্থী পিতাদের এবং একটি ডামি জি ম্যাট্রিক্সের মধ্যে দূরত্বের একটি তালিকাও অনুকরণ করুন ।
n_candidates = 2000 # Number of candidates in the population
n_offspring = 800 # Number of offspring sampled.
# Create (log) matrix G.
# These are just random values between 0 and 1 as an example, but must be inferred in reality.
g_matrix = np.random.uniform(0,1, size=n_candidates*n_offspring)
g_matrix = g_matrix.reshape([n_offspring, n_candidates])
g_matrix = np.log(g_matrix)
# simulate distances to ecah candidate father
distances = np.random.uniform(0,1000, 2000)[np.newaxis]
প্রাথমিক প্যারামিটার মান সেট করুন:
# number of iterations to run
niter= 100
# set intitial values for a, b, and c.
a_current = np.random.uniform(0.001,500, 1)
b_current = np.random.uniform(0.01, 3, 1)
c_current = np.random.uniform(0.001, 1, 1)
# set initial likelihood to a very small number
lik_current = -10e12
পরিবর্তে a, b এবং c আপডেট করুন এবং মেট্রোপলিস অনুপাতের গণনা করুন।
# number of iterations to run
niter= 100
# set intitial values for a, b, and c.
# When values are very small, this can cause the Gamma function to break, so the limit is set to >0.
a_current = np.random.uniform(0.001,500, 1)
b_current = np.random.uniform(0.01, 3, 1)
c_current = np.random.uniform(0.001, 1, 1)
# set initial likelihood to a very small number
lik_current = -10e12
# empty array to store parameters
store_params = np.zeros([niter, 3])
for i in range(niter):
a_proposed = np.random.uniform(0.001,500, 1)
b_proposed = np.random.uniform(0.01,3, 1)
c_proposed = np.random.uniform(0.001,1, 1)
# Update likelihood with new value for a
prob_dispersal = dispersal_GND(distances, a=a_proposed, b=b_current, c=c_current)
lik_proposed = (g_matrix + prob_dispersal).sum() # lg likelihood of the proposed value
# Metropolis acceptance ration for a
accept = bool(np.random.binomial(1, np.min([1, np.exp(lik_proposed - lik_current)])))
if accept:
a_current = a_proposed
lik_current = lik_proposed
store_params[i,0] = a_current
# Update likelihood with new value for b
prob_dispersal = dispersal_GND(distances, a=a_current, b=b_proposed, c=c_current)
lik_proposed = (g_matrix + prob_dispersal).sum() # log likelihood of the proposed value
# Metropolis acceptance ratio for b
accept = bool(np.random.binomial(1, np.min([1, np.exp(lik_proposed - lik_current)])))
if accept:
b_current = b_proposed
lik_current = lik_proposed
store_params[i,1] = b_current
# Update likelihood with new value for c
prob_dispersal = dispersal_GND(distances, a=a_current, b=b_current, c=c_proposed)
lik_proposed = (g_matrix + prob_dispersal).sum() # lg likelihood of the proposed value
# Metropolis acceptance ratio for c
accept = bool(np.random.binomial(1, np.min([1, np.exp(lik_proposed - lik_current)])))
if accept:
c_current = c_proposed
lik_current = lik_proposed
store_params[i,2] = c_current