如何在R语言中计算C-index

Python011

如何在R语言中计算C-index,第1张

利用Hmisc包中的rcorr.cens函数 局限: - 只能处理一个预测变量 - 对超过2分类的分类变量处理粗糙

# 加载包及生成数据框,这里生成数据框主要是为了方便大家理解,因为大家通常都是将Excel的数据读进R,存储为数据框格式

library(survival)

library(Hmisc)

age <- rnorm(200, 50, 10)

bp <- rnorm(200,120, 15)

d.time <- rexp(200)

cens <- runif(200,.5,2)

death <- d.time <= cens

os <- pmin(d.time, cens)

sample.data <- data.frame(age = age,bp = bp,os = os,death = death)

#让我们看一下生成的例子数据的前6行

head(sample.data)

##age bp os death

## 1 33.18822 114.6965 1.106501 FALSE

## 2 41.86970 123.2265 1.365944 FALSE

## 3 50.41484 124.9522 0.867119 FALSE

## 4 45.66936 127.3237 1.155765 TRUE

## 5 39.79024 134.8846 1.257501 TRUE

## 6 31.89088 140.9382 1.125504 FALSE

rcorr.cens的代码及结果,第一个值就是C指数,同时也有Dxy的值

rcorr.cens(sample.data$age, Surv(sample.data$os, sample.data$death))

##C IndexDxy S.D. nmissing

## 4.528492e-01 -9.430156e-02 5.565299e-02 2.000000e+02 0.000000e+00

## uncensored Relevant Pairs Concordant Uncertain

## 1.290000e+02 3.172800e+04 1.436800e+04 8.072000e+03

rcorrcens的代码及结果,注意rcorrcens的写法是写成formula(公式)的形式,较为方便;而rcorr.cens的 写法是只能在前面写上一个自变量,并且不支持data = ...的写法,有点繁琐。较为遗憾的是这两种方法得到的C指数的标准误需要通过S.D./2间接得到。

r <- rcorrcens(Surv(os, death) ~ age + bp,data = sample.data)

r

## Somers' Rank Correlation for Censored DataResponse variable:Surv(os, death)

##

## CDxy aDxySDZ P n

## age 0.453 -0.094 0.094 0.056 1.69 0.0902 200

## bp 0.498 -0.003 0.003 0.054 0.06 0.9517 200

#画一个上下限图

require(plotrix)

# Plot the confidence interval

plotCI(x=0,y=1,li=0,ui=3,ylim=c(-10,15),lwd=2)

#如果是对数据框进行绘图,可以参考:

http://www.math.hawaii.edu/~grw/Classes/2013-2014/2014Spring/Math472_1/MyPlotCI.html

用R语言求置信区间是很方便的,而且很灵活,至少我觉得比spss好多了。

如果你要求的只是95%的置信度的话,那么用一个很简单的命令就可以实现了

首先,输入da=c(你的数据,用英文逗号分割),然后t.test(da),运行就能得到结果了。

我的数据是newbomb <- c(28,26,33,24,34,-44,27,16,40,-2,29,22,24,21,25,30,23,29,31,19)

t.test(newbomb)得到的结果如下

如果要求任意置信度下的置信区间的话,就需要自己编一个函数了。

当然,有两点要记住的,置信区间的计算在知道方差和不知道方差的情况下,计算公式是不一样的。

下面做一个两种情况下都可以用的函数。

confint<-function(x,sigma=-1,alpha=0.05)

{

n<-length(x)

xb<-mean(x)

if(sigma>=0)

{

tmp<-sigma/sqrt(n)*qnorm(1-alpha/2)df<-n

}

else{

tmp<-sd(x)/sqrt(n)*qt(1-alpha/2,n-1)df<- n-1

}

data.frame(mean=xb,df=df,a=xb-tmp,b=xb+tmp)

}

这个函数的使用:

如果不知道方差,则confint(x,alpha) 知道方差,则confint(x,sigma,alpha)

这样就能计算出结果了。