标准化率(standardized rate)R实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了标准化率(standardized rate)R实现相关的知识,希望对你有一定的参考价值。

参考技术A

标化率 ,全称是 标准化率(standardized rate) ,是流行病学中常见的一个指标,当几个比较组之间的年龄、性别等变量的构成不同时,此时直接比较组间的粗率(crude rate)容易导致偏倚,通常需要对率做标准化(standardization)后再比较。

标化率中心思想 :利用某一指定的标准人口构成,消除不同地区在人口构成指标(年龄、性别等)方面的差别,即计算按标准人口构成校准后的总率。标准人口应该选择有代表性的、较稳定的、数量较大的人群,如全国、全世界、全省的人口为标准人口,时间也最好与被标化资料一致或接近。

标准化率的方法 :主要有两种,即直接法和间接法。
直接法 是根据一个标准人口(如全国、全省人口或合并人口等)构成,重新计算各组的预期率,从而得到标准化率。直接法需要已知各组的人口构成和相应的率(如患病率、死亡率等),以及标准人口构成。
间接法 是根据标准患病率(或死亡率、发病率等)及各组的人口构成来计算预期率,从而得到标准化率。间接法需要已知各组的人口构成以及标准人口患病率(或死亡率、发病率等)。

要点

注:
总标准死亡率=标准人口年龄构成(即年龄组别占比)× 各年龄组别标准死亡率
总预期死亡率=各年龄组别标准死亡率 × 实际人口年龄构成

假设某地区5个年龄组的HIV感染人数与对应年龄组的人口数。计算该地区的HIV的年龄标化率。

case/pop=CrudeRate;可以通过 mutate 来计算

首先需要通过 standard_pop标准人口来计算各个年龄组的比例,这个standard_pop可以根据某省或者WHO的标准,主要目的是获取不同年龄组所占总人口比例。
(1) 计算各年龄组的人数proportion

prop.table 可以计算年龄组的proportion;确保proportion 总和为1。

(2) 计算年龄组调整的率

只需将每个年龄组的原始 case 乘以该年龄组的 proportion 即可。 (由于proportion均小于1,因此HIV的年龄标化率是各个年龄组调整后的累计效应)

根据该计算方式;可以得出 CrudeRate =166.0874; Adjust_rates=143.9176

借助于 epitools :

这里增加了一列数据standard_pop人口的各个感染病例数:standard_case;这样就相当于两个地区各年龄组都有HIV的发病数。合并两个地区的pop计算调整的年龄标化率。

参考阅读
(1) 标准化率
(2) R 计算年龄标化率(Age Adjusted Rates)
(3) Age Adjusted Rates - Steps for Calculating

Non-standard serial port baud rate setting

////combuad_recv.cpp

#include <stdio.h>      /*标准输入输出定义*/
#include <stdlib.h>     /*标准函数库定义*/
#include <unistd.h>     /*Unix 标准函数定义*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>      /*文件控制定义*/
#include <termios.h>    /*PPSIX 终端控制定义*/
#include <errno.h>      /*错误号定义*/
#include <string.h>


#include <sys/ioctl.h>
#include <linux/serial.h>


#define FALSE   -1
#define TRUE   0


/*
   设置串口
   最基本的设置串口包括波特率设置,效验位和停止位设置。
   串口的设置主要是设置 struct termios 结构体的各成员值。


   struct termio
   {
   unsigned short  c_iflag; // 输入模式标志
   unsigned short  c_oflag; // 输出模式标志
   unsigned short  c_cflag; // 控制模式标志
   unsigned short  c_lflag; // local mode flags
   unsigned char  c_line; // line discipline
   unsigned char  c_cc[NCC];   // control characters
   };
 */


/**
 *@brief  设置串口通信速率
 *@param  fd     类型 int  打开串口的文件句柄
 *@param  speed  类型 int  串口速度
 *@return  void
 */
