2015-09-10 4 views
1

У меня есть набор данных («данные»), который выглядит следующим образом:многомерное шкалирование участок в R

PatientID Visit Var1 Var2 Var3 Var4 Var5 
1  ID1  0 44.28 4.57 23.56 4.36 8.87 
2  ID1  1 58.60 5.34 4.74 3.76 6.96 
3  ID1  2 72.44 11.18 21.22 2.15 8.34 
4  ID2  0 65.98 6.91 8.57 1.19 7.39 
5  ID2  1 10.33 38.27 0.48 14.41 NA 
6  ID2  2 69.45 11.18 20.69 2.15 8.34 
7  ID3  0 69.16 6.17 10.98 1.91 6.12 
8  ID3  1 86.02 3.28 16.29 4.28 5.74 
9  ID3  2 69.45 NA 20.69 2.15 8.34 
10  ID4  0 98.55 26.75 2.89 3.92 2.19 
11  ID4  1 32.66 14.38 4.96 1.13 4.78 
12  ID4  2 70.45 11.42 21.78 2.15 8.34 

Мне нужно, чтобы сформировать участок МДС со всеми точек данных. Мне также нужны точки посещения, которые должны быть связаны линией и окрашены в зеленый цвет для посещения 1, красный для посещения 2 и черный для посещения3 (согласованные цвета для всех людей).

Мой код выглядит следующим образом (вполне lenghty, но это не работает):

data.cor <- cor(t(data[,3:7]), use = "pairwise.complete.obs", method = "spearman") 

dim(data.cor) 

dim(data) 

rownames(data.cor) <- paste0(data$PatientID, "V", data$Visit) 

colnames(data.cor) <- paste0(data$PatientID, "V", data$Visit) 

c <- dist(data.cor) 

fit <- cmdscale(c,eig=TRUE, k=2) 

ff <- fit$points 

ff <- as.data.frame(ff) 

ff$pair <- paste0(substr(rownames(ff),1,6)) 

ff$pair <- factor(ff$pair) 

pc.pair.distances <- matrix(nrow = nlevels(ff$pair), ncol = 1) 

for(i in 1:nlevels(ff$pair)){ 

    pair2 <- ff[ff$pair %in% levels(ff$pair)[i] , ] 

    pc.pair.distances[i,1] <- sqrt(

    ((pair2[1,1] - pair2[2,1]) * (pair2[1,1] - pair2[2,1])) 
+ ((pair2[1,2] - pair2[2,2]) * (pair2[1,2] - pair2[2,2])) 
) 

    rm(pair2) 

} 

plot(ff[,1], ff[,2], xlab="Principal 1", ylab="Principal 2", type = "n", las = 1) 

for(i in 1:nlevels(ff$pair)){ 

lines(ff[ff$pair == levels(ff$pair)[i],1], ff[ff$pair == levels(ff$pair)[i],2], col = "grey") 

} 

points(ff[,1], ff[,2], xlab="Coordinate 1", ylab="Coordinate 2", type = "p", 
    pch = ifelse(grepl(x = substr(rownames(ff), 7,8), "V1"), 20, 18), 
    cex = 1.3) 
) 

Я очень ценю вашу помощь.

+1

Можете ли вы сказать нам, где ваша проблема именно? У вас есть ошибка? – maeVeyable

+0

@maeVeyable: Я не уверен, имеет ли смысл мой код. Я не получаю ошибку, но моя фигура не такая, как я ожидаю. Я получаю только 8 datapoints вместо 12, поэтому я думаю, что что-то не так. Похоже, что третий визит не включен ...... Также мне хотелось бы, чтобы каждый пункт посещения окрашивался по-разному (но, напротив, для всех людей). Я также хотел бы, чтобы три точки посещения для каждого человека были связаны линией. – VasoGene

+0

На самом деле все точки нарисованы. Просто некоторые точки имеют одинаковые координаты. – maeVeyable

ответ

0

Я предлагаю вам изменить ваш data.frame, чтобы добавить колонку для посещения числа и ИНДИВ ид с функцией sapply.

ff$visit <- sapply(ff$pair,function(x){substr(x,5,5)}) 
ff$indiv <- sapply(ff$pair,function(x){substr(x,3,3)}) 

И тогда библиотека ggplot2 является очень полезным для построения данных. Во-первых, вы рисуете точки:

g <- ggplot(ff,aes(V1,V2))+geom_point(aes(color=visit)) 

А затем добавить строки для каждого человека:

for (i in unique(ff$indiv)){ 
g <- g+geom_line(data=ff[ff$indiv==i,],aes(V1,V2)) 
} 
+0

Большое спасибо за все полезные предложения! – VasoGene

Смежные вопросы