• 締切済み

BASIC言語  分散の出し方

BASIC言語の問題が分からないので、教えてください。 分散がうまく出せません(+o+) 下に問題と自分の回答を張り付けたので、お願いしますm(__)m <演習問題2> 最小二乗法(直線のあてはめ)を用いて回帰式と相関係数を算出する。 作成手順:   1. READ~DATA 文によるデータの配列変数への読み込み   2. Xi の和、Yi の和、Xi の平均値 (Xav) 、Yi の平均値 (Yav) の算出   3. (Xi -Xav)^2 の和、(Yi -Yav)^2 の和、(Xi -Xav)(Yi -Yav) の和の算出   4. y=a*x+bのa, b, r(相関係数) の算出 テストデータと計算結果  データ数:4    X Y    Xの平均 2.5    1 5    Yの平均 8     傾き a=1.6    2 8    Xの分散 1.25   切片 b=4    3 9    Yの分散 3.5   相関係数 r=0.956    4 10    共分散  2 下が自分の回答です。 5 READ n > DIM A(2,N) > 10 FOR i=1 TO 2 > 15 LET S=0 > 20 FOR j=1 TO n > 30 READ A(i,j) > 40 LET s=s+a(i,j) > 50 NEXT j > 60 LET h=s/n > 70 IF i=1 THEN > PRINT h,bunsan > ELSEIF i=2 THEN > PRINT h,bunsan > END if > 75 NEXT i > 80 DATA 4 > 90 DATA 1,2,3,4 > DATA 5,8,9,10 > END

みんなの回答

  • misawajp
  • ベストアンサー率24% (918/3743)
回答No.2

