'pvalはラジオボタンに対応します。 'ここから□□□まではユーザインタフェースの管理する 'コードです。 scalar pval = 2 string stpwPrompt = "Set pvalue" string menu = """0.05"" ""0.10"" 0.20" string eqname string namePrompt = "Enter name of Equation" scalar result = @uidialog("Caption", "Stepwise Probit", "Edit", eqname, namePrompt, 64, "Radio", pval, stpwPrompt, menu) if pval="1" then !cp=0.05 else if pval="2" then !cp=0.1 else !cp=0.2 endif endif %eqname=eqname '---□□□----------------------------------------------- '元の推定式を***orgという名前でコピーしておきます %newname=%eqname+"org" copy %eqname %newname '---------------------------------------------- 'このプログラムは説明変数が2個以上で機能します。 '---------------------------------------------- 'p値は直接データメンバとして用意されていませんので、 'z値と累積分布関数から計算し、p値をシリーズcheckpに 'コピーします。ただし、定数項のp値は操作の対象外とします。 'ループを開始するため、仮に!maxをゼロとします。 'ループ開始後に!maxには一番大きなp値が入ります。 !max=1 while !max > !cp !num=0 !noc={%eqname}.@ncoef '---------------------------------------------- '説明変数の数(定数項を含まない)が2個しかない場合は 'ステップワイズは実行しません(その2で追加)。 if !noc < 3 then @uiprompt("Error: Select larger p-value") stop else endif '---------------------------------------------- series checkp checkp=na for !i=2 to !noc 'z値の符号によって計算式が異なるので、z値は絶対値を 'とります。 !z=@abs({%eqname}.@tstats(!i)) !p=(1-@cnorm(!z))*2 checkp(!i-1)=!p next 'これで推定式からp値を取り出して、計算用のcheckpという 'シリーズの準備ができました。 '次に一番大きなp値を持つ変数を求めます。 !max=checkp(1) for !j=1 to !noc-1 if checkp(!j+1) > !max then !max=checkp(!j+1) !num=!j+2 else endif next '!maxが!cp(pの境界値)よりも小さい場合、以下のループは実行 'しません。 '主にここから下のコードを「その2」で追加しました。 '------------------------------------------------- if !max < !cp then else '変数名(series object)を取得する %indv={%eqname}.@varlist %dep=@wmid(%indv,1,1) '定数項(2番目)から外す変数の1つ手前までの文字列を取得 %s1=@wmid(%indv,2,!num-1) '説明変数の個数 !ncoef={%eqname}.@ncoef '外す変数の後ろから最後までの文字列を取得 %s2=@wmid(%indv,!num+2,!ncoef-!num) %ns=%dep+" "+%s1+" "+%s2 %mtd={%eqname}.@method '外した後の推定式はeq01を上書きします。 equation {%eqname}.{%mtd} {%ns} endif wend show {%eqname} 'show eqname 'show pval