看板 NCTU-STAT98G 關於我們 聯絡資訊
EX4: 由回歸模型生成一組樣本Y = X*beta + error 這邊只介紹最小平方法(MLE解再normal時與LSE相同) 當error是exponential(1/16)時, 程式執行結果可以發現回歸係數估計為(20,3,-6)左右與真實回歸係數(4,3-6) 剛好差了exponential的mean 16. 這邊可以想像當樣本夠大時Exp(1/16) - 16 可以趨近常態分配, 所以截距項的部分就會估計成4+16=20的結果. #include <stdio.h> #include "matrix.h" #include "rand.h" #include <math.h> int main() { int i,j; int n=2000,k=3; //n:sample size, k: model dimension (intercept included) double *temp; double seed = 100; temp = rand_uniform(2*n,1,2,seed); // 這邊假設解釋變數都是Uniform(1,2)的數值 double **X; X=matrix_zero(n,k); for (i=0;i<n;i++) { X[i][0]=1; for (j=1;j<k;j++) X[i][j] = temp[i*2+(j-1)]; } //這邊把解釋變數排成矩陣X free(temp); matrix_print(n,k,X); double **error1; double **error2; temp = rand_normal(n,0,9,seed); error1 = matrix_zero(n,1); for (i=0;i<n;i++) error1[i][0] = temp[i]; free(temp); //生成normal的error 並排成矩陣 然後把後續沒有用到的temp 記憶體釋放掉 temp = rand_exponential(n,1/16.0,seed); //printf("%lf\n",rand_mean(n,temp)); error2 = matrix_zero(n,1); for (i=0;i<n;i++) error2[i][0] = temp[i]; free(temp); //生成exponential的error 並排成矩陣,同樣做free的動作 double **beta; beta = matrix_zero(k,1); beta[0][0] = 4; beta[1][0] = 3; beta[2][0] = -6; //設定回歸係數 double **Y; Y = matrix_product(n,k,X,k,1,beta); Y = matrix_plus(n,1,Y,error2); matrix_print(n,1,Y); //生成樣本Y = X*beta + error double **hat_beta; hat_beta = matrix_trans(n,k,X); hat_beta = matrix_product(k,n,hat_beta,n,k,X); hat_beta = matrix_inverse(k,k,hat_beta); hat_beta = matrix_product(k,k,hat_beta,k,n,matrix_trans(n,k,X)); hat_beta = matrix_product(k,n,hat_beta,n,1,Y); printf("Hat_beta:\n"); matrix_print(k,1,hat_beta); //這邊做最小平方法 return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.48.157