どこで bunsan を計算していますか ? 小文字と大文字を無造作に扱っていますが、そのBASICは 大文字小文字の区別は無いのでしょうか S:初期値はSなのに和の計算時はs は和 hは平均になりますが bunsann はどこでも現れてきません print に突如現れるだけです bunsan を計算する行(二乗和を計算する行、と分散を計算する行を 落としてしまっているのでしょう 頭に血が昇って見えなくなっています、デバッグは、心を落ち着けて、第三者の目で見ることができないと、見れども見えず で 余計なことをして泥沼にはまります この程度の行で躓くようでは、一般的なプログラムは ひとつのルーチンが 数百行から数千行になります、そのデバッグができなければプログラマとは言えません なお 70~75行の直前までは if文処理は 意味がありません 単に print h,bunsan で十分です デバッグのために print i,h,bunsan とすることはあります 質問文からすると 70~75行の直前まではprint h だけで 75行以降に (Xi -Xav)^2 の和、(Yi -Yav)^2 の和、(Xi -Xav)(Yi -Yav) の和の算出を行う i=1 to 2 j=1 to n のループが入り y=a*x+bのa, b, r(相関係数) の算出処理が入ることになります

asdfgfgdsa
質問者

補足

すいません、自分は素人で、if文が不要以外、おしゃってる意味がほとんど分かりません。 もう少し、丁寧にお願いします。

回答No.1

READ N DIM X(N) DIM Y(N) REM 読み込み FOR I = 1 TO N READ X(I) NEXT I FOR I = 1 TO N READ Y(I) NEXT I REM 平均を出すために関数側でわざわざ再び和を求めているので無駄といえば無駄なんだが、 REM 自分の都合で、引数に平均値とか持たせるのは変だよなあと思った。(効率的には、変数で持っておいて再計算を防いだほうがいいはず) REM この程度のプログラムであれば、大して差は出ないと思うので放置。 PRINT "Xの和 ";SUM(X) PRINT "Xの平均 ";AVERAGE(X) PRINT "Yの和 ";SUM(Y) PRINT "Yの平均 ";AVERAGE(Y) PRINT "Xの分散 ";VARIANCE(X) PRINT "Yの分散";VARIANCE(Y) PRINT "共分散";COVARIANCE(X,Y) PRINT "相関係数";CORRELATION(X,Y) LET A = CORRELATION(X,Y) * (STDDEV(Y) / STDDEV(X)) PRINT "傾き"; A PRINT "切片";AVERAGE(Y) - A * AVERAGE(X) DATA 4 DATA 1,2,3,4 DATA 5,8,9,10 END EXTERNAL FUNCTION SUM(A()) LET S = 0 FOR I = 1 TO UBOUND(A) LET S = S + A(I) NEXT I LET SUM = S END FUNCTION EXTERNAL FUNCTION AVERAGE(A()) LET AVERAGE = SUM(A) / UBOUND(A) END FUNCTION EXTERNAL FUNCTION VARIANCE(A()) LET S = 0 FOR I = 1 TO UBOUND(A) LET S = S + (A(I) - AVERAGE(A))^2 NEXT I LET VARIANCE = S / UBOUND(A) END FUNCTION EXTERNAL FUNCTION COVARIANCE(A(),B()) LET S = 0 LET AVEA = AVERAGE(A) LET AVEB = AVERAGE(B) FOR I = 1 TO UBOUND(A) LET S = S + (A(I) - AVEA) * (B(I) - AVEB) NEXT I LET COVARIANCE = S / UBOUND(A) END FUNCTION EXTERNAL FUNCTION STDDEV(A()) LET STDDEV = SQR(VARIANCE(A)) END FUNCTION EXTERNAL FUNCTION CORRELATION(A(),B()) LET CORRELATION = COVARIANCE(A,B) / (STDDEV(A) * STDDEV(B)) END FUNCTION

asdfgfgdsa
質問者

補足

回答ありがとうございます。しかし、 自分が使ってるbasicには、sumもaverageもvarianceもCORRELATIONもありません。 それなしで、できるプログラムをお願いします。

関連するQ&A

  • 相関係数について

    相関係数についてわからないことがあります。 ある二つの物体A,Bが同時に観測されたとします。 この時、A(xi,yi),B(x'i,y'i)というような座標に観測され、i=N回観測された場合、この二物体間の相関係数を求めるにはどのようにすればよいのでしょうか? xとx'の相関とyとy'の相関をそれぞれ別に求めればよいのでしょうか? よろしくお願いします。

  • 確率変数の和の平均値と分散と確率分布

    確率の問題でどうしても解けない物があります。どなたか解き方を教えて貰えませんでしょうか。お願いします。 問題) 確率変数 Xi(i=1,2,…,N) は互いに独立であるが, それぞれ平均値i (E(Xi)=i) のポアソン分布に従う. この確率変数の和 Y= (N Σ i=1) Xi の平均値と分散を, Nの関数として求めよ. さらに,Yの確率分布 P(Y=n) を求めよ.

  • 最小二乗法の分散の求め方

    http://oshiete1.goo.ne.jp/qa3077638.htmlに関連しての質問です。 例えば、y=Xβ+εに関して最小二乗解を求めると b = [ nΣ(xi yi) - (Σxi) (Σyi)]/[ nΣ(xi^2) - (Σxi)^2 ] となります。ここから分散を求めるためにはどうすればよいのでしょうか?教科書を引っ張ってみると求め方の行列の式しか書いていなくいまいちピンときません(確かに計算すれば正しい結果を得られるようですが)。具体的にこの式だけを使って分散を求めるということはできないのですか?

  • スピアマンの順位相関係数の導出過程を教えてください

    スピアマンの順位相関係数ρ=1-{6D/n(n^2-1)} // D=Σ(xi-yi)^2 の導出過程を教えてください。ピアソンの積率相関係数から導くそうですが、私には分かりませんでした。 また、以下の導出過程も教えて頂けると光栄です。 Cov(x,y)=Σxiyi-(ΣxiΣyi/n)

  • 標本分散の合併について

    標本分散の合併についてわからないことがございます。 ------------------------------------------------------ 標本Aの分散:Σ{(Xi - Xmean)^2} / (n-1) 標本Bの分散:Σ{(Yi - Ymean)^2} / (n-1) 合併標本分散(A+B) Σ{(Yi - Ymean)^2} + Σ{(Xi - Xmean)^2} / (n-1) + (n-1) Xmean(Ymean)は標本A(B)の標本平均です。 分散は未知だが等しいことがわかっている。 ------------------------------------------------------ なぜ、AとBの分母同士、分子同士足し合わすのでしょうか? そのようなことをしてもよいのでしょうか? なぜ、 Σ{(Xi - Xmean)^2} / (n-1) + Σ{(Yi - Ymean)^2} / (n-1) では駄目なのでしょうか? 教えていただけましたら幸いです。 以上、宜しくお願いいたします。

  • 標本分散について

    標本分散の分母がnなのかn-1なのかで、よく混乱します。 標本分散を計算する場合は、n-1でわり、 全標本分散を計算する場合は、nでわると理解しているのですが、 こんな問題が出ました。 問、次のデータに関して変動係数を求めよ -3,-4,3,5,-1,7,-2 この問題では、標本分散を計算するときに、 回答では、n-1でわる(分散を計算する際の分母は標本分散だから)と 書いてあります。 しかし、 問、次のデータに関してXとYの標本相関係数を求めよ。 ただし、標本に対する操作にとって必要な自由度調整を行うこと [x,y]=[1,3][0,-1][-2,-3][2,1] この問題の回答では、標本分散を計算する際に、nで割っていました。 変動係数を計算する場合は、n-1でわり、 標本相関係数を計算する場合は、nでわる こう考えてOKなのでしょうか?回答が間違っているのか、 私が勘違いしているのかどうかもわからない状態です。 ご教授お願いします。

  • 重み付けを用いた場合の回帰係数の分散の求め方

    x に関する 0 次式 y = a0 について、正規分布を仮定できる場合、複数の観察値から、真の値 μ の推定値として、最小二乗法で平均値、その平均値に基づいて、分散を求めるときは、観察値と μ との誤差に Weight をかけても結果は変わりません。 次に x に関する一次式 y = a0 + a1x において、複数の観察値 (xi , yi) から、最小二乗法を用いて、a0、a1 の推定値を求めることができます。 伺いたいのは、この場合の a0、a1 は、平均値そのもので、この場合、a0、a1 の分散をどう求めるのか、また推定を行なうとき、誤差 yi - (a0 + a1xi) の二乗に Weight をかけた場合の分散をどう求めるか、の二点です。 これをきちんと解説した成書でも結構ですので、教えてください。

  • C言語による数値計算を教えて下さい

    「2次関数y = ax2 + bx + c の係数を最小2乗法で求めるための正規方程式を導出せよ.その上でキーボードからデータの組(xi, yi)を 5点入力してa,b,cを求めるプログラムを作成せよ(x1~x5,y1~y5)」 という問題なのですが、a,b,cを求める方程式を行列式の形で以下のように出せました。 |Σxi^4 , Σxi^3 , Σxi^2| |a| |Σxi^2*yi| |Σxi^3 , Σxi^2 , Σxi |*|b| = |Σxi*yi | |Σxi^2 , Σxi , 5 | |c| |Σyi | ですがこれをガウス消去法で解こうと思っているのですがどうにもプログラムができません。 どなたかC言語で数値計算できる方、助けてください。 以下のはサイエンス社の「C言語による数値計算入門」をもとに ガウス消去法で解くプログラムを自分なりに作ったのですが 当然エラーだらけです。 プログラムを作れる方、どうか教えてください。 #include <stdio.h> #include <math.h> /* ガウス消去法 */ double *simple_gauss( double a[3][3], double b[3] ); main(void) { double a[3][3]; /* マトリックスの宣言*/ double x[3]; /* 解ベクトルの宣言*/ double y[3]; /* 右辺ベクトルの宣言*/ double xx, yy; /* キーボード入力のための一時変数*/ int i, j; /* 繰り返しのための一時変数*/ for(i = 0; i < 2; i++) { /* 変数の初期化*/ x[i] = y[i] = 0; for(j = 0; j < 3; j++) a[i][j] = 0; } for(i=0; i<5; i++) { printf("\n(x, y) = "); scanf("%lf,%lf", &xx, &yy); a[1][1] += xx * xx * xx * xx; a[1][3] += xx * xx; a[2][2] = a[3][1]=a[1][3]; a[1][2] += xx * xx * xx; a[2][1]=a[1][2]; a[2][3] += xx; a[3][2]=a[2][3]; a[3][3] ++; y[2] += xx * yy; y[1] += xx * xx * yy; y[3] += yy; } y=*simple_gauss(a,y); return 0; } double *simple_gauss( double a[3][3], double y[3] ) { int i, j, k; double alpha, tmp; /* 前進消去 */ for( k = 0; k <= 1; k++) { for( i = k+1; i <= ; i++) { alpha = - a[i][k]/a[k][k]; for( j = k+1; j <= 2; j++) { a[i][j] = a[i][j] + alpha * a[k][j]; } y[i] = y[i] + alpha * y[k]; } } /* 後退代入 */ y[2] = y[2]/a[2][2]; for( k = 1; k >= 0; k--) { tmp = y[k]; for( j = k+1; j <= 2; j++) { tmp = tmp - a[k][j] * y[j]; } y[k] = tmp/a[k][k]; } return y; }

  • 相関係数が1になるのはなぜ

    データ群Aとデータ群Bの相関係数を調べようとしています。 データ群Aはy=x データ群Bはy=2x-5 0<=x<=10 このデータ群の相関係数を 共分散/(√Aの分散×√Bの分散) で計算すると相関係数が1となります。 明らかにデータ群AとBが違っているのに相関係数が1になるのはなぜなのか、また、このデータ群の相関係数の正しい求め方を教えてください。 よろしくお願いします。

  • 【-1≦相関係数r≦+1】の証明について

    【-1≦相関係数r≦+1】の証明を シュヴァルツの不等式を使わずに行なったのですが ☆の部分について、教えて頂きたいと思っております。 よろしくお願いいたします。 xiとyiについて zi=(xi-xbar)/Sx(・・・・・・xbar:xの平均値、Sx:標準偏差) wi=(yi-ybar)/Sy(・・・・・・ybar:yの平均値、Sy:標準偏差) とするとき r=(1/n)Σziwiであるので 【証明】 (1/n)Σ(zi±wi)^2=(1/n)Σ(zi^2±2ziwi+wi^2)(・・・^2=二乗) =(1/n)Σzi^2±(1/n)Σ2ziwi+(1/n)Σwi^2 ☆=1±2r+1☆ =2(1±r) 左辺は二乗なので常にプラスである。 1±r≧0よって -1≦r≦+1 と言うところまで色々あって分かったような気がします。 そこで質問なのですが ☆のところで (1/n)Σzi^2と(1/n)Σwi^2が 1に変化するのはナゼですか。 ziとwiの分散については標準化した値であることから 両方とも「1」であるのは分かるのですが (1/n)Σzi^2と(1/n)Σwi^2が分散の式とどうしてイコールなのか わかりません。 よろしくお願いいたします。