利用Ancol PCA法将祖源计算器结果与实际情况相结合可视化分析

前言


看到题目的小伙伴是不是内心有一万个❓是不是想问那个Ancol PCA是什么鬼。不知道正常,因为这词是我造的233333
为什么叫这个名字:众所周知血统的英文是Ancestry,位置的英文是location,这俩单词取前三个字母,loc再倒过来去掉c,组合在一起不就是Ancol吗~PCA就是主成分分析的意思不变哦~

下面教程正式开始:


编程语言:python3.8
模块:pandas numpy sklearn matplotlib geopy
整体思路:先将计算器的多维数据降为二维数据并使其作为x,y轴,再将位置数据转化为一维数据并使其作为z轴,最后组合为三维数据并可视化

代码:


# 获取位置的经纬度
from geopy.geocoders import Nominatim

geolocator = Nominatim(user_agent = 'google_map')
location = geolocator.geocode('location')
(location.latitude, location.longitude)

# 降维并可视化
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import  pandas as pd
import numpy as np

# 数据预处理部分
## 数据读取
df = pd.read_csv('new_pca.csv', index_col = 0, header = 0)
## 获取样本所属族群
label = df.index
## 选出e11计算器数据部分
data = df.loc[:, '非洲':'美洲']
## 选出经纬度部分
df = df.loc[:, '纬度':'经度']
# 开始降维
## 将经纬度转化为弧度制并降维为一维数据
pca = PCA(n_components = 1)
z = pca.fit_transform(np.deg2rad(df))
## 将e11计算器11维数据降维为二维
pca = PCA(n_components = 2)
data_2 = pca.fit_transform(data)
# 将两数组合并
data = np.concatenate((data_2, z), axis = 1)
# 散点图可视化
fig = plt.figure()
ax = Axes3D(fig)
for i in range(len(label)):
    x, y, z = data[i][0], data[i][1], data[i][-1]
    if label[i] == '韩国':
        ax.scatter(x, y, z, color = 'blue')
    elif label[i] == '吉林省':
        ax.scatter(x, y, z, color = 'red')
plt.show()

结果展示:


在这里插入图片描述
(此示例是利用了韩国人和吉林省朝鲜族的e11数据以及位置信息做出来的Ancol PCA图)

此方法的优势:


可以将计算器结果极为相似的两个或多个族群在散点图上分散开,并且实现了将基因水平与个体水平较为科学的相结合分析

此方法的劣势:


点与点的的欧式距离不能准确的反映族群间的遗传距离,此外,对于晕3D的人来说数据的读取也较为难受。

此方法的意义:


以前大家看祖源的分析方法就只是直接看计算器结果再问问哪里人什么族,推断。最多也就再结合着传统的PCA看看。但利用此方法可以将位置信息数字化,更加科学的进行溯源。

下面是实现Ancol PCA的流程图:


在这里插入图片描述

以及绘制流程图用的代码:


from graphviz import Digraph
dot = Digraph(comment = 'The Round Table')
# 定点
dot.node('#', '读取数据')
dot.node('a', '计算器数据')
dot.node('b', '计算器二维数据')
dot.node('c', '数据所在地')
dot.node('d', '经纬度')
dot.node('e', '弧度制位置信息')
dot.node('f', '一维位置')
dot.node('+', '组成新数组')
dot.node('g', '三维图可视化')
# 连线
dot.edge('#', 'a', 'pandas')
dot.edge('a', 'b', 'sklearn(PCA)')
dot.edge('b', '+', 'numpy(concatenate)')
dot.edge('#', 'c', 'pandas')
dot.edge('c', 'd', 'geopy')
dot.edge('d', 'e', 'numpy(deg2rad)')
dot.edge('e', 'f', 'sklearn(PCA)')
dot.edge('f', '+', 'numpy(concatenate)')
dot.edge('+', 'g', 'matplotlib')
# 输出PDF
dot.render('ancol_pca.pdf')

感谢:


数据提供:母系-mtDNA祖源群 QQ:923891525
提供编程语言:Python 官网:https://www.python.org
提供模块:
pandas 官网:https://pandas.pydata.org
numpy 官网:https://www.numpy.org/
matplotlib 官网:https://matplotlib.org
sklearn 官网:https://scikit-learn.org/stable/
geopy 项目网站:https://github.com/geopy/geopy
graphviz 官网:http://www.graphviz.org


©️杨昊霖
转载时请注明出处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yhlhhhh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值