用popart构建常染色体单倍型网络(Autosomal haplotypes network construction with popart)...

本文详细介绍了如何利用popart软件构建常染色体单倍型网络。首先,从vcf文件转为plink格式,通过PLINK确定连锁位点。接着,提取连锁的35个位点,生成singstring文件和两条单链fas格式文件。然后,用DnaSP6将fas文件转换为nex文件,并统计不同群体的单倍型数量。最后,手动修改nex文件并用popart构建单体型网络。

1)将vcf转化为plink格式,假定输入的vcf文件名为:17893893-17898893.vcf,也可以参考链接:将vcf文件转化为plink格式并且保持phasing状态

/vcftools --vcf 17893893-17898893.vcf --plink-tped --out 17893893-17898893 /plink --tfile 17893893-17898893 --recode --out 17893893-17898893

  

2) 用PLINK确定要研究的位点是否处于连锁的状态;生成blocks和blocks.det两种后缀格式文件;

/plink --file 17893893-17898893 --blocks no-pheno-req --out 17893893-17898893

  

 

 以上结果说明rs62033

class PopArtLayer(nn.Module): """ 正确实现参考:https://arxiv.org/abs/1809.04474 """ def __init__(self, input_dim, output_dim, epsilon=1e-5): super().__init__() self.input_dim = input_dim self.output_dim = output_dim self.epsilon = epsilon # 可学习参数 self.weight = nn.Parameter(torch.Tensor(output_dim, input_dim)) self.bias = nn.Parameter(torch.Tensor(output_dim)) # 运行统计量 self.register_buffer('mu', torch.zeros(output_dim)) self.register_buffer('sigma', torch.ones(output_dim)) self.register_buffer('v', torch.zeros(output_dim)) # 二阶矩 # 初始化 nn.init.kaiming_uniform_(self.weight, a=math.sqrt(5)) bound = 1 / math.sqrt(input_dim) nn.init.uniform_(self.bias, -bound, bound) def forward(self, x): # 原始输出 y = F.linear(x, self.weight, self.bias) # 标准化输出 y_normalized = (y - self.mu) / torch.sqrt(self.sigma + self.epsilon) return y_normalized def update_stats(self, targets): """ 更新统计量 (应在每个训练batch后调用) """ with torch.no_grad(): # 计算batch统计量 mu_batch = targets.mean(dim=0) v_batch = targets.var(dim=0, unbiased=False) n = targets.size(0) # 更新全局统计量 (指数移动平均) delta = mu_batch - self.mu self.mu += delta * 0.1 self.v = 0.9 * self.v + 0.1 * (v_batch + delta**2) self.sigma = self.v - self.mu**2 # 调整权重以保持输出一致性 std = torch.sqrt(self.sigma + self.epsilon) self.weight.data *= (std.unsqueeze(1) / torch.sqrt(self.sigma_old + self.epsilon)) self.bias.data = (self.bias.data - self.mu_old) / std和class PopArtLayer(nn.Module): """ 正确实现参考:https://arxiv.org/abs/1809.04474 """ def __init__(self, input_dim, output_dim, epsilon=1e-5): super().__init__() self.input_dim = input_dim self.output_dim = output_dim self.epsilon = epsilon # 可学习参数 self.weight = nn.Parameter(torch.Tensor(output_dim, input_dim)) self.bias = nn.Parameter(torch.Tensor(output_dim)) # 运行统计量 self.register_buffer('mu', torch.zeros(output_dim)) self.register_buffer('sigma', torch.ones(output_dim)) self.register_buffer('v', torch.ones(output_dim)) # 初始值为1,避免标准差为0 # 初始化 nn.init.kaiming_uniform_(self.weight, a=math.sqrt(5)) bound = 1 / math.sqrt(input_dim) nn.init.uniform_(self.bias, -bound, bound) def forward(self, x): # 原始输出 y = F.linear(x, self.weight, self.bias) # 标准化输出 y_normalized = (y - self.mu) / torch.sqrt(self.sigma + self.epsilon) return y_normalized def update_stats(self, targets): """ 更新统计量 (应在每个训练batch后调用) """ with torch.no_grad(): # 缓存旧的统计量 mu_old = self.mu.clone() sigma_old = torch.sqrt(self.sigma + self.epsilon) # 计算 batch 统计量 mu_batch = targets.mean(dim=0) v_batch = targets.var(dim=0, unbiased=False) n = targets.size(0) # 更新全局统计量 (指数移动平均) delta = mu_batch - self.mu self.mu += delta * 0.1 self.v = 0.9 * self.v + 0.1 * (v_batch + mu_batch**2) self.sigma = self.v - self.mu**2 # 调整权重与偏置 std = torch.sqrt(self.sigma + self.epsilon) self.weight.data *= (std.unsqueeze(1) / sigma_old.unsqueeze(1)) self.bias.data = (self.bias.data - mu_old) / sigma_old * std + self.mu 那个更优更好
最新发布
03-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值