0

最初に少し背景。私は心理学の学生なので、コーディングのバックグラウンドは皆さんと同じではありません :-)

私の問題は次のとおりです。最も重要な観察結果は、グラフは同じままですが、2つの異なるプログラムを使用したカーブフィッティングでは、パラメーターに対して完全に異なる結果が得られることです。縦断データを適合させるために使用したメイン プログラムは kaleidagraph であり、これは一種の「ゴールデン スタンダード」と見なす必要があります。

私はスマートになろうとしていくつかのコードを書きました (少なくとも私にとってはたくさんあります)。そのコードの目標は次のとおりでした: . f' と f'' がゼロの数値と点を取得する

これはすべてうまくいきました (woohoo :-)) が、両方のプログラムが生成する関数パラメーターを比較し始めると、大きな違いがあります。kaleidagraph プログラムは、元の開始値に近いままです。Matlab はさまよい、時には 1000 倍も大きくなります。ただし、グラフはどちらの状況でもほぼ同じままで、どちらもデータによく適合します。ただし、matlab 曲線フィッティングをより「保守的」にし、元の開始値の近くに配置する方法を知っていれば、それは素晴らしいことです。

validFitPersons = true(nbValidPersons,1);
    for i=1:nbValidPersons
        personalData = data{validPersons(i),3};
        personalData = personalData(personalData(:,1)>=minAge,:);
        % Fit a specific model for all valid persons
        try
            opts = optimoptions(@lsqcurvefit, 'Algorithm', 'levenberg-marquardt'); 
            [personalParams,personalRes,personalResidual] = lsqcurvefit(heightModel,initialValues,personalData(:,1),personalData(:,2),[],[],opts);
        catch
            x=1;
        end

上記は、データファイルを特定のモデルに適合させるために書いたコードの一部です。以下は、関数パラメーターで使用するノンパラメトリック モデルの例です。

elseif strcmpi(model,'jpa2')
    % y = a.*(1-1/(1+(b_1(t+e))^c_1+(b_2(t+e))^c_2+(b_3(t+e))^c_3))
    heightModel = @(params,ages) abs(params(1).*(1-1./(1+(params(2).* (ages+params(8) )).^params(5) +(params(3).* (ages+params(8) )).^params(6) +(params(4) .*(ages+params(8) )).^params(7) )));
    modelStrings = {'a','b1','b2','b3','c1','c2','c3','e'};

    % Define initial values
    if strcmpi('male',gender)
        initialValues = [176.76 0.339 0.1199 0.0764 0.42287 2.818 18.52 0.4363];
    else
        initialValues = [161.92 0.4173 0.1354 0.090 0.540 2.87 14.281 0.3701];
    end    

私は、カレイダグラフのカーブ フィッティング プロセスを可能な限り模倣しようとしました。そこで、私が選択した levenberg-marquardt アルゴリズムを使用していることがわかりました。ただし、結果は依然として異なり、これを変更する方法についての手がかりはありません。


いくつかの追加調整:

このコードのアイデアは次のとおりです。

さまざまなフィッティング モデルを比較しようとしています (これらはこの目的のために設計されています)。だから私は、異なるパラメーターと異なる開始値 (コードの 2 番目の部分) を持つ 5 つのモデルを用意し、次に一般的な曲線近似ファイルを作成します。さまざまなモデルがあるため、開始値がどれだけずれるかに制限を加えることができれば興味深いでしょう。

これをどのように行うことができるか誰にも分かりますか?


心理学の学生を助けてくれる人はいますか?

乾杯

4

2 に答える 2

1

これは、非線形モデルを扱う場合によくある問題です。

もし私があなたなら、単純化するためにモデルからいくつかのパラメーターを削除できるかどうかを確認しようとします。

解を最初の点から遠すぎないようにしたい場合は、変数ごとに上限と下限を使用できます。

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)

xは、解が常に lb ≤ x ≤ ub の範囲内になるように、設計変数 in の下限と上限のセットを定義します。

乾杯

于 2013-08-18T17:43:53.920 に答える
0

あなたは次のように述べています:

さまざまなフィッティング モデルを比較しようとしています (これらはこの目的のために設計されています)。だから私は、異なるパラメーターと異なる開始値 (コードの 2 番目の部分) を持つ 5 つのモデルを用意し、次に一般的な曲線近似ファイルを作成します。

おそらく、フィッティング誤差の減少が偶然による可能性が低いかどうかを確認するために、さまざまなモデルとのフィッティングの統計を比較します。その比較に基づいて、データに適切に適合するだけでなく、最も単純なモデルを選択することもできます (これはしばしば倹約の原則と呼ばれます)。

@Davidが述べたように、問題は実際にあなたが示したモデルにあり、相関パラメータが発生し、したがって過適合になります。繰り返しますが、異なるモデルを比較して、パラメーターが少なくても (統計的に言えば) 同じように機能するものがあることがわかった場合は、これを解決する必要があります。

編集

モデルの選択に伴う問題に関する要点を理解するために、(1) シミュレートされたデータを使用した試行適合の結果 (2) グラフ形式のパラメーターの相関行列を次に示します。

ここに画像の説明を入力

ここに画像の説明を入力

相関の絶対値は、1強く相関するパラメーターを示していることに注意してください。これは非常に望ましくありません。また、データの傾向は、データセットの長い部分にわたって実質的に線形であることに注意してください。これは、その範囲で 2 つのパラメーターで十分であることを意味するため、8 つのパラメーターを使用して説明するのはやり過ぎのように思えます。

于 2013-08-19T13:43:58.277 に答える