2017-03-13 12 views
1

与えられたcsvファイルの各行の変数の式を解いてみたいと思います。 この方程式は、オイラー・ロトカ方程式として知ることができます。rのuniroot関数を使ってデータフレームのデータを使ってEuler-Lotka方程式を解く

# seed is needed for reproducible results (otherwise random numbers will  never be the same!) 
set.seed(42) 

# using the Euler-Lotka equation 
# l = survival rate until age x 
# m = amount of offspring at age x 
# x = age of reproduction 
# r = population growth rate 
y <- function(r, l1, l2, l3, m1, m2, m3, x1, x2, x3, z){((l1*m1*exp(-r*x1)) + (l2*m2*exp(-r*x2)) + (l3*m3*exp(-r*x3))) - z} 

# iterate through each line calculating r and writing it into the respective field 
for (i in 1:length(neos_data$jar_no)){ 

# declare the variables from table (this does not work!!) 
l1 <- neos_data$surv_rate_clutch1[i] 
l2 <- neos_data$surv_rate_clutch2[i] 
l3 <- neos_data$surv_rate_clutch3[i] 
m1 <- neos_data$indiv_sum_1_clutch[i] 
m2 <- neos_data$indiv_sum_2_clutch[i] 
m3 <- neos_data$indiv_sum_3_clutch[i] 
x1 <- neos_data$age_clutch_1[i] 
x2 <- neos_data$age_clutch_2[i] 
x3 <- neos_data$age_clutch_3[i] 

# this works, while these numbers are the same as in the data frame 
l1 <- 0.9333333 
l2 <- 0.9333333 
l3 <- 0.9333333 
m1 <- 3.4 
m2 <- 0 
m3 <- 0 
x1 <- 9 
x2 <- 13 
x3 <- 16 

    ## uniroot finds a 0 value, so offset function, thats why -z in the upper formula 
    r <- uniroot(y, l1=l1, l2=l2, l3=l3, m1=m1, m2=m2, m3=m3, x1=x1, x2=x2, x3=x3, z = 1, interval = c(-1, 1))[1] #writing only the result of r into variable 

    # write r into table 
    neos_data$pop_gr[i] <- r 

} 

私はすでにコメントのように値を手動で入力して正常に動作しますuniroot:私はこれまで持っているものである 。しかし、私のデータフレームから値を読み込もうとすると、 "f()の値に同じ符号があります"というエラーが返されます。

私はエラー自体の意味を理解していますが、データフレームと同じ値ではなく手動で挿入する値とはなぜ同じ働きをしますか?はい、データ型をチェックしました。私がこれまで見てきたことは私の場合には有用ではなかったよう

は、任意の助けを喜んでいるだろう:)

EDIT: clearifyするには:私はのためのrの値を取得したいのですが式は0になります。これは、変数の値を数値として挿入する限り、与えられたコードでは非常にうまく動作します。しかし、データフレームから値を渡そうとすると、同じ値が渡されても失敗します。

+0

'uniroot'関数は1次元でのみ動作します。あなたのケースでは、あなたの 'y'関数は' f(y)= y(r、...) 'として扱われます。 'uniroot'関数は、' f'が連続的であることを仮定して動作します。したがって、 'f'が一方の端で正で他方の端で負の区間でゼロが見つかることができます。インターバル終点での 'f 'の反対のサインは前提条件です。例えば、 'uniroot(function(x)x^2、interval = c(-1,1))'は解{0^2 = 0}を見つけません。代わりに 'optimize'を探しているかもしれません。 –

+0

あなたのヒントをありがとう。私は最適化機能や最適化機能については赤字になっていますが、まだこれらの機能の出力を理解していません。 多分私は自分の欲望を理解していないか、私はその点を理解できません。私は、rのどの値が方程式が0になるかを知りたいと思います。実際には、uniroot(既知の固定値と結果でテストした限り)でうまく動作します。固定値を使用するのではなく、データフレームの値を使用した後では機能しません。 – Maki

答えて

0

私は問題を見つけたと思います。 合計の各部分が0になる行がいくつかあります。ループが0に達する各ステップでエラーが発生し、すべての要素が機能しません。 式であるので、これは自然と思われる:

1 = SUM(l(x) * m(x) * exp(-r*x)) 

全てL(x)とM(x)は方程式はもちろん、1になることができない0である場合。

スクリプトが全く機能しないため、この問題は認識しませんでした。さて、コードを試し書きして削除した後、どうにかして結果のrを0の行までデータフレームに書き込みます。それは私にこの結論をもたらしました。 何時間も試してみると、これはいつも起こりますか? :D

しかし、この問題を解決するために、ループを実行するために、それぞれのフィールドに0.0001を挿入しました。私の場合、r値をmastersheedデータにコピーしたいだけです。すべて0の3行しかないので(NAはunirootで処理できなかったため)、手作業でこれらの値を削除します(NAsはそれ以上の計算を妨げません)。

とにかくお世話になりました。それは正しい方向に私を落とした:)

関連する問題