代谢组学分析 PCA PLS-DA OPLS-DA 在R语言中的实现

news2024/9/29 21:24:48

主成分分析(Principal Component Analysis,PCA)是一种无监督降维方法,能够有效对高维数据进行处理。但PCA对相关性较小的变量不敏感,而PLS-DA(Partial Least Squares-Discriminant Analysis,偏最小二乘判别分析)能够有效解决这个问题。而OPLS-DA(正交偏最小二乘判别分析)结合了正交信号和PLS-DA来筛选差异变量。

图片来自:Orthogonal Partial Least Squares (OPLS) in R | R-bloggers

干货 | 1分钟看懂OPLS-DA原理及图表如题。敬请翻阅。https://mp.weixin.qq.com/s?__biz=MzU2MzMzOTk1Mg==&mid=2247484881&idx=1&sn=a8b079763b17d620d11a96a62fa06c9d&chksm=fc5af20ecb2d7b18905a560e6f138902a7b1d0ae996d8444d34506e3af9267393fc89fed32e1&scene=178&cur_album_id=1762718371294330897#rd

安装和加载包

# install ropls
if (F) {
  if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
  
  BiocManager::install("ropls")
}

# load  packages
library(ropls)
library(ggplot2)
library(ggsci)
library(Cairo)
library(tidyverse)
library(extrafont)
loadfonts()

示例数据

复制成功

r

# load data
data(sacurine)
names(sacurine)

# view data information
attach(sacurine)
strF(dataMatrix)
strF(sampleMetadata)
strF(variableMetadata)

这个数据集是不同年龄、性别和BMI的183个人的尿液中109种代谢物的浓度差异$^{[1]}$。下面的分析主要以性别为变量来研究不同性别人群尿液种代谢物的差异。下面的分析主要包含PCA、PLS-DA和OPLS-DA。

PCA分析

复制成功

r

# PCA analysis
pca = opls(dataMatrix)
genderFc = sampleMetadata[, "gender"]

pdf(file = 'figures/PCA.pdf', width = 5, height = 5)
plot(pca, typeVc = "x-score",
     parAsColFcVn = genderFc, parEllipsesL = TRUE)
dev.off()

可以看到的是如果用PCA的话,不同性别的人群是混在一起的。

PLS-DA

复制成功

r

# PLSDA analysis
plsda = opls(dataMatrix,genderFc)

# sample scores plot
sample.score = plsda@scoreMN %>% 
  as.data.frame() %>%
  mutate(gender = sacurine[["sampleMetadata"]][["gender"]])
  
p1 = ggplot(sample.score, aes(p1, p2, color = gender)) +
  geom_hline(yintercept = 0, linetype = 'dashed', size = 0.5) +
  geom_vline(xintercept = 0, linetype = 'dashed', size = 0.5) +
  geom_point() +
  geom_point(aes(-10,-10), color = 'white') +
  labs(x = 'P1(10.0%)',y = 'P2(9%)') +
  stat_ellipse(level = 0.95, linetype = 'solid', 
               size = 1, show.legend = FALSE) +
  scale_color_manual(values = c('#008000','#FFA74F')) +
  theme_bw() +
  theme(legend.position = c(0.9,0.8),
    legend.text = element_text(color = 'black',size = 12, family = 'Arial', face = 'plain'),
    panel.background = element_blank(),
    panel.grid = element_blank(),
    axis.text = element_text(color = 'black',size = 15, family = 'Arial', face = 'plain'),
    axis.title = element_text(color = 'black',size = 15, family = 'Arial', face = 'plain'),
    axis.ticks = element_line(color = 'black'))
ggsave(p1, filename = 'figures/pls.pdf', 
       width = 5, height = 5, device = cairo_pdf)

和PCA相比,PLS-DA的效果相对较好。PLS-DA分析的目的是找到差异变量(本例中的109种代谢物的某几种)。因此,需要找到VIP值大于1的变量(代谢物):

复制成功

r

# VIP scores plot
vip.score = as.data.frame(plsda@vipVn)
colnames(vip.score) = 'vip'
vip.score$metabolites = rownames(vip.score)
vip.score = vip.score[order(-vip.score$vip),]
vip.score$metabolites = factor(vip.score$metabolites,
                               levels = vip.score$metabolites)

loading.score = plsda@loadingMN %>% as.data.frame()
loading.score$metabolites = rownames(loading.score)

all.score = merge(vip.score, loading.score, by = 'metabolites')

all.score$cat = paste('A',1:nrow(all.score), sep = '')

p2 = ggplot(all.score[all.score$vip >= 1,], aes(cat, vip)) +
  geom_segment(aes(x = cat, xend = cat,
                   y = 0, yend = vip)) +
  geom_point(shape = 21, size = 5, color = '#008000' ,fill = '#008000') +
  geom_point(aes(1,2.5), color = 'white') +
  geom_hline(yintercept = 1, linetype = 'dashed') +
  scale_y_continuous(expand = c(0,0)) +
  labs(x = '', y = 'VIP value') +
  theme_bw() +
  theme(legend.position = 'none',
        legend.text = element_text(color = 'black',size = 12, family = 'Arial', face = 'plain'),
        panel.background = element_blank(),
        panel.grid = element_blank(),
        axis.text = element_text(color = 'black',size = 15, family = 'Arial', face = 'plain'),
        axis.text.x = element_text(angle = 90),
        axis.title = element_text(color = 'black',size = 15, family = 'Arial', face = 'plain'),
        axis.ticks = element_line(color = 'black'),
        axis.ticks.x = element_blank())
ggsave(p2, filename = 'figures/pls_VIP.pdf', 
       width = 8, height = 5, device = cairo_pdf)

下面这些物质就是差异代谢物(VIP值大于等于1):

r

 [1] (gamma)Glu-Leu/Ile                                                                  
 [2] 2-acetamido-4-methylphenyl acetate                                                  
 [3] 2-Methylhippuric acid                                                               
 [4] 3-Methylcrotonylglycine                                                             
 [5] 3,4-Dihydroxybenzeneacetic acid                                                     
 [6] 3,5-dihydroxybenzoic acid/3,4-dihydroxybenzoic acid                                 
 [7] 4-Acetamidobutanoic acid isomer 3                                                   
 [8] 6-(carboxymethoxy)-hexanoic acid                                                    
 [9] Acetaminophen glucuronide                                                           
[10] Acetylphenylalanine                                                                 
[11] alpha-N-Phenylacetyl-glutamine                                                      
[12] Asp-Leu/Ile isomer 1                                                                
[13] Citric acid                                                                         
[14] Dehydroepiandrosterone 3-glucuronide                                                
[15] Dehydroepiandrosterone sulfate                                                      
[16] Gluconic acid and/or isomers                                                        
[17] Glucuronic acid and/or isomers                                                      
[18] Glyceric acid                                                                       
[19] Hippuric acid                                                                       
[20] Hydroxybenzyl alcohol isomer                                                        
[21] Malic acid                                                                          
[22] Methyl (hydroxymethyl)pyrrolidine-carboxylate/Methyl (hydroxy)piperidine-carboxylate
[23] Monoethyl phthalate                                                                 
[24] N-Acetyl-aspartic acid                                                              
[25] Oxoglutaric acid                                                                    
[26] p-Anisic acid                                                                       
[27] p-Hydroxyhippuric acid                                                              
[28] Pantothenic acid                                                                    
[29] Pentose                                                                             
[30] Phe-Tyr-Asp (and isomers)                                                           
[31] Pyruvic acid                                                                        
[32] Testosterone glucuronide                                                            
[33] Threonic acid/Erythronic acid                                                       
[34] Valerylglycine isomer 1                                                             
[35] Valerylglycine isomer 2                                                              

将它们的VIP值得进行可视化(某些代谢物名称太长,进行转换表示):

OPLS-DA分析

复制成功

r

# OPLS-DA analysis
oplsda = opls(dataMatrix, genderFc, predI = 1, orthoI = NA)

# sample scores plot
sample.score = oplsda@scoreMN %>% 
  as.data.frame() %>%
  mutate(gender = sacurine[["sampleMetadata"]][["gender"]],
         o1 = oplsda@orthoScoreMN[,1])

p3 = ggplot(sample.score, aes(p1, o1, color = gender)) +
  geom_hline(yintercept = 0, linetype = 'dashed', size = 0.5) +
  geom_vline(xintercept = 0, linetype = 'dashed', size = 0.5) +
  geom_point() +
  #geom_point(aes(-10,-10), color = 'white') +
  labs(x = 'P1(5.0%)',y = 'to1') +
  stat_ellipse(level = 0.95, linetype = 'solid', 
               size = 1, show.legend = FALSE) +
  scale_color_manual(values = c('#008000','#FFA74F')) +
  theme_bw() +
  theme(legend.position = c(0.1,0.85),
        legend.title = element_blank(),
        legend.text = element_text(color = 'black',size = 12, family = 'Arial', face = 'plain'),
        panel.background = element_blank(),
        panel.grid = element_blank(),
        axis.text = element_text(color = 'black',size = 15, family = 'Arial', face = 'plain'),
        axis.title = element_text(color = 'black',size = 15, family = 'Arial', face = 'plain'),
        axis.ticks = element_line(color = 'black'))
ggsave(p3, filename = 'figures/opls.pdf', 
       width = 5, height = 5, device = cairo_pdf)

可以看到的是OPLS-DA的效果比PLS-DA更好一些。

同样进行差异代谢物筛选:

复制成功

r

# VIP scores plot
vip.score = as.data.frame(oplsda@vipVn)
colnames(vip.score) = 'vip'
vip.score$metabolites = rownames(vip.score)
vip.score = vip.score[order(-vip.score$vip),]
vip.score$metabolites = factor(vip.score$metabolites,
                               levels = vip.score$metabolites)

loading.score = oplsda@loadingMN %>% as.data.frame()
loading.score$metabolites = rownames(loading.score)

all.score = merge(vip.score, loading.score, by = 'metabolites')

all.score$cat = paste('A',1:nrow(all.score), sep = '')

p4 = ggplot(all.score[all.score$vip >= 1,], aes(cat, vip)) +
  geom_segment(aes(x = cat, xend = cat,
                   y = 0, yend = vip)) +
  geom_point(shape = 21, size = 5, color = '#008000' ,fill = '#008000') +
  geom_point(aes(1,2.5), color = 'white') +
  geom_hline(yintercept = 1, linetype = 'dashed') +
  scale_y_continuous(expand = c(0,0)) +
  labs(x = '', y = 'VIP value') +
  theme_bw() +
  theme(legend.position = 'none',
        legend.text = element_text(color = 'black',size = 12, family = 'Arial', face = 'plain'),
        panel.background = element_blank(),
        panel.grid = element_blank(),
        axis.text = element_text(color = 'black',size = 15, family = 'Arial', face = 'plain'),
        axis.text.x = element_text(angle = 90),
        axis.title = element_text(color = 'black',size = 15, family = 'Arial', face = 'plain'),
        axis.ticks = element_line(color = 'black'),
        axis.ticks.x = element_blank())
p4
ggsave(p4, filename = 'figures/opls_VIP.pdf', 
       width = 8, height = 5, device = cairo_pdf)

下面的的是差异代谢物:

r

 [1] (gamma)Glu-Leu/Ile                                                                  
 [2] 2-acetamido-4-methylphenyl acetate                                                  
 [3] 2-Methylhippuric acid                                                               
 [4] 3-Methylcrotonylglycine                                                             
 [5] 3,4-Dihydroxybenzeneacetic acid                                                     
 [6] 3,5-dihydroxybenzoic acid/3,4-dihydroxybenzoic acid                                 
 [7] 4-Acetamidobutanoic acid isomer 3                                                   
 [8] 6-(carboxymethoxy)-hexanoic acid                                                    
 [9] Acetaminophen glucuronide                                                           