static int speed_arr[] = { B200, B300, B600, B1200, B1800, B2400, B4800, B9600, B19200, B38400, B57600, B115200, /*B200000,*/ B230400 };
static int name_arr[] =  {  200,  300,  600,  1200,  1800,  2400,  4800,  9600,  19200,  38400,  57600,  115200, /*200000,*/ 230400 };
static int set_speed(int fd, int speed)
{
    int   i;
    int   status;
    struct termios   Opt;
    int baud_rate;


    tcgetattr(fd, &Opt);


    for (i = 0; i < sizeof(speed_arr)/sizeof(int); i++)
    {
        if(speed == name_arr[i])
        {
            baud_rate = speed_arr[i];


            if(baud_rate <= B38400)
            {
                cfsetispeed(&Opt, baud_rate);
                cfsetospeed(&Opt, baud_rate);
            }
            else
            {
                Opt.c_cflag |= CBAUDEX;
                baud_rate -= 4096;/*baud_rate取值为1 ~ 5,分别对应B57600/B115200/B3000000/B6000000/B12000000*/
                cfsetispeed(&Opt, baud_rate);
                cfsetospeed(&Opt, baud_rate);
            }


            tcflush(fd, TCIOFLUSH);
            cfsetispeed(&Opt, speed_arr[i]);
            cfsetospeed(&Opt, speed_arr[i]);
            status = tcsetattr(fd, TCSANOW, &Opt);
            if  (status != 0)
            {
                perror("tcsetattr fd");
                return FALSE;
            }
            tcflush(fd,TCIOFLUSH);


            return TRUE;
        }
    }


    fprintf(stderr, "Unsupported speed\n");


    return FALSE;
}


// uart_set_info
// 设置为特诉波特率,比如200000
int set_speci_baud(int fd, int baud)
{
    struct serial_struct ss, ss_set;
    struct termios Opt;
    tcgetattr(fd, &Opt);


    cfsetispeed(&Opt, B38400);
    cfsetospeed(&Opt, B38400);


    tcflush(fd, TCIFLUSH);/*handle unrecevie char*/
    tcsetattr(fd, TCSANOW, &Opt);


    if((ioctl(fd, TIOCGSERIAL, &ss)) < 0)
    {
        printf("BAUD: error to get the serial_struct info:%s\n", strerror(errno));
        return -1;
    }


    ss.flags = ASYNC_SPD_CUST;
    ss.custom_divisor = ss.baud_base / baud;
    if((ioctl(fd, TIOCSSERIAL, &ss)) < 0)
    {
        printf("BAUD: error to set serial_struct:%s\n", strerror(errno));
        return -2;
    }


    ioctl(fd, TIOCGSERIAL, &ss_set);
    printf("BAUD: success set baud to %d,custom_divisor=%d,baud_base=%d\n",
            baud, ss_set.custom_divisor, ss_set.baud_base);


    return 0;
}


/**
 *@brief   设置串口数据位,停止位和效验位
 *@param  fd     类型  int  打开的串口文件句柄
 *@param  databits 类型  int 数据位   取值 为 7 或者8
 *@param  stopbits 类型  int 停止位   取值为 1 或者2
 *@param  parity  类型  int  效验类型 取值为N,E,O,,S
 */
static int set_parity(int fd, int databits, int stopbits, int parity)
{
    struct termios options;
    if(tcgetattr( fd,&options) != 0)
    {
        perror("SetupSerial 1");
        return(FALSE);
    }


    options.c_cflag &= ~CSIZE;
    switch (databits) /*设置数据位数*/
    {
        case 7:
            options.c_cflag |= CS7;
            break;
        case 8:
            options.c_cflag |= CS8;
            break;
        default:
            fprintf(stderr,"Unsupported data size\n");
            return (FALSE);
    }


    switch (parity)
    {
        case n:
        case N:
            options.c_cflag &= ~PARENB;   /* Clear parity enable */
            options.c_iflag &= ~INPCK;     /* Enable parity checking */
            break;
        case o:
        case O:
            options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
            options.c_iflag |= INPCK;             /* Disnable parity checking */
            break;
        case e:
        case E:
            options.c_cflag |= PARENB;     /* Enable parity */
            options.c_cflag &= ~PARODD;   /* 转换为偶效验*/
            options.c_iflag |= INPCK;       /* Disnable parity checking */
            break;
        case S:
        case s:  /*as no parity*/
            options.c_cflag &= ~PARENB;
            options.c_cflag &= ~CSTOPB;
            break;
        default:
            fprintf(stderr,"Unsupported parity\n");
            return (FALSE);
    }


    /* 设置停止位*/
    switch (stopbits)
    {
        case 1:
            options.c_cflag &= ~CSTOPB;
            break;
        case 2:
            options.c_cflag |= CSTOPB;
            break;
        default:
            fprintf(stderr,"Unsupported stop bits\n");
            return (FALSE);
    }


    // important
    options.c_cflag |= CLOCAL | CREAD;
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_oflag &= ~OPOST;
    options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);


    /* Set input parity option */
    if (parity != n)
        options.c_iflag |= INPCK;
    tcflush(fd, TCIFLUSH);
    options.c_cc[VTIME] = 10; /* 设置超时*/
    options.c_cc[VMIN] = 0; /* Update the options and do it NOW */


    if (tcsetattr(fd, TCSANOW, &options) != 0)
    {
        perror("SetupSerial 3");
        return (FALSE);
    }


    return (TRUE);
}


