从R中的一次性输出得到p值

时间:2016-10-02 19:26:46

标签: r bioinformatics cross-validation

我有96个观察(患者)和1098个变量(基因)的数据框。响应是二进制(Y和N),预测变量是数字。我正在尝试执行留一交叉验证,但我的兴趣不是标准误差,而是来自LOOCV创建的每个95逻辑回归模型的每个变量的p值。这些是我迄今为止的尝试:

#Data frame 96 observations 1098 variables
DF2

fit <- list()

for (i in 1:96){
  df <- DF2[-i,]
 fit[[i]] <- glm (response ~., data= df, family= "binomial")
 }
 model_pvalues <- data.frame(model = character(), p_value = numeric())

此输出适合作为包含16个元素的大型列表和30个:$系数,$ residuals,$ fitted.values ....

尝试1:

for (i in length(fit)){ 
  model_pvalues <- rbind(model_pvalues, coef(summary(fit[[i]])))
}

此输出到&#34; model_pvalues&#34; 95个观测值(截距和94个变量)和4个变量:Estimate,Std。错误,z值,Pr(&gt; | z |)。然而,我真正想要得到的是所有1097个变量的p值,对于通过一个交叉验证构建的95个模型。

尝试2:

for (i in length(fit)){ 
  model_pvalues <- rbind(model_pvalues, coef(summary(fit[[i]]))[4])
}

当我运行这个时,我会得到一个数字(不确定从哪里开始,假设有一个beta)。

尝试3:

for (i in 1:96){
  df <- DF2[-i,]
  fit[[i]] <- glm (response ~., data= df, family= "binomial")
  model_pvalues <- rbind(model_pvalues, coef(summary(fit[[i]])))
}

当我运行这个时,我得到了1520个4变量观测数据框:Estimate,Std。错误,z值,Pr(&gt; | z |)。观察以(拦截)开始,然后是82个变量。之后,它用(Intercept1)和相同的82个变量重复这个模式,直到(Intercept15)。

所以我的最终目标是通过LOOCV创建95个模型,并获得所有模型中使用的所有1097个变量的p值。非常感谢任何帮助!

编辑:示例数据(1098变量的实际DF 96观测值)

  Response  X1  X2  X3  X4  X5  X6  X7  X8  X9  X10

P1  N       1   1   1   0   1   0   1   0   2    2
P2  N       2   1   1   0   2   2   1   2   2    2
P3  N       2   1   2   1   1   0   1   1   0    1
P4  Y       1   1   2   0   1   0   0   1   1    1
P5  N       2   2   1   1   1   0   0   0   1    1
P6  N       2   1   2   1   1   0   0   0   2    1
P7  Y       2   1   1   0   2   0   0   0   2    0
P8  Y       2   1   1   0   2   0   0   1   0    2
P9  N       1   1   1   0   2   0   0   0   1    0
P10 N       2   1   2   1   1   0   1   0   0    2

1 个答案:

答案 0 :(得分:1)

对于n观察(实际数据为96,示例数据为10)和p变量(实际数据为1098,示例数据为10),下面的代码应提取p排{p}值的n列矩阵。我觉得有必要警告你,试图适应n<<p案例(相对于参数数量的极少观察)很可能具有极差的统计特性,甚至可能是不可能的,除非你使用像惩罚这样的技术回归......这也可能是为什么估计中缺少这么多参数的原因(即你只得到了可能的1097个变量中的94个) - 特别是因为你的表达模式很简单(只有0,1,或者2),大量的参数是共线的,不能联合估计(你应该在原始模型中看到很多NA)。

获取示例数据:

DF2 <- read.table(row.names=1,header=TRUE,text="
Resp. X1  X2  X3  X4  X5  X6  X7  X8  X9  X10
P1  N   1   1   1   0   1   0   1   0   2   2
P2  N   2   1   1   0   2   2   1   2   2   2
P3  N   2   1   2   1   1   0   1   1   0   1
P4  Y   1   1   2   0   1   0   0   1   1   1
P5  N   2   2   1   1   1   0   0   0   1   1
P6  N   2   1   2   1   1   0   0   0   2   1
P7  Y   2   1   1   0   2   0   0   0   2   0
P8  Y   2   1   1   0   2   0   0   1   0   2
P9  N   1   1   1   0   2   0   0   0   1   0
P10 N   2   1   2   1   1   0   1   0   0   2")

适合模特

n <- nrow(DF2)
fit <- vector(mode="list",n) ## best to pre-allocate objects
for (i in 1:n) {
  df <- DF2[-i,]
  fit[[i]] <- glm (Resp. ~., data= df, family= "binomial")
}

在这种情况下,我们必须小心提取p值,因为由于共线性,其中一些缺失 - R在系数向量中留下NAcoef())对于非估计参数,但不会在摘要中类似地填充系数表的行。

tmpf <- function(x) {
    ## extract coef vector - has NA values for collinear terms
    ## [-1] is to drop the intercept
    r1 <- coef(x)[-1]
    ## fill in values from p-value vector; leave out intercept with -1,
    r2 <- coef(summary(x))[-1,"Pr(>|z|)"]
    r1[names(r2)] <- r2
    return(r1)
}
pvals <- sapply(fit,tmpf)

当然,对于玩具示例,所有p值基本上等于1 ...

## round(pvals,4)
##       [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]   [,9]  [,10]
## X1  0.9998 0.9998 0.9998 0.9998 0.9998 0.9998 0.9999 0.9998 0.9999 0.9998
## X2  0.9999 0.9999 0.9999 0.9999     NA 0.9999 0.9999 0.9999 0.9999 0.9999
## X3  0.9999 0.9999 0.9999 0.9999 0.9999 0.9998 0.9999 0.9999 0.9999 0.9999
## X4  0.9998 0.9998 0.9998     NA 0.9998 0.9998 0.9998 0.9998 0.9998 0.9998
## X5      NA 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000     NA 1.0000
## X6  0.9999     NA 0.9999 0.9999 0.9999 0.9999 0.9999 0.9999 0.9999 0.9999
## X7  1.0000 1.0000 1.0000 1.0000 1.0000     NA 1.0000 1.0000 1.0000 1.0000
## X8  1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
## X9  1.0000 1.0000     NA 1.0000 1.0000 1.0000     NA     NA 1.0000     NA
## X10     NA     NA     NA     NA     NA     NA     NA     NA     NA     NA