[10] Acetylphenylalanine                                                                 
[11] alpha-N-Phenylacetyl-glutamine                                                      
[12] Asp-Leu/Ile isomer 1                                                                
[13] Citric acid                                                                         
[14] Dehydroepiandrosterone 3-glucuronide                                                
[15] Dehydroepiandrosterone sulfate                                                      
[16] Gluconic acid and/or isomers                                                        
[17] Glucuronic acid and/or isomers                                                      
[18] Glyceric acid                                                                       
[19] Hippuric acid                                                                       
[20] Hydroxybenzyl alcohol isomer                                                        
[21] Malic acid                                                                          
[22] Methyl (hydroxymethyl)pyrrolidine-carboxylate/Methyl (hydroxy)piperidine-carboxylate
[23] Monoethyl phthalate                                                                 
[24] N-Acetyl-aspartic acid                                                              
[25] Oxoglutaric acid                                                                    
[26] p-Anisic acid                                                                       
[27] p-Hydroxyhippuric acid                                                              
[28] Pantothenic acid                                                                    
[29] Pentose                                                                             
[30] Phe-Tyr-Asp (and isomers)                                                           
[31] Pyruvic acid                                                                        
[32] Testosterone glucuronide                                                            
[33] Threonic acid/Erythronic acid                                                       
[34] Valerylglycine isomer 1                                                             
[35] Valerylglycine isomer 2                                                             

模型训练与预测

这些降维的方法都属于机器学习算法,那就可以对模型进行训练,并用这个模型去预测未知的数据。

模型训练很简单:

复制成功

r

# model training
oplsda.2 = opls(dataMatrix, genderFc, predI = 1, orthoI = NA,subset = "odd") 

r

OPLS-DA
92 samples x 109 variables and 1 response
standard scaling of predictors and response(s)
      R2X(cum) R2Y(cum) Q2(cum)
Total     0.26    0.825   0.608
      RMSEE RMSEP pre ort
Total 0.213 0.341   1   2
Warning message:
'permI' set to 0 because train/test partition is selected.

可以看到使用了92个样本进行训练。

先看看模型在训练集上的准确率:

复制成功

r

# 模型在训练集上的准确率
trainVi = getSubsetVi(oplsda.2)
tab = table(genderFc[trainVi], fitted(oplsda.2))
print(paste('模型准确率:',round(sum(diag(tab))/sum(tab)*100, 2),'%', sep = ''))

r

   M  F
  M 50  0
  F  0 42
[1] "模型准确率:100%"

看模型在训练集上的准确率是没有什么意义的,要是在训练集的表现都不好,那模型一定不好。那看看模型在未知数据上的预测准确率吧:

复制成功

r

# model on test data
tab2 = table(genderFc[-trainVi],predict(oplsda.2, dataMatrix[-trainVi, ]))
print(paste('模型准确率:',round(sum(diag(tab2))/sum(tab2)*100, 2),'%', sep = ''))

r

     M  F
  M 43  7
  F  7 34
[1] "模型准确率:84.62%"

这个准确率已经很棒了。

差异代谢物其他筛选方法

除了用(O)PLS-DA中的VIP值对代谢物进行筛选,还可以用别的方法进行筛选,如log2FC等。通常是绘制火山图。

复制成功

r

# volcano plot
df = dataMatrix %>% as.data.frame()
df$gender = sacurine[["sampleMetadata"]][["gender"]]
df = df[order(df$gender),]
df = df[,-110]

M.mean = apply(df[1:100,],2,FUN = mean)
F.mean = apply(df[101:183,],2,FUN = mean)

FC = M.mean / F.mean
log2FC = log(FC,2)

pvalue = apply(df, 2, function(x)
  {t.test(x[1:100],x[101:183])$p.value})

p.adj = p.adjust(pvalue, method = 'BH')
p.adj.log = -log10(p.adj)

colcano.df = data.frame(log2FC,p.adj, p.adj.log)
colcano.df$cat = ifelse(colcano.df$log2FC >= 1 & colcano.df$p.adj < 0.05,'Up',
                        ifelse(colcano.df$log2FC <= -1 & colcano.df$p.adj < 0.05,'Down','NS'))

