作者ru486good (金仔)
看板NCCU09_STGRA
標題[統模] 第四題
時間Wed May 5 00:43:40 2010
老師說資料只要用0~99歲就好了唷!!
題目沒有說
但是這題是要用SVD和PCA去配適Lee-Carter模型
alpha(x)用每個年齡的平均死亡率即可
原始資料 扣掉 alpha(x)之後即可進行拆解
由於維度的問題 用SVD的時候要先轉置
PCA的話
對原始資料 扣掉 alpha(x)之後的correlation matirx拆解
Loading是beta(x)
Score是k(t)
#########程式碼 有需要可以參考看看#####
###SVD 1970~2000男性
#ux是(年齡x年份)的死亡率矩陣
y=t(ux)
logy=log(y) #log死亡率
ax=apply(logy,2,mean) #alpha x
ax1=matrix(ax,ncol=ncol(y),nrow=nrow(y),byrow=T) #各年齡中央死亡率matrix
y1=logy-ax1 #ln(mxt) - ax
a1=svd(y1) #SVD分解
kt = a1$u[,1]*a1$d[1] #kt:time component,只取第一個singular
value
bx = a1$v[,1] #beta x: age component
b2 = kt%*%t(bx) #ln(mxt) - ax
mx = b2+ax1 #修勻的死亡率(log scale):ln(mxt)
#預測2001~2008
x = c(1970:2000)
fit = lm(kt~x)
diff.svd = NULL
real = data[,32:39]
for(i in 1:8){
ktt = predict(fit,data.frame(x=2000+i))
u = ax+bx*ktt
diff.svd = cbind(diff.svd,(exp(u)-real[,i])/real[,i])
}
###PCA
R = cor(y1) #t(A) A = t(A) bx kt = P V t(P)
P = eigen(R)$vectors
V = eigen(R)$values #ln(mxt) - ax = e1*(lamda1)
PC = P[,1] #第一主成分
Bx = PC*sqrt(V[1]) #第一主成分*sqrt(第一特徵值)
Kt = as.vector(PC%*%t(y1)/sqrt(V[1])) #第一主成分得點/sqrt(第一特徵值)
Mx = Kt%*%t(Bx)+ax1
##預測2001~2008
Fit = lm(Kt~x)
diff.pca = NULL
for(i in 1:8){
ktt = predict(Fit,data.frame(x=2000+i))
u = ax+Bx*ktt
diff.pca = cbind(diff.pca,(exp(u)-real[,i])/real[,i])
}
##
ts.plot(apply(diff.svd,1,mean)/ apply(diff.pca,1,mean),
main='虛線以上PCA較佳,以下SVD較佳',xlab='年齡',ylab=' SVD 的 Bias / PCA 的
Bias')
abline(h = 1,lty=2)
sum(diff.svd^2) ; sum(diff.pca^2)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.119.202.222
1F:推 hidog88s:PCA 可以改用 covariance matrix 試試。 05/05 01:44