mstate多状态模型使用方法

 背景和原理分析:

1.cox回归

cox回归广泛用于生存回归之中,相较于其他回归模型,cox回归的特点是考虑了time这一参数

Cox回归要求满足

第一等比例风险(Proportional hazards)假定。第二,当自变量是连续型变量时,Cox回归中自变量与因变量的关系--一种转换后线性关系,也必须满足变化。

cox回归的返回值是HR

风险比(HR)大于1表示与事件概率正相关的协变量,因此与生存期长度负相关。

1. HR 1 :无效;
2. HR 1 :减少危害 ;
3. HR 1 :危险增加。

 Fig1

 2.多状态模型

其实是将生存这一事件考虑了多个状态,即以多长的时间t1进入state1,以多长的时间进入state2……是对cox回归的拓展

 

  Fig2 from Long-term exposure to ambient air pollution is a risk factor for trajectory of cardiometabolic multimorbidity: A prospective study in the UK Biobank  https://doi.org/10.1016/j.ebiom.2022.104282

 代码示例:

library(mstate)
##多状态模型
library(ggplot2)
theme_set(theme_bw(base_size = 14))
##包含了237名艾滋病患者的基因型、感染时间、诊断时间、死亡时间等信息。

data("aidssi")
head(aidssi)
si<-aidssi

##定义一个转换矩阵,2表示竞争风险的大小(数量)
tmat<-trans.comprisk(2,names=c("event-free","AIDS","SI"))

si$stat1 <-as.numeric(si$status==1)
si$stat2 <-as.numeric(si$status==2)

##msprep: Function to prepare dataset for multi-state modeling
silong<-msprep(time=c(NA,"time","time"),status = c(NA,"stat1","stat2"),data=si,keep = "ccr5",trans=tmat)

##扩展协变量
silong<-expand.covs(silong,"ccr5")
##~: 用于构建公式;y~x1+x2
##拟合竞争风险的降秩比例风险模型

##strata实现分层抽样,产生分成变量
##使用strata(分层)变量的目的是为了处理违反比例风险假设
##(proportional hazards assumption)的情况
##Surv表示生存时间和生存状态的数据格式
##自变量是所需要考虑的协变量,例子里的是位点是否突变
c1<-coxph(Surv(time,status)~ccr5WM.1+ccr5WM.2+strata(trans),data=silong)

##ww是特定数据(观测值),可以通过调整来实现敏感性分析
WW<-data.frame(ccr5WM.1=c(0,0),ccr5WM.2=c(0,0),trans=c(1,2),strata=c(1,2))
#msfit函数根据拟合好的模型c1和新数据WW来计算特定于受试者的过渡危险及其(协)方差
msf.WW<-msfit(object = c1,newdata = WW,trans=tmat)
plot(msf.WW,use.ggplot=TRUE)

 结果图标:

 

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用 Camera2 API 进行后台静默拍照的示例代码: ```java public class Camera2Service extends Service { private CameraManager mCameraManager; private ImageReader mImageReader; private Size mImageSize; private CameraDevice mCameraDevice; private CameraCaptureSession mCaptureSession; private HandlerThread mBackgroundThread; private Handler mBackgroundHandler; private static final int STATE_PREVIEW = 0; private static final int STATE_WAITING_LOCK = 1; private static final int STATE_WAITING_PRECAPTURE = 2; private static final int STATE_WAITING_NON_PRECAPTURE = 3; private static final int STATE_PICTURE_TAKEN = 4; private int mState = STATE_PREVIEW; private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice cameraDevice) { mCameraDevice = cameraDevice; startPreview(); } @Override public void onDisconnected(@NonNull CameraDevice cameraDevice) { cameraDevice.close(); mCameraDevice = null; } @Override public void onError(@NonNull CameraDevice cameraDevice, int i) { cameraDevice.close(); mCameraDevice = null; } }; private final CameraCaptureSession.StateCallback mSessionCallback = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { mCaptureSession = cameraCaptureSession; try { CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); builder.addTarget(mImageReader.getSurface()); builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); mCaptureSession.setRepeatingRequest(builder.build(), null, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) { } }; private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader imageReader) { Image image = imageReader.acquireLatestImage(); // do something with the image image.close(); } }; @Override public void onCreate() { super.onCreate(); mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); mBackgroundThread = new HandlerThread("Camera2Service"); mBackgroundThread.start(); mBackgroundHandler = new Handler(mBackgroundThread.getLooper()); } @Override public int onStartCommand(Intent intent, int flags, int startId) { try { String cameraId = mCameraManager.getCameraIdList()[0]; CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(cameraId); StreamConfigurationMap streamConfigurationMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); mImageSize = streamConfigurationMap.getOutputSizes(SurfaceTexture.class)[0]; mImageReader = ImageReader.newInstance(mImageSize.getWidth(), mImageSize.getHeight(), ImageFormat.JPEG, 2); mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler); mCameraManager.openCamera(cameraId, mStateCallback, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); stopBackgroundThread(); if (mCameraDevice != null) { mCameraDevice.close(); mCameraDevice = null; } } private void startPreview() { try { CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); SurfaceTexture texture = new SurfaceTexture(0); texture.setDefaultBufferSize(mImageSize.getWidth(), mImageSize.getHeight()); Surface surface = new Surface(texture); builder.addTarget(surface); mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), mSessionCallback, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } private void stopBackgroundThread() { if (mBackgroundThread != null) { mBackgroundThread.quitSafely(); try { mBackgroundThread.join(); mBackgroundThread = null; mBackgroundHandler = null; } catch (InterruptedException e) { e.printStackTrace(); } } } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } ``` 在 `onStartCommand()` 方法中,我们通过 `CameraManager` 获取相机设备,并创建一个 `ImageReader` 对象,用于获取拍照后的图片数据。然后我们在后台线程中打开相机,并在相机设备状态回调中启动预览。当相机预览开始后,我们就可以在 `CameraCaptureSession` 中发起拍照请求,请求的结果会在 `ImageReader.OnImageAvailableListener` 中回调。注意,在 `onDestroy()` 方法中,我们需要释放相机资源和后台线程。 此示例中我们使用了 `CameraDevice.TEMPLATE_RECORD` 模板来创建拍照请求,这样可以确保在后台静默拍照时能够正常工作。如果您需要更多的控制权,可以尝试使用其他模板,例如 `CameraDevice.TEMPLATE_STILL_CAPTURE`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值