p5 = ggplot(colcano.df, aes(log2FC, p.adj.log)) +
  geom_point() +
  labs(y = '-log10(p-value.adj)') +
  theme_bw() +
  theme(legend.position = 'none',
        legend.text = element_text(color = 'black',size = 12, family = 'Arial', face = 'plain'),
        panel.background = element_blank(),
        panel.grid = element_blank(),
        axis.text = element_text(color = 'black',size = 15, family = 'Arial', face = 'plain'),
        axis.text.x = element_text(angle = 90),
        axis.title = element_text(color = 'black',size = 15, family = 'Arial', face = 'plain'),
        axis.ticks = element_line(color = 'black'),
        axis.ticks.x = element_blank())
p5
ggsave(p5, filename = '20201214PLSDA分析/figures/volcano.pdf', 
       width = 5, height = 5, device = cairo_pdf)

可能是这个例子中的代谢物太少了,导致算完以后都没有差异代谢物了。

参考文献

[1] Thévenot E A, Roux A, Xu Y, et al. Analysis of the human adult urinary metabolome variations with age, body mass index, and gender by implementing a comprehensive workflow for univariate and OPLS statistical analyses[J]. Journal of proteome research, 2015, 14(8): 3322-3335.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/730212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

el-table 添加合计,合计某一列

效果图&#xff1a; 1. 使用elementui 官网上的方法 如果是只要是数值&#xff0c;就要合并&#xff0c;就只设置show-summary 即可。 2. html&#xff1a; <!--cell-style 改变某一列行的背景色 --><!-- tree-props 配置树形子表row-click: 单击事件highlight-cu…

node修改版本、npm修改版本、yarn无法加载文件、node_modules\sharp: Command failed解决方法

1、node修改版本 步骤1&#xff1a;从node官网下载node压缩包或者exe文件 如果是下载的是exe文件就直接找到原来的node.exe文件替换掉就可以了&#xff0c;环境变量配置不变 如果是下载的node压缩包&#xff0c;需要解压后&#xff0c;修改本地的环境变量配置&#xff08;查看步…

微服务实例构建成 docker 镜像实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

抖音seo源码部署搭建--代码分享

一、 开发环境搭建 抖音SEO源码部署环境搭建可以分为以下几个步骤&#xff1a; 安装必要的软件和工具&#xff1a;需要安装Node.js、NPM、Git等软件和工具&#xff0c;具体安装方法可以参考官方文档。 下载源码&#xff1a;从GitHub或其他源码托管平台下载抖音SEO源码。 安装…

SpringBoot 配置文件:什么时配置文件?配置文件能干什么?

文章目录 &#x1f387;前言1.配置文件的格式2. properties配置文件说明2.1 properties基本语法2.2 读取配置文件 3. yml 配置文件说明3.1 yml 基本语法 4.properties与yml 对比 &#x1f387;前言 学习一个东西&#xff0c;我们先要知道它有什么用处。整个项目中所有重要的数…

Vscode 绿色系清新主题

炎炎夏日&#xff0c;上班上的心浮气躁&#xff0c;敲代码的时候&#xff0c;只觉昏昏沉沉&#xff0c;浑浑噩噩... 给vscode换一个一个清新美好的绿色主题&#xff0c;充满活力和希望吧。 朋友们&#xff0c;收藏起来&#xff0c;每个季节换一个主题&#xff0c;打工快乐&am…

[工业互联-14]:机器人操作系统与ROS

目录 第1章 简介 第2章 历史 第3章 特点 &#xff08;1&#xff09;点对点设计 &#xff08;2&#xff09;不依赖编程语言 &#xff08;3&#xff09;精简与集成 &#xff08;4&#xff09;便于测试 &#xff08;5&#xff09;开源 &#xff08;6&#xff09;强大的库及…

LVS-DR负载群集的优势和部署实例

目录 一、DR模式数据包流向分析 二、DR模式的特点 三、DR模式中需要解决的问题 四、LVS-DR部署实例 1.配置NFS共享存储器 2.配置节点web服务&#xff08;两台的配置相同&#xff09; 3.配置LVS负载调度器 一、DR模式数据包流向分析 1.Client 客户端发送请求到 Director …

OpenCV库实现了一个简单的图像放缩工具

这里是详细的代码解析: #include <opencv2/opencv.hpp> // 引入OpenCV主要库。 #include <opencv2/highgui/highgui.hpp> // 引入高级GUI模块,它包含用于显示图像和获取用户输入的函数。 #include <opencv2/imgproc/imgproc.hpp> // 引入图像处理模块,它…

mysql数据类型char和varchar的区别

&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&…

如何将Windows的文件存储到铁威马NAS里?

总是能听到小伙伴问&#xff0c;有没有办法可以省去登入TOS的操作就可以直接存取铁威马NAS上的文件及资料呢&#xff1f;很简单&#xff0c;其实只要将NAS的共享文件夹映射到Windows的网络驱动器&#xff0c;就饿可以让我们节省登入TOS的操作直接存取TNAS的文件&#xff0c;编辑…

如何打造工程师文化?

目录 一、打造工程师文化的步骤&#xff1a;二、成功案例&#xff1a;三、失败案例及教训&#xff1a; 打造工程师文化是一个复杂而又关键的任务&#xff0c;它需要公司在组织结构、价值观、领导风格以及员工福利等方面做出全面的调整。下面是一个针对打造工程师文化的详细步骤…

[mj_robot_sim]多关节机器人仿真软件介绍

全称&#xff1a;Multi-Joints Robot Simulator 代码地址&#xff1a;https://github.com/Jelatine/mj_robot_sim 设计目的 个人学习opengl的技术落地尝试设计一个跨平台、轻量级的机器人仿真软件&#xff0c;方便调试机器人 特性 轻量级&#xff0c;接口简单易用跨平台&…

管理类联考——逻辑——技巧篇——形式逻辑的三大理论基石

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

​LeetCode解法汇总445. 两数相加 II

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每…

[RocketMQ] Broker asyncPutMessage处理消息以及存储的高性能设计措施 (十一)

asyncPutMessage方法真正的用来存储消息。 文章目录 1.asyncPutMessage存储普通消息1.1 checkStoreStatus检查存储状态1.2 checkMessage检查消息 2.CommitLog#asyncPutMessage异步存储消息2.1 处理延迟消息2.2 获取最新mappedFile2.2.1 tryCreateMappedFile创建新的MappedFile2…

使用凌鲨进行数据标注

在AI研发团队中&#xff0c;数据的数量和质量通常比算法本身更重要。为了获得大量高质量的数据&#xff0c;标注软件是必不可少的。目前许多开源标注软件在权限、任务管理和审核方面都存在较大问题。 在凌鲨(linksaas)0.3.8版本中增加了数据标注功能&#xff0c;支持 音频分类…

基于matlab使用车载激光雷达数据在惯性测量单元读数帮助下构建地图(附源码)

一、前言 此示例演示如何处理来自安装在车辆上的传感器的 3-D 激光雷达数据&#xff0c;以便在惯性测量单元 &#xff08;IMU&#xff09; 读数的帮助下逐步构建地图。这样的地图可以促进车辆导航的路径规划&#xff0c;也可以用于定位。为了评估生成的地图&#xff0c;此示例…

国内环境安装Atlas OS步骤与网络问题解决

国内环境安装Atlas OS步骤与网络问题解决 Atlas 是一个开源、透明的项目&#xff0c;它修改了 Windows&#xff0c;并消除了影响游戏性能的所有负面缺点。我们是减少系统延迟、网络延迟、输入延迟和保持系统私密性的绝佳选择&#xff0c;同时仍然关注性能。我不久前在安装时遇…

【论文基本功】【LaTeX】参考文献中常见属性的用法及特点(bib文件)【IEEE论文】

【论文基本功】【LaTeX】参考文献中常见属性的用法及特点&#xff08;bib文件&#xff09;【IEEE论文】 一、author&#xff08;作者&#xff09;1. 使用方法用法1&#xff1a;作者名字的两种写法用法2&#xff1a;使用and连接不同作者姓名用法3&#xff1a;超过3个作者时如何使…