static int open_dev(const char *dev)
{
    int fd = open(dev, O_RDWR);         //| O_NOCTTY | O_NDELAY
    if (-1 == fd)
    {
        perror("can‘t open serial port");
        return -1;
    }
    else
    {
        return fd;
    }
}


ssize_t Read1(int fd, char *ptr)
{
    static int read_cnt = 0;
    static char *read_ptr = NULL;
    static char read_buf[1024];

    if (read_cnt <= 0) 
    {
again:
        if (-1 == (read_cnt = read(fd, read_buf,
                        sizeof(read_buf)))) 
        {
            if (EINTR == errno)
            {
                fprintf(stdout, "[lgw] we received a int signal. \n");
                goto again;
            }

            return -1;
        }
        else if (0 == read_cnt)
        {
            return 0;
        }

        read_ptr = read_buf;
    }

    --read_cnt;
    *ptr = *read_ptr++;

    return 1;
}


int main(int argc, char *argv[])
{
    int fd;
    int band_rate;
    int uart_init_interval_second;
    char *dev;

    int cnt = -1, i = 0;
    unsigned char recv_buff[512] = { 0 };
    char c;



    if(4 != argc)
    {
        printf("Usage: %s <rs232_dev> <band_rate> <uart_init_interval_second>\n", argv[0]);
        return -1;
    }


    dev = (char *)argv[1];
    band_rate = atoi((char *)argv[2]);
    uart_init_interval_second = atoi((char *)argv[3]);
/*
    if((fd = open_dev(dev)) < 0)
    {
        printf("can‘t open port %s \n", dev);
        return -1;
    }

*/
    if((fd = open_dev(dev)) < 0)
    {
        printf("can‘t open port %s \n", dev);
        return -1;
    }
    else
    {
        if(set_speci_baud(fd, band_rate) < 0)
        //if(set_speci_baud(fd, 500000) < 0)
        {
            printf("Set Speed Error set_speci_baud: %d\n",band_rate);
            close(fd);
            return -1;
        }

        sleep(uart_init_interval_second);
        // if(set_speed(fd, 115200) < 0)
        // {
        // printf("Set Speed Error set_speed\n");
        // return -1;
        // }

        if(set_parity(fd, 8, 1, N) < 0)
        {
            printf("Set Parity Error\n");
            close(fd);
            return -1;
        }
        sleep(uart_init_interval_second);
    }

    while(1){
        if(1 == Read1(fd, &c))
        {
            fprintf(stderr, "c[%c] = 0x%02x \n", c, (unsigned char)c);
        }
    }

    close(fd);

    return 0;
}

 

以上是关于标准化率(standardized rate)R实现的主要内容,如果未能解决你的问题,请参考以下文章

R语言构建xgboost模型并评估模型(测试集训练集每一轮):误分类率指标(misclassification rate)logloss

R使用dplyr包对变量特征进行标准化(standardize)缩放操作

R语言计算回归模型标准化残差实战(Standardized Residuals):识别回归模型中离群点

R语言sd函数计算数值标准差实战(Standard Deviation)

R语言回归模型残差标准误差计算实战(Residual Standard Error):计算残差标准误残差标准误解读

R数据缩放值标准缩放(standardization scaling)以及最小最大缩放(Min-Max scaling)