PCA в R

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

PCA в R

Сообщение Анна » 01 июл 2011, 13:35

Казалось бы тривиальная задачка - посчитать PCA. Набор данных выглядит следующим образом:
species id, var_1,var_2,var_n...
1,12,119,-6
1,14,117,-3
1,11,116,-2
2,12,105,-6
2,18,115,-4
3,11,125,-3
4,20,115,-6
то есть множественные наблюдения для каждого вида + много видов.
Как это сделать в R? кроме ade4 есть варианты?

Аватара пользователя
Игорь Черниенко
Активный участник
Сообщения: 137
Зарегистрирован: 28 мар 2009, 01:05
Репутация: 11
Откуда: Хабаровск, Южно-Сахалинск

Re: PCA в R

Сообщение Игорь Черниенко » 03 июл 2011, 02:11

В R есть родная функция princomp(), подробнее можно посмотреть здесь http://www.inp.nsk.su/~baldin/DataAnaly ... mining.pdf
Помимо ade4 настоятельно рекомендую vegan - там и многомерный анализ, и видовое разнообразие и всякие индексы (брей-кертис, шеннон итд)
http://cran.r-project.org/web/packages/vegan/vegan.pdf
http://cran.r-project.org/web/packages/ ... -vegan.pdf
http://cran.r-project.org/web/packages/ ... -vegan.pdf
http://cran.r-project.org/web/packages/ ... -vegan.pdf
http://cc.oulu.fi/~jarioksa/opetus/meto ... ntutor.pdf
(английский)
Удачи :о)|||

Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

Re: PCA в R

Сообщение Анна » 03 июл 2011, 15:12

спасибо Игорь.
да вот в том-то и дело, не нравится мне ни веган, ни ade:) объясню почему. Оба пакета заточены под обработку данных для community ecology и оперируют понятием plot (площадка)
То есть переводя на их язык приведенная мной табличка с данными должна быть разбита на две и выглядеть следующим образом:

1. таблица один - переменные + площадка
plot_id, var1, var2,var3
1,12,119,-6
2,14,117,-3
3,11,116,-2
4,12,105,-6
5,18,115,-4
6,11,125,-3
7,20,115,-6

2.таблица два - площадка + виды (presence/absence для каждой площадки)
plot_id, sp1,sp2,sp3,sp4
1,1,0,0,0
2,1,0,0,0
3,1,0,0,0
4,0,1,0,0
5,0,1,0,0
6,0,0,1,0
7,0,0,0,1

не могу поверить, что нет пакета который напрямую работает с табличкой, которую я привела как исходную :(

Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

Re: PCA в R

Сообщение Анна » 03 июл 2011, 15:27

ну собственно, если нет, то тогда я переформулирую вопрос:)
как получить из таблицы:
id, sp
1,sp1
2,sp1
3,sp1
4,sp2
5,sp2
6,sp3
7,sp4

таблицу вида:
id, sp1,sp2,sp3,sp4
1,1,0,0,0
2,1,0,0,0
3,1,0,0,0
4,0,1,0,0
5,0,1,0,0
6,0,0,1,0
7,0,0,0,1

Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

Re: PCA в R

Сообщение Анна » 03 июл 2011, 16:45

если вдруг кто-то видел функцию - напишите, пожалуйста.

а пока вот такой вот очень неэффективный вариант:

Код: Выделить всё

m<-matrix(nrow=10,ncol=2)
m[,1]<-c(1:10)
m[,2]<-c(2,2,1,2,1,3,3,3,3,4)
colnames(m)<-c("plot","sp")


#convert occurrences into binary presence absence table
#takes species in order of species table: e.g. if species in column of species names are not alphabetically sorted, it will not sort PA table either
pres_abs_binary<-function(species_table,plot_col=1,sp_col=2){

if ( (length(unique(species_table[,plot_col]))) != (nrow(species_table))){

	stop("Sorry! exiting script because plot ids in your occurrences table are not unique.")
    
}


else{

#get unique species list from input table
species<-unique(species_table[,sp_col])

#create empty matrix to store result: number of rows equals to total number of observations in species table, number of columns equals to number of unique species names
com<-matrix(nrow=nrow(species_table),ncol=(length(species))+1)
#assing columns names 
colnames(com)<- c("id",species)

#for each species
for (i in 1:length(species)) {
	
	#for each row in species table
	for (j in 1:nrow(m3)){
		if(species_table[j,2]==species[i]){ #check if species names in there
			com[j,i+1] =1 #if yes, put 1
		}
	else{
			com[j,i+1] =0 #if not, put 0
		}
	}
}

com[,1]<-species_table[,plot_col]
return(com)

}
}


pres_abs_binary(m,1,2)

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: PCA в R

Сообщение Максим Дубинин » 03 июл 2011, 22:30

Код: Выделить всё

> d
  id  sp
1  1 sp1
2  2 sp1
3  3 sp1
4  4 sp2
5  5 sp2
6  6 sp3
7  7 sp4
> table(d)
   sp
id  sp1 sp2 sp3 sp4
  1   1   0   0   0
  2   1   0   0   0
  3   1   0   0   0
  4   0   1   0   0
  5   0   1   0   0
  6   0   0   1   0
  7   0   0   0   1
> 
пристегивайтесь, турбулентность прямо по курсу

Анна
Завсегдатай
Сообщения: 386
Зарегистрирован: 07 фев 2004, 14:31
Репутация: 7
Откуда: Лозанна
Контактная информация:

Re: PCA в R

Сообщение Анна » 03 июл 2011, 22:32

:oops:
спасибо)))

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей