https://github.com/hzlab/2021Qian_ADNI_FDG
Tip revision: f59dfbc9520d6bf49bfe5345b3d6d72ddddc4187 authored by zjc062 on 12 September 2022, 05:00:09 UTC
Merge pull request #1 from hzlab/add-license-1
Merge pull request #1 from hzlab/add-license-1
Tip revision: f59dfbc
vc.R
################################################################
# myInput
# This function creates example used
#
# n: number of observations
# p: number of predictors
# T: number of time points sampled
# sigma: error standard deviation
# do.intercept: whether intercept should be included
# rho: correlation of design matrix
# zeta: similarity between coefficient fcns
################################################################
# Coefficient functions used; these are the examples in Daye et al. 2012 p11-12, not needed for any actual data analysis
# we need the sparse function from line 125 onwards only
bfcn_pc <- function(tVec) { return((-1*(tVec<.5) + (tVec>=.5))) }
bfcn_pn1 <- function(tVec) { return(2*tVec-1) }
bfcn_pn2 <- function(tVec) { return((1-2*tVec)^3) }
bfcn_lf1 <- function(tVec) { return(sin(2*pi*tVec)) }
bfcn_lf2 <- function(tVec) { return(cos(2*pi*tVec)) }
bfcn_hf1 <- function(tVec) { return(sin(8*pi*tVec)) }
bfcn_hf2 <- function(tVec) { return(cos(8*pi*tVec)) }
bfcn_cp <- function(tVec) { return( ((1-2*tVec)^3-cos(4*pi*tVec)) ) }
myInput <- function(n, p, T, sigma, do.intercept, rho=0.5, zeta=NULL){
tVec = seq(0,1,len=T)
ygt = array(0,dim=c(n,T))
X = array(0, dim=c(n,p,T));
beta = array(0, dim=c(p,T));
beta0 = rep(0,T)
trueNNZ = rep(FALSE,p+do.intercept);
# Example setup
{
if (do.intercept) {
beta0 = 2*bfcn_cp(tVec)
}
beta[1,] = (1-zeta)*bfcn_lf2(tVec) + zeta*bfcn_pn1(tVec)
beta[2,] = (1-zeta)*bfcn_lf2(tVec) + zeta*bfcn_hf1(tVec)
beta[3,] = (1-zeta)*bfcn_lf2(tVec) + zeta*bfcn_lf1(tVec)
beta[4,] = (1-zeta)*bfcn_lf2(tVec) + zeta*bfcn_hf2(tVec)
beta[5,] = (1-zeta)*bfcn_pn2(tVec) + zeta*bfcn_pn1(tVec)
beta[6,] = (1-zeta)*bfcn_pn2(tVec) + zeta*bfcn_hf1(tVec)
beta[7,] = (1-zeta)*bfcn_pn2(tVec) + zeta*bfcn_lf1(tVec)
beta[8,] = (1-zeta)*bfcn_pn2(tVec) + zeta*bfcn_hf2(tVec)
beta[9,] = 3*bfcn_hf1(tVec)
beta[10,] = 1.5*bfcn_pn2(tVec)
beta[11,] = 2*bfcn_lf1(tVec)
beta[12,] = 2*bfcn_pc(tVec)
Grp1 = 1:4
Grp2 = 5:8
X = array(0, dim=c(n,p,T))
for (t in 1:T) {
Mu = rep(0,p)
Sigma = diag(p);
for (i in 1:p) {
for (j in 1:p) {
if (i!=j) {
Sigma[i,j] = 0^abs(i-j);
}
}
}
for (i in Grp1) {
for (j in Grp1) {
if (i!=j) {Sigma[i,j]=rho}
}
}
for (i in Grp2) {
for (j in Grp2) {
if (i!=j) {Sigma[i,j]=rho}
}
}
X[,,t] = mvrnorm(n, Mu, Sigma);
}
# Sets weights and basis inner products
W = matrix(0,p,p)
for (i in Grp1) {
for (j in Grp1) {
if (i!=j) {W[i,j]=1}
}
}
for (i in Grp2) {
for (j in Grp2) {
if (i!=j) {W[i,j]=1}
}
}
}
# Creates response
for (t in 1:T) {
ygt[,t] = ygt[,t] + beta0[t];
if (any(beta0!=0)) {trueNNZ[1] = TRUE}
for (j in 1:p) {
ygt[,t] = ygt[,t] + beta[j,t]*X[,j,t] + sigma*rnorm(n)
if (any(beta[j,]!=0)) {
trueNNZ[j+do.intercept] = TRUE;
}
}
}
if (!do.intercept) {
ygt = ygt - repmat(colMeans(ygt),nrow(ygt),1);
}
ret.obj = list("tVec"=tVec, "X" = X, "ygt" = ygt, "W"=W)
return(ret.obj)
}
################################################################
# vc_sparse
# Performs sparse penalty varying-coefficient model
#
# simLen: number of repetitions for the simulation study
# n: number of observations(subjects)
# T: number of time points sampled
# p: number of predictors
# sigma: error standard deviation
# do.alpha2: whether lambda_2 (structural penalty) should be used
# do.alpha3: whether c (rescaling parameter) should be used
# rho: correlation of design matrix (used for simulation)
# zeta: similarity between coefficient fcns (used for simulation)
################################################################
vc_sparse <- function(simLen,n, T, p,
X,ygt,W,tVec,
do.alpha2=FALSE, do.alpha3=TRUE, rootDir =''
)
{
# Loading packages
require(MASS)
require(boot)
require(splines)
require(statmod)
source('/mnt/isilon/CSC4/HelenZhouLab/HZLHD2/Data7/Members/Qianxing/ADNI_NgKP/svc/vc/misc.R')
source('/mnt/isilon/CSC4/HelenZhouLab/HZLHD2/Data7/Members/Qianxing/ADNI_NgKP/svc/vc/bsplines.R')
source('/mnt/isilon/CSC4/HelenZhouLab/HZLHD2/Data7/Members/Qianxing/ADNI_NgKP/svc/vc/vc.R') # calls vccd?
#system("rm -f *.so"); system("rm -f *.o"); system("rm -f *.mod");
#system("R CMD SHLIB vccd_module.f90"); system("R CMD SHLIB vccd.f90 vccd_module.f90 minpack/*.f")
dyn.load('/mnt/isilon/CSC4/HelenZhouLab/HZLHD2/Data7/Members/Qianxing/ADNI_NgKP/svc/vc/vccd.so')
# Default parameters
Tol = 1e-6
cvFold = 5
L = 4
do.intercept = FALSE
do.standardize = FALSE
degree=3
no.interior.knots = L-degree-1
nVarsLimit=50
maxIters=100
maxInnerIters=5
#cat("====================================================\n")
# Tuning parameters used
alpha_1 = 2^(seq(log2(1+Tol), log2(0+Tol), len=25))-Tol
if (do.alpha2) {
alpha_2 = 2^(seq(log2(1.5+Tol), log2(0+Tol), len=25))-Tol #seq(1,0,len=100)
} else {
alpha_2 = c(0)
}
if (do.alpha3) {
alpha_3 = seq(0,1,len=25)
} else {
alpha_3 = c(0)
}
VC_gamma = array(0,c(simLen,L*(p+do.intercept)))
VC_I = rep(0,simLen)
VC_C = rep(0,simLen)
VC_sens = rep(0,simLen)
VC_spec = rep(0,simLen)
VC_G = rep(0,simLen)
VC_NNZ = array(0,c(simLen,p+do.intercept))
VC_bias = array(0,c(simLen,p+do.intercept))
VC_var = array(0,c(simLen,p+do.intercept))
for (simI in 1:simLen) {
#clock_tmp2 = tic()
# Declares real data used
#ex.obj = myInput(n, p, T, sigma, do.intercept, rho, zeta)
#tVec = ex.obj$tVec
#sigma = ex.obj$sigma
#trueNNZ = ex.obj$trueNNZ
#Sigma = ex.obj$Sigma
#X = ex.obj$X
#ygt = ex.obj$ygt
#ex.test.obj = myInput(500, p, T, sigma, do.intercept, rho, zeta)
# Used in computing bias with T=500 time points.
#ex.emp.obj = myInput(1, p, 500, sigma, do.intercept, rho, zeta)
#betaEmp = ex.emp.obj$trueBeta
#tVecEmp = ex.emp.obj$tVec
# Performs cross-validation
cv.obj = cv.vc(tVec, X, ygt, W, K = cvFold,
alpha_1=alpha_1, alpha_2=alpha_2, alpha_3=alpha_3,
degree=degree, no.interior.knots=no.interior.knots,
do.intercept=do.intercept, do.standardize=do.standardize,
nVarsLimit=nVarsLimit, maxIters=maxIters, maxInnerIters=maxInnerIters)
if (length(alpha_2)==1) {
if (length(alpha_3)==1) {
cv.obj$mse_mean = array(cv.obj$mse_mean,dim(cv.obj$mse_mean)[c(1)])
} else {
cv.obj$mse_mean = array(cv.obj$mse_mean,dim(cv.obj$mse_mean)[c(1,3)])
}
} else {
if (length(alpha_1)==1) {
cv.obj$mse_mean = array(cv.obj$mse_mean,dim(cv.obj$mse_mean)[c(1,2)])
}
}
gamma = cv.obj$gamma
VC_gamma[simI,] = gamma;
# obtain beta results
beta_res = get_beta(tVec, gamma, p+do.intercept,
degree=degree, no.interior.knots=no.interior.knots)
# Saves performance statistics
#betaTmp = get_beta(tVecEmp, gamma, p+do.intercept,
#degree=degree, no.interior.knots=no.interior.knots)
#VC_bias[simI,] = rowMeans((betaTmp - betaEmp)^2)
#VC_var[simI,] = rowMeans((betaTmp - rowMeans(betaTmp))^2)
#tmpGamma = gamma; dim(tmpGamma) = c(L,p+do.intercept); tmpGamma = t(tmpGamma);
#tmpNNZ = rowSums(tmpGamma!=0)>0
#VC_NNZ[simI,] = tmpNNZ
#VC_C[simI] = sum(tmpNNZ[trueNNZ==TRUE])
#VC_I[simI] = sum(tmpNNZ[trueNNZ!=TRUE])
#VC_sens[simI] = VC_C[simI]/sum(trueNNZ)
#VC_spec[simI] = (p+do.intercept-sum(trueNNZ) - VC_I[simI])/
# (p+do.intercept-sum(trueNNZ))
#VC_G[simI] = sqrt(VC_sens[simI]*VC_spec[simI])
# Display simI count
#cat(simI,' ')
if (simI==simLen){ cat('\n') }
}
## Outputs performance results
# Sensitivity (bootsd)
#cat( sprintf("Sens \t\t%.3f (%.3f)\n", median(VC_sens), bootsd(VC_sens)) )
# Specificity (bootsd)
#cat( sprintf("Spec \t\t%.3f (%.3f)\n", median(VC_spec), bootsd(VC_spec)) )
# G-measure (bootsd)
#cat( sprintf("G-measure \t%.3f (%.3f)\n", median(VC_G), bootsd(VC_G)) )
# True positives (bootsd)
#cat( sprintf("TP \t\t%.1f (%.1f)\n", median(VC_C), bootsd(VC_C)) )
# False positives (bootsd)
#cat( sprintf("FP \t\t%.1f (%.1f)\n", median(VC_I), bootsd(VC_I)) )
cat("\n")
#VC_bias_sd = rep(0,sum(trueNNZ==TRUE))
#VC_var_sd = rep(0,sum(trueNNZ==TRUE))
#idx = 1
#for (j in which(trueNNZ==TRUE)) {
# VC_bias_sd[idx] = bootsd(VC_bias[,j])
# VC_var_sd[idx] = bootsd(VC_var[,j])
# idx = idx + 1
#}
# Percent selected of true variables
#cat("\t\tbeta0 \tbeta1 \tbeta2 \tbeta3 \tbeta4 \tbeta5 \tbeta6 \tbeta7 \tbeta8 \tbeta9 \tbeta10 \tbeta11 \tbeta12 \n")
#cat("% Selected \t", sprintf("%.3f\t", colMeans(VC_NNZ[,trueNNZ==TRUE])), "\n", sep="")
# Bias squared of true variables (bootsd)
#cat("Bias^2 \t\t", sprintf("%.3f\t", colMeans(VC_bias[,trueNNZ==TRUE])), "\n", sep="")
#cat("(bootsd)\t", sprintf("%.3f\t", VC_bias_sd), "\n", sep="")
# Variance of true variables (bootsd)
#cat("Var \t\t", sprintf("%.3f\t", colMeans(VC_var[,trueNNZ==TRUE])), "\n", sep="")
#cat("(bootsd) \t", sprintf("%.3f\t", VC_var_sd), "\n", sep="")
ret.obj=list("beta"=beta_res)
return(ret.obj)
}