Hoofdcomponentenanalyse: fout in colMeans(x, na.rm = TRUE): ‘x’ moet numeriek zijn

Ik probeer een Principal Components Analysis uit te voeren, maar ik krijg de foutmelding: Error in colMeans(x, na.rm = TRUE) : ‘x’ moet numeriek zijn

Ik weet dat alle kolommen numeriek moeten zijn, maar hoe ga je om met tekenobjecten in de dataset? Bijv.:

data(birth.death.rates.1966)
data2 <- birth.death.rates.1966
princ <- prcomp(data2)
  • data2 voorbeeld van onderstaande gegevens:

Moet ik een nieuwe kolom toevoegen waarin de landnaam naar een numerieke code wordt verwezen? Zo ja, hoe doe je dit in R?


Antwoord 1, autoriteit 100%

Je kunt een tekenvector converteren naar numerieke waarden door via factorte gaan. Elke unieke waarde krijgt dan een unieke integercode. In dit voorbeeld zijn er vier waarden, dus de cijfers zijn 1 tot 4, in alfabetische volgorde, denk ik:

> d = data.frame(country=c("foo","bar","baz","qux"),x=runif(4),y=runif(4))
> d
  country          x         y
1     foo 0.84435112 0.7022875
2     bar 0.01343424 0.5019794
3     baz 0.09815888 0.5832612
4     qux 0.18397525 0.8049514
> d$country = as.numeric(as.factor(d$country))
> d
  country          x         y
1       3 0.84435112 0.7022875
2       1 0.01343424 0.5019794
3       2 0.09815888 0.5832612
4       4 0.18397525 0.8049514

U kunt dan prcompuitvoeren:

> prcomp(d)
Standard deviations:
[1] 1.308665216 0.339983614 0.009141194
Rotation:
               PC1          PC2          PC3
country -0.9858920  0.132948161 -0.101694168
x       -0.1331795 -0.991081523 -0.004541179
y       -0.1013910  0.009066471  0.994805345

Of dit zinvol is voor uw toepassing, is aan u. Misschien wil je gewoon de eerste kolom laten vallen: prcomp(d[,-1])en werken met de numerieke gegevens, wat lijkt te zijn wat de andere “antwoorden” proberen te bereiken.


Antwoord 2, autoriteit 25%

De eerste kolom van het dataframe is teken. U kunt het dus hercoderen naar rijnamen als:

library(tidyverse)
data2 %>% remove_rownames %>% column_to_rownames(var="country")
princ <- prcomp(data2)

Alternatief als :

data2 <- data2[,-1]
rownames(data2) <- data2[,1]
princ <- prcomp(data2)

Antwoord 3

In R maakt het toevoegen van de factormethode aan een tekenset van gegevens het niet numeriek.
Het is inderdaad bedoeld om van ons machine learning-model een wiskundig model te maken, maar het zijn geen numerieke gegevens.

Voorbeeld: als u een lijst met namen heeft en deze numeriek worden gecodeerd, kan het gebeuren dat een bepaalde naam een hogere numerieke waarde heeft, waardoor deze een andere definitie krijgt, afhankelijk van ons model.
Wat niet het geval zou moeten zijn, aangezien namen (tekstgegevens die alleen bedoeld zijn om een specifieke set te labelen) over het algemeen niet zouden moeten definiëren hoe een model zou moeten werken.

Ook als u met deze gegevens probeert te werken in de veronderstelling dat het numeriek is, kunt u de volgende foutmelding krijgen:

Fout in colMeans(x, na.rm = TRUE): ‘x’ moet numeriek zijn

Ik heb hierboven gedefinieerd waarom u deze foutmelding kunt krijgen

Om dit probleem op te lossen

training_set[,2:3] = scale(training_set)
test_set[,2:3] = scale(test_set)

In de volgende afbeelding hebben kolommen 1 en 4 gecodeerde gegevens en kunnen ze niet worden behandeld als een numeriek model. Kolommen 2 en 3 bevatten oorspronkelijk numerieke gegevens, dus we kunnen ons model alleen op dat deel van de gegevens uitvoeren. De bovenstaande code laat zien hoe u de gegevens selecteert, deze bevat alle rijen en kolommen 2 en 3

Other episodes