【问题标题】:Creating sparse matrix and then running predictive analysis on the data创建稀疏矩阵,然后对数据进行预测分析
【发布时间】:2018-10-21 15:25:15
【问题描述】:

R 专家您好,

我是一名尝试学习 R 的 Stata 程序员。 我有一个数据框,其中每个行 ID 的值为 df1:

df1 <- data.frame(name=c("John", "Mary", "Joe", "Tim", "Bob", "Pat"),
                  v1=c(14,2,3,4,14,1),
                  v2=c(21,6,19,31,16,5),
                  v3=c(32,10,22,33,27,30),
                  v4=c(42,17,45,39,34,35),
                  v5=c(98,35,66,0,78,99),
                  v6=c(117,49,0,0, 89,186))

每个访问者 ID 列中的值范围为 1 到 1000。这些基本上是每个访问者 ID 在 1000 天内访问医生的天数。部分患者症状消失后停止就诊,部分患者继续服药并按照医生的规定进行常规就诊。有的患者病了很久以后又开始复诊了。

我想创建一个稀疏矩阵,其中包含从 1 到 1000 天就诊的所有 ID。您能否建议如何创建稀疏矩阵。它在 Stata 中非常简单直接,但我无法在 R 中找到方法。

最终结果应采用以下形式:

name    1   2   3   4   5   6   10  14  16  17  19  21
John                                1               1
Mary        1               1   1           1       
Joe         1                               1

创建稀疏矩阵后,我必须预测患者下次就诊的时间。 我计划创建一个稀疏矩阵,然后创建最后两次连续访问之间差异的计算变量,然后对其使用逻辑回归。是否可以生成更多的 KPI 以仅使用给定的信息进行稳健的分析?有人可以建议这个想法是否正确,或者是否有更好的方法来解决它。

提前致谢。

【问题讨论】:

  • 不鼓励在 SO 上提出多部分问题。您应该编辑您的问题以删除 las 几个句子。 (我怀疑“KPI”是 Stata 用户专用的某种首字母缩写词,因此如果您发布单独的问题,您应该定义它。)就创建稀疏矩阵而言,使用 Matrix 包中的函数非常容易。跨度>

标签: r sparse-matrix predict visitor-statistic


【解决方案1】:

关于如何创建稀疏矩阵的问题,您提供了一个编码示例,可以很容易地回答。我认为您不需要安装该软件包,因为它属于随任何发行版一起提供的“推荐”软件包类别。

library(Matrix)
help(pac=Matrix)
M <-  Matrix(data.matrix( df1[-1]), sparse=TRUE)  # remove character column first
6 x 6 sparse Matrix of class "dgCMatrix"
     v1 v2 v3 v4 v5  v6
[1,] 14 21 32 42 98 117
[2,]  2  6 10 17 35  49
[3,]  3 19 22 45 66   .
[4,]  4 31 33 39  .   .
[5,] 14 16 27 34 78  89
[6,]  1  5 30 35 99 186

对于修改后的问题:

# first create index vectors
xix <- c( row(data.matrix(df1[-1]))[!is.na(df1[-1])])
xjy <- c(df1[-1][!is.na(df1[-1])])

然后为索引参数提供非 NA 值和足够的 1 来填充索引位置:

 M <- spMatrix(6, 186, i = xix, j=xjy, x=rep(1,length(c( row(data.matrix(df1[-1]))[!is.na(df1[-1])])))) 
> str(M)
Formal class 'dgTMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:33] 0 1 2 3 4 5 0 1 2 3 ...
  ..@ j       : int [1:33] 13 1 2 3 13 0 20 5 18 30 ...
  ..@ Dim     : int [1:2] 6 186
  ..@ Dimnames:List of 2
  .. ..$ : NULL
  .. ..$ : NULL
  ..@ x       : num [1:33] 1 1 1 1 1 1 1 1 1 1 ...
  ..@ factors : list()
> M[1:6, 1:25]  # enough output to show success
6 x 25 sparse Matrix of class "dgTMatrix"

[1,] . . . . . . . . . . . . . 1 . . . . . . 1 . . . .
[2,] . 1 . . . 1 . . . 1 . . . . . . 1 . . . . . . . .
[3,] . . 1 . . . . . . . . . . . . . . . 1 . . 1 . . .
[4,] . . . 1 . . . . . . . . . . . . . . . . . . . . .
[5,] . . . . . . . . . . . . . 1 . 1 . . . . . . . . .
[6,] 1 . . . 1 . . . . . . . . . . . . . . . . . . . .
> 

【讨论】:

  • 非常感谢您的回答,我想我没有问对问题。我需要创建一个矩阵,使得从 1 到 1000 的所有就诊天数都成为列名,如果当天就诊,每个患者 ID 都会填充一个布尔值 0 和 1。你能帮我解决这个问题吗?提前致谢。
  • 如果非访问天数需要为零,那么它是一个密集矩阵。您可以获得“看起来”像您的编辑输出的唯一方法是一个字符矩阵,其中空位置被编码为""。我认为通过将数据框中的值用作 sparseMatrix 函数之一的 j 参数,可以实现稀疏矩阵版本。您将使用行索引作为 i 参数。我认为这些是 TsparseMatrices。
  • 非常感谢您的宝贵时间和快速响应。
猜你喜欢
  • 2012-01-10
  • 1970-01-01
  • 2011-03-23
  • 2014-11-30
  • 2017-03-31
  • 2017-03-12
  • 1970-01-01
相关资源
最近更新 更多