Masalah ini paling baik ditangani dengan contoh.

Mendirikan

Mat1 <- matrix(nrow =9, ncol =11)
colnames(Mat1) <- c("Name", "Strategy.Assets", "Jan.94", "Jan.95", "Jan.96", "Jan.97", "1", "2", "3","4", "5")
Mat1[,1] <- letters[1:9]
Mat1[,2] <- cbind(20,30,40,50,60,30,30,40,50)
Mat1[,3:6] <- rnorm(36,0,1)
Mat1[,7] <- c(0,0,0,0,0,0,0,0,0)
Mat1[,8] <- c(0.95, 0.8, 0,0,0,0,0,0,0)
Mat1[,9] <- c(0.95,0.6,0.7,0,0,0,0,0,0)
Mat1[,10] <- c(0.08, 0.09, 0.99, 0.93, 0,0,0,0,0)
Mat1[,11] <- c(0.09,0.01,0.04,0.97, 0.80,0,0,0,0)

data.frame(Mat1)

Perlakukan kolom "1" "2" "3" "4" "5" "6" sebagai awal dari matriks korelasi (seharusnya 9 kali 9 tetapi saya hanya menampilkan 6 kolom pertama).

Untuk setiap baris di kolom 1 hingga 6, saya perlu mengidentifikasi apakah ada nilai >= 0.95. Jika ada, saya perlu tahu posisinya. Dalam hal ini nilai 0,95 muncul pada entri m= 1, n=2 dari matriks korelasi. Saya kemudian harus pergi ke kolom "aset strategi" dan membandingkan nilai di baris 1 dan 2 (dalam hal ini 20 dan 30). Setelah ini, saya harus menghilangkan baris dengan nilai yang lebih rendah (baris 1 karena 20 kurang dari 30). Setelah menghapus satu baris, saya perlu melanjutkan ke baris berikutnya dalam matriks korelasi - kita melihat bahwa di baris 2, tidak ada nilai yang setidaknya sama dengan 0,95. Kami kemudian melanjutkan ke baris ketiga. Kita kemudian melihat 0.99 >0.95 terjadi pada posisi m=3, n=4. Kami kemudian pergi ke "aset strategi" dan membandingkan nilai di baris 3 dan 4. Di baris 3 aset strategi = 40, dan baris 4 =50. Jadi kami menghilangkan baris 3. Kami kemudian melanjutkan ke baris 4 dari matriks korelasi. di posisi 4,5 0,99 terjadi. Kami kemudian perlu membandingkan baris 4 dan 5 dalam aset strategi. Kita melihat bahwa baris 5 =60, dan baris 4=50 sehingga perlu menghilangkan baris4.

Saya perlu mengulangi proses ini untuk semua baris dalam matriks korelasi.

Perhatikan bahwa entri (1,3) dari matriks korelasi juga sama dengan 0,95. Namun, karena row1 telah dihapus (dari iterasi pertama), saya tidak memerlukan loop untuk terus berjalan dalam kasus ini.

  > data.frame(Mat1)
  Name Strategy.Assets             Jan.94             Jan.95             Jan.96              Jan.97 X1   X2   X3   X4   X5
1    a              20   2.95438832384095  0.322838398649362  0.265489849080971   -1.26762589628627  0 0.95 0.95 0.08 0.09
2    b              30 -0.231467724347497   1.36209337396348  0.244352997300369   0.147019042483708  0  0.8  0.6 0.09 0.01
3    c              40 -0.725388339795491 0.0813983643917171  -0.50418751522557   0.802967414744253  0    0  0.7 0.99 0.04
4    d              50 -0.120645568994363    1.7770242881308 -0.798437656907533    1.03842921924565  0    0    0 0.93 0.97
5    e              60  0.818447801042692 -0.767858384307916  -1.23187047713004 -0.0779863946287645  0    0    0    0  0.8
6    f              30 -0.231572883434978  0.266559660007751  0.720829574412722 -0.0207732265889516  0    0    0    0    0
7    g              30  0.444651868913969  0.832322051653509 -0.538333881677844   0.291130047037627  0    0    0    0    0
8    h              40   2.00827324376109  0.775006479679076 0.0323592399331455   -2.33121256833447  0    0    0    0    0
9    i              50 -0.368493048065977   1.30727697822673 -0.446402751994181 -0.0616057412430855  0    0    0    0    0

Maka output yang saya inginkan adalah:

output <- data.frame(rbind(Mat1[2,1:6], Mat1[5:9,1:6]))
output

  Name Strategy.Assets             Jan.94             Jan.95             Jan.96              Jan.97
1    b              30 -0.231467724347497   1.36209337396348  0.244352997300369   0.147019042483708
2    e              60  0.818447801042692 -0.767858384307916  -1.23187047713004 -0.0779863946287645
3    f              30 -0.231572883434978  0.266559660007751  0.720829574412722 -0.0207732265889516
4    g              30  0.444651868913969  0.832322051653509 -0.538333881677844   0.291130047037627
5    h              40   2.00827324376109  0.775006479679076 0.0323592399331455   -2.33121256833447
6    i              50 -0.368493048065977   1.30727697822673 -0.446402751994181 -0.0616057412430855

Saya harus dapat menerapkan fungsi ini ke matriks dalam daftar. Setiap matriks dalam daftar memiliki jumlah baris yang berbeda, dan karenanya jumlah kolom yang berbeda. Namun 6 kolom pertama selalu sama. Pada dasarnya, variabel 'nama' meningkat (bisa dari a ke z), menyebabkan matriks korelasi meningkat. (dalam kasus ini akan menjadi 26 kali 26).

0
JC3019 6 Agustus 2019, 05:35

1 menjawab

Jawaban Terbaik

Jika saya telah memahami Anda dengan benar, salah satu caranya adalah dengan terlebih dahulu mengetahui indeks baris dan kolom yang nilainya lebih besar dari sama dengan 0,95 untuk kolom korelasi menggunakan which. Untuk setiap pasangan baris dan kolom, kami menemukan nilai minimum yang sesuai dan menghapus baris tersebut dari Mat1 asli.

mat <- which(Mat1[, as.character(1:5)] >= 0.95, arr.ind = TRUE)
Mat1[-unique(apply(mat, 1, function(x) x[which.min(Mat1$Strategy.Assets[x])])), ]


#  Name Strategy.Assets      Jan.94      Jan.95     Jan.96     Jan.97 1   2   3    4    5
#2    b              30 -0.02101158  1.27504998 -0.9534582 -0.6917499 0 0.8 0.6 0.09 0.01
#5    e              60 -0.88500700 -1.19165574 -1.6309657  0.6183648 0 0.0 0.0 0.00 0.80
#6    f              30 -0.45072999 -0.04698659  0.7462178  0.5858741 0 0.0 0.0 0.00 0.00
#7    g              30  1.29131284 -1.60004027 -0.9681269  0.9595044 0 0.0 0.0 0.00 0.00
#8    h              40  0.37883959 -1.11536574 -0.3041997 -0.8202406 0 0.0 0.0 0.00 0.00
#9    i              50  1.50068308  0.89465888  0.6646096  0.4433313 0 0.0 0.0 0.00 0.00

data

Mat1 <- data.frame(matrix(nrow =9, ncol =11))
colnames(Mat1) <- c("Name", "Strategy.Assets", "Jan.94", "Jan.95", "Jan.96", 
                 "Jan.97", "1", "2", "3","4", "5")

Mat1[,1] <- letters[1:9]
Mat1[,2] <- c(20,30,40,50,60,30,30,40,50)
Mat1[,3:6] <- rnorm(36,0,1)
Mat1[,7] <- c(0,0,0,0,0,0,0,0,0)
Mat1[,8] <- c(0.95, 0.8, 0,0,0,0,0,0,0)
Mat1[,9] <- c(0.95,0.6,0.7,0,0,0,0,0,0)
Mat1[,10] <- c(0.08, 0.09, 0.99, 0.93, 0,0,0,0,0)
Mat1[,11] <- c(0.09,0.01,0.04,0.97, 0.80,0,0,0,0)
2
Ronak Shah 6 Agustus 2019, 03:45