2

I'm a biologist trying to use R, and I'm struggling with it.

I'm trying to generate a Principal Component Analysis for this data:

1,26.96,37.31,35.74
1,24.27,38.48,37.24
1,23.58,35.64,40.78
1,24.29,35.72,39.99
1,26.43,37.72,35.85
1,28.80,46.96,24.24
2,30.05,44.86,25.09
2,26.59,47.24,26.17
2,30.55,45.70,23.75
2,25.95,48.77,25.28
2,23.31,50.11,26.59
2,31.29,43.88,24.82
3,14.70,37.65,47.65
3,17.11,36.14,46.75
3,15.83,36.83,47.34
3,13.77,38.39,47.84
3,17.76,35.02,47.22
3,12.90,38.29,48.81

The first column correspond to the group variable, I have 3 groups.

I saw HERE, how to make the graph that I want. But every time I get to the generating biplot part, I get the message:

Error: Continuous value supplied to discrete scale.

Here is the code that I'm using:

>data(GPA2)
>head(GPA2, 3) 
>log.ir <- log(GPA2[, 2:4])
>ir.group <- GPA2[, 1]
>ir.pca <- prcomp(log.ir,center = TRUE,scale = TRUE) 
>print(ir.pca)
>plot(ir.pca, type = "l")
>summary(ir.pca)
>predict(ir.pca, newdata=tail(log.ir, 2))
>g <- ggbiplot(ir.pca, obs.scale = 1, var.scale = 1, groups = ir.group, ellipse = TRUE, circle = TRUE)
>g <- g + scale_color_discrete(name = '')
>g <- g + theme(legend.direction = 'horizontal', legend.position = 'top')
>print(g)

Can anyone help me?

user2314737
  • 27,088
  • 20
  • 102
  • 114

2 Answers2

1

Your grouping variable needs to be a factor not numeric

library(ggbiplot)
GPA2 <- data.frame(
  ir.group = sample(c(1,2,3),10, replace = TRUE),
  x = sample(1:10),
  y = sample(1:10),
  z = sample(1:10)
)

data(GPA2)
head(GPA2, 3) 
log.ir <- log(GPA2[, 2:4])
ir.group <- GPA2[, 1]
ir.pca <- prcomp(log.ir,center = TRUE,scale = TRUE) 
print(ir.pca)
plot(ir.pca, type = "l")
summary(ir.pca)
predict(ir.pca, newdata=tail(log.ir, 2))
g <- ggbiplot(ir.pca, obs.scale = 1, var.scale = 1, groups = as.factor(ir.group), ellipse = TRUE, circle = TRUE)
g <- g + scale_color_discrete(name = '')
g <- g + theme(legend.direction = 'horizontal', legend.position = 'top')
print(g)
akoiter
  • 11
  • 1
0

Your grouping variable in the first column is an integer (1,2,3), it needs to be a string, replace it with something like "group 1", "group 2", "group 3" (without the ""). Your data would then look something like this:

group 1,26.96,37.31,35.74
group 1,24.27,38.48,37.24
group 1,23.58,35.64,40.78
group 1,24.29,35.72,39.99
group 1,26.43,37.72,35.85
group 1,28.80,46.96,24.24
group 1,30.05,44.86,25.09
group 2,26.59,47.24,26.17
group 2,30.55,45.70,23.75
group 2,25.95,48.77,25.28
group 2,23.31,50.11,26.59
group 2,31.29,43.88,24.82
group 3,14.70,37.65,47.65
group 3,17.11,36.14,46.75
group 3,15.83,36.83,47.34
group 3,13.77,38.39,47.84
group 3,17.76,35.02,47.22
group 3,12.90,38.29,48.81
user3256536
  • 185
  • 1
  • 2
  • 14