我有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
答案 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在系数向量中留下NA
(coef()
)对于非估计参数,但不会在摘要中类似地填充系数表的行。
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