File: omxReadGRMBin.R

package info (click to toggle)
r-cran-openmx 2.21.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 14,412 kB
  • sloc: cpp: 36,577; ansic: 13,811; fortran: 2,001; sh: 1,440; python: 350; perl: 21; makefile: 5
file content (55 lines) | stat: -rw-r--r-- 1,886 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#
#   Copyright 2007-2020 by the individuals mentioned in the source code history
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
# 
#        http://www.apache.org/licenses/LICENSE-2.0
# 
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.


#------------------------------------------------------------------------------
# Authors: Robert M. Kirkpatrick, Jiang Yang
# Date: 2019-02-15
# Filename: omxReadGRMBin.R
# Purpose: Read GCTA-format GRMs
#------------------------------------------------------------------------------

#This function is adapted from syntax written by Jiang Yang for the GCTA User Manual:
omxReadGRMBin <- function(prefix, AllN=FALSE, size=4, returnList=FALSE){
	sum_i = function(i){
		return(sum(1:i))
	}	
	BinFileName = paste(prefix,".grm.bin",sep="")
	NFileName = paste(prefix,".grm.N.bin",sep="")
	IDFileName = paste(prefix,".grm.id",sep="")
	id = read.table(IDFileName)
	n = dim(id)[1]
	BinFile = file(BinFileName, "rb")
	grm = readBin(BinFile, n=n*(n+1)/2, what=numeric(0), size=size)
	NFile = file(NFileName, "rb")
	if(AllN==T){
		N = readBin(NFile, n=n*(n+1)/2, what=numeric(0), size=size)
	}
	else{
		N = readBin(NFile, n=1, what=numeric(0), size=size)
	}
	i = sapply(1:n, sum_i)
	if(returnList){
		return(list(diag=grm[i], off=grm[-i], id=id, N=N))
	}
	else{
		GRM <- matrix(0.0, nrow=n, ncol=n, dimnames=list(id$V1+id$V2, id$V1+id$V2))
		GRM[!lower.tri(GRM,diag=T)] <- grm[-i]
		GRM <- GRM + t(GRM)
		diag(GRM) <- grm[i]
		return(GRM)
	}
}