博文

目前显示的是 2025的博文

免疫史计算

  vaccine_history = (     person.select( 'id_x' ).unique()     .join(         vaccine_tbl         .filter(pl.col( '大类编码' ).cast(pl.UInt32) < 20 )         .select( 'vaccine_name' )         .unique()         .filter(pl.col( 'vaccine_name' ).is_not_null()),         how = 'cross'     )     .join(         person         .group_by([ 'id_x' , 'vaccine_name' ])         .agg(pl.col( 'id_x' ).len().alias( '剂次数' )),         on = [ 'id_x' , 'vaccine_name' ],         how = 'left'     )     .with_columns(pl.col( '剂次数' ).fill_null( 0 ))     .sort([ 'id_x' , 'vaccine_name' ]) )

R 字段加密解密

  library ( tidyverse ) library ( janitor ) library ( hablar ) library ( openssl ) library ( magrittr ) library ( stringi ) # 加密函数 encrypt_column <- function ( data , column_names , key ) {   for ( column_name in column_names ) {     data [[ column_name ]] <- sapply ( data [[ column_name ]] , function ( x ) {       if ( is.na ( x ) || x == "" ) {         return ( NA )       }       tryCatch ({         x_utf8 <- stri_encode ( as.character ( x ) , "" , "UTF-8" )         iv <- rand_bytes ( 16 )         encrypted <- aes_cbc_encrypt ( charToRaw ( x_utf8 ) , key = key , iv = iv )         paste ( openssl :: base64_encode ( iv ) , openssl :: base64_encode ( encrypted ) , sep = ":" )       } , error = function ( e ) {         warning ( paste ( "Error ...

Polars 检查身份证号码是否符合规则

  import polars as pl def check_id ( id : str ) -> bool :     if len ( id ) != 18 :         return False         # 有效的地区码前两位(省份代码)     valid_provinces = {         '11' , '12' , '13' , '14' , '15' ,   # 北京、天津、河北、山西、内蒙古         '21' , '22' , '23' ,               # 辽宁、吉林、黑龙江         '31' , '32' , '33' , '34' , '35' , '36' , '37' ,   # 上海、江苏、浙江、安徽、福建、江西、山东         '41' , '42' , '43' , '44' , '45' , '46' ,         # 河南、湖北、湖南、广东、广西、海南         '50' , '51' , '52' , '53' , '54' ,               # 重庆、四川、贵州、云南、西藏         '61' , '62' , '63' , '64' , '65' ,               # 陕西、甘肃、青海、宁夏、新疆         '71' ,                ...

polars 长宽格式转换

  import polars as pl # 创建示例数据(宽格式) df_wide = pl.DataFrame({     "id" : [ 1 , 2 , 3 ],     "name" : [ "Alice" , "Bob" , "Charlie" ],     "math" : [ 90 , 85 , 92 ],     "english" : [ 88 , 90 , 85 ],     "science" : [ 92 , 88 , 90 ] }) print ( "原始数据(宽格式):" ) print (df_wide) # 使用 melt() 转换为长格式 df_long = df_wide.unpivot(     index = [ "id" , "name" ],           # 保持不变的列     on = [ "math" , "english" , "science" ],   # 要转换的列     variable_name = "subject" ,           # 新的变量名列     value_name = "score"               # 新的值列 ) # 使用上面的长格式数据,转换回宽格式 df_back_to_wide = df_long.pivot(     values = "score" ,       # 用作值的列     index = [ "id" , "name" ], # 作为行索引的列     on = "subject"     # 作为列名的列 ) print ( "转换回宽格式:" ) print (df_back_to_wide)

polars

import polars as pl df = pl.read_csv(     "/mnt/c/Users/Administrator/Downloads/百日咳小于2月大于7岁接种1.csv" ,     schema_overrides = {         "编码" : pl.Utf8,         "出生日期" : pl.Date,         "百日咳接种日期" : pl.Date,     },   # 将编码列指定为字符串类型 ) df.filter(pl.col( "出生日期" ) > pl.date( 2025 , 1 , 25 )) df.glimpse() df.head() df.group_by(pl.col( "出生日期" )).agg(pl.col( "编码" ).n_unique()).sort( "出生日期" ) df.group_by(pl.col( "出生日期" )).agg(pl.col( "编码" ).count()).sort( "出生日期" ) df = pl.DataFrame(     {         "name" : [ "Alice" , "Bob" , "Charlie" , "David" ],         "department" : [ "HR" , "IT" , "Finance" , "IT" ],         "salary" : [ 70000 , 80000 , 120000 , 95000 ],     } ) df = df.with_columns(     [pl.col( "salary" ).cum_sum().over( "department" ).alias( ...

R安装包时强制使用系统环境

  # 临时退出 conda conda deactivate # 安装系统版本 sudo apt update sudo apt install r-base-dev libnlopt-dev # 在系统 R 中安装 R -e "install.packages('nloptr', repos='https://cloud.r-project.org/')" R -e "install.packages('lme4', repos='https://cloud.r-project.org/')"

rstudio server 修改用户登录设置

sudo vim /etc/rstudio/rserver.conf auth-required-user-group=sudo,analysts,admins,rstudio auth-minimum-user-id=100 查看用户组 group xuefliang 查看用户id id xuefliang

mesh builder

 library(fmesher) library(sf) library(ggplot2) create_adaptive_mesh <- function(sf_object,                                  inner_edge_ratio = 30,    # 增大内部边长比例(更密集)                                  outer_edge_ratio = 5,     # 减小外部边长比例(更稀疏)                                  inner_offset_ratio = 8,   # 减小内部偏移比例(内部区域更大)                                  outer_offset_ratio = 20,  # 增大外部偏移比例(外部区域相对更小)                                  cutoff_ratio = 80,        # 增大cutoff比例(避免过小三角形)         ...

ubuntu 安装中文字体

  #   sudo apt install fonts-noto-cjk theme_set ( theme_bw ( base_family = "Noto Sans CJK SC" ))

rstudio 用户没有 sudo 权限

  使用管理员账户编辑 sudoers 文件 : <BASH> sudo visudo 在文件中添加以下行 : <BASH> rstudio ALL= ( ALL:ALL ) ALL 保存并退出 (通常是 Ctrl+X,然后 Y,然后 Enter

使用INLAspacetime完成时空建模

library(sf) library(fdmr) library(fmesher) library(INLA) library(inlabru) library(INLAspacetime) library(tidyverse) # 1. 加载数据并转换为 sf 对象 sf_data % st_as_sf(coords = c("LONG", "LAT"), crs = 4326) %>% mutate(mapp = 0) covid19_sf % st_as_sf(coords = c("LONG", "LAT"), crs = 4326) # 2. 计算网格参数,sf_data 的 geometry 类型是 sfc_MULTIPOLYGON coords 1) = 0.1 ) ) components

基于扩散的时空Gaussian Matérn场扩展

# DEMF模型总结:基于扩散的时空Gaussian Matérn场扩展 ## 概述 DEMF(Diffusion-based Spatio-temporal Extension of Matérn Fields)是一种通过随机偏微分方程(SPDE)将Gaussian Matérn场扩展到时空领域的随机过程家族。文章定义了四种具体模型:DEMF(1,0,2)、DEMF(1,2,1)、DEMF(2,0,2)和DEMF(2,2,0)。 ## 模型参数与特征 ### 参数定义 所有DEMF模型通过六个参数定义: - **光滑度参数**:(αₜ, αₛ, αₑ) - 控制时间、空间和噪声过程特性 - **尺度参数**:(γₜ, γₛ, γₑ) - 控制时空相关范围 ### 四种模型对比 | 模型 | (αₜ, αₛ, αₑ) | 时间光滑度 νₜ | 空间光滑度 νₛ | 类型 | 可分性 | |------|---------------|---------------|---------------|------|--------| | DEMF(1,0,2) | (1,0,2) | 1/2 | 1 | 可分模型(1阶) | 可分 | | DEMF(1,2,1) | (1,2,1) | 1/2 | 1 | 临界扩散 | 非可分 | | DEMF(2,0,2) | (2,0,2) | 3/2 | 1 | 可分模型(2阶) | 可分 | | DEMF(2,2,0) | (2,2,0) | 1 | 2 | 迭代扩散 | 完全非可分 | ## 主要共同特征 ### 理论基础 - **SPDE定义**:所有模型基于统一的SPDE框架 - **空间边际**:均为Matérn协方差形式 - **物理可解释性**:基于扩散过程,适合环境/气候数据建模 ### 实现特点 - **R-INLA兼容**:通过有限元方法实现稀疏表示 - **全球应用**:均可用于全球温度数据等大规模时空建模 - **非欧空间支持**:可扩展到球面、流形、网络等复杂几何结构 ## 关键差异 ### 1. 可分性特征 **可分模型**(DEMF(1,0,2), DEMF(2,0,2)): - 协方差函数:R(hₛ, hₜ) = Rₛ(hₛ)Rₜ(hₜ) - 时间边际协方差为Matérn形式 -...

时空模型2

  ```{r} library ( INLA ) library ( inlabru ) library ( magrittr ) library ( sf ) library ( tidyverse ) sf_data <- readRDS ( 'data/spatial_data.rds' ) # 基于最早日期计算连续周数 st_covid <- readRDS ( 'data/st_covid.rds' ) |>   mutate ( week = as.numeric ( difftime ( date , min ( date , na.rm = TRUE ), units = "weeks" )) %/% 1 + 1 ) |>   left_join ( sf_data @ data |> dplyr :: select ( MSOA11CD , LONG , LAT ), by = "MSOA11CD" ) |>   drop_na ( cases , Population , IMD , perc.wb , perc.ba , age1 , pm25 ) |>   st_as_sf ( coords = c ( "LONG" , "LAT" )) ``` ```{r} coordinates <- st_coordinates ( st_covid )   # st_covid geometry 类型是 sfc_POINT locs <- unique ( coordinates ) # # 计算每个多边形的质心 # centroids <- st_centroid(sf_data) # locs <- st_coordinates(centroids) # 计算初始参数 initial_range <- diff ( range ( locs [, 1 ])) / 3 max_edge <- initial_range / 2 # 构建网格 mesh <- fm_mesh_2d_inla (   st_covid ,   ma...