在 R 中对具有多个变量的纵向数据进行聚类

问题描述 投票:0回答:2

我有一个数据集,其中包含 30 个人的观察结果,每个人都做了 20 个实验。假设我的数据如下所示:

ID   trial  reaction   response   prop_1   prop_2
"s1"   1      2.12        0        0.52     0.48
"s1"   2      1.32        1        0.12     0.88
"s1"   3       NA         1         NA       NA
"s2"   1      2.33        1        0.65     0.35
"s2"   2      2.56        0        0.43     0.57
"s2"   3       NA         1         NA       NA

我想使用这些变量对参与者进行聚类。我研究了 traj、latrend 和 kml 包,但它们都只使用一个变量来对数据进行聚类。如何使用多个变量对这样的纵向数据进行聚类?

任何简单的帮助或指导将不胜感激。

r cluster-analysis longitudinal
2个回答
2
投票

这是一种方法。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import seaborn as sns; sns.set()
import csv


df = pd.read_csv('C:\\business.csv')
df.dropna(axis=0,how='any',subset=['latitude','longitude'],inplace=True)


K_clusters = range(1,10)

kmeans = [KMeans(n_clusters=i) for i in K_clusters]
Y_axis = df[['latitude']]
X_axis = df[['longitude']]

score = [kmeans[i].fit(Y_axis).score(Y_axis) for i in range(len(kmeans))]# Visualize

plt.plot(K_clusters, score)
plt.xlabel('Number of Clusters')
plt.ylabel('Score')
plt.title('Elbow Curve')
plt.show()

X = df[['longitude', 'latitude']].copy()
kmeans = KMeans(n_clusters = 5, init ='k-means++')
kmeans.fit(X[X.columns[1:2]]) # Compute k-means clustering

X['cluster_label'] = kmeans.fit_predict(X[X.columns[1:3]])
centers = kmeans.cluster_centers_ # Coordinates of cluster centers
labels = kmeans.predict(X[X.columns[1:2]]) # Labels of each point

X.head(10)


X.plot.scatter(x = 'latitude', y = 'longitude', c=labels, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5)

这是另一个想法。

# import necessary modules
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from collections import Counter


df = pd.read_csv('C:\\properties_2017.csv')
# df.head(10)
df = df.head(10000)


list(df)
df.shape

df.shape

df = df.sample(frac=0.2, replace=True, random_state=1)
df.shape


df = df.fillna(0)
df.isna().sum()


df['regionidzip']=df['regionidzip'].fillna(97000)
df.dropna(axis=0,how='any',subset=['latitude','longitude'],inplace=True)
X=df.loc[:,['latitude','longitude']]
zp=df.regionidzip



id_n=8
kmeans = KMeans(n_clusters=id_n, random_state=0).fit(X)
id_label=kmeans.labels_


#plot result
ptsymb = np.array(['b.','r.','m.','g.','c.','k.','b*','r*','m*','r^']);
plt.figure(figsize=(12,12))
plt.ylabel('Longitude', fontsize=12)
plt.xlabel('Latitude', fontsize=12)
for i in range(id_n):
    cluster=np.where(id_label==i)[0]
    plt.plot(X.latitude[cluster].values,X.longitude[cluster].values,ptsymb[i])
plt.show()

#revise the clustering based on zipcode
uniq_zp=np.unique(zp)
for i in uniq_zp:
    a=np.where(zp==i)[0]
    c = Counter(id_label[a])
    c.most_common(1)[0][0]
    id_label[a]=c.most_common(1)[0][0]

#plot result (revised)
plt.figure(figsize=(12,12))
plt.ylabel('Longitude', fontsize=12)
plt.xlabel('Latitude', fontsize=12)
for i in range(id_n):
    cluster=np.where(id_label==i)[0]
    plt.plot(X.latitude[cluster].values,X.longitude[cluster].values,ptsymb[i])
plt.show()

https://www.kaggle.com/xxing9703/kmean-clustering-of-latitude-and-longitude?select=zillow_data_dictionary.xlsx

https://www.kaggle.com/c/zillow-prize-1/data

另外,请检查一下。

https://towardsdatascience.com/clustering-geospatial-data-f0584f0b04ec

https://raw.githubusercontent.com/mdipietro09/DataScience_ArtificialIntelligence_Utils/master/machine_learning/data_stores.csv


0
投票

您可能想查看 kml3d 软件包,由与 kml (您找到的)同一团队开发。

https://cran.r-project.org/web/packages/kml3d/index.html

和 DOI:10.1016/j.cmpb.2012.08.016

这对多个变量(即联合纵向数据)执行 K 均值。

我已经有一段时间没有使用它了,但我打算使用。

© www.soinside.com 2019 - 2024. All rights reserved.