2015-12-02 3 views
0

После этого вопроса: Transition matrixR: добавить недостающие строки не используется для контура

Мы используем его установки:

#Please use the setup in the following **EDIT** section. 
#df = data.frame(cusip = paste("A", 1:10, sep = ""), xt = c(1,2,3,2,3,5,2,4,5,1), xt1 = c(1,4,2,1,1,4,2,2,2,5)) 
    cusip xt xt1 
1  A1 1 1 
2  A2 2 4 
3  A3 3 2 
4  A4 2 1 
5  A5 3 1 
6  A6 5 4 
7  A7 2 2 
8  A8 4 2 
9  A9 5 2 
10 A10 1 5 

Согласно ответам на этот пост, мы можем получить матрицу перехода следующим образом:

res <- with(df, table(xt, xt1)) ## table() to form transition matrix 
res/rowSums(res)    ## /rowSums() to normalize by row 
# xt1 
# xt   1   2   4   5 
# 1 0.5000000 0.0000000 0.0000000 0.5000000 
# 2 0.3333333 0.3333333 0.3333333 0.0000000 
# 3 0.5000000 0.5000000 0.0000000 0.0000000 
# 4 0.0000000 1.0000000 0.0000000 0.0000000 
# 5 0.0000000 0.5000000 0.5000000 0.0000000 

Мы замечаем, что нет колонки 3, потому что в момент времени t + 1 нет состояния 3. Однако в математике матрица перехода должна быть квадратной. Для этой ситуации нам все еще нужен столбец 3, где [3,3] = 1 и другие элементы = 0 (правило для любого отсутствующего столбца n или отсутствующей строки n, мы устанавливаем [n, n] = 1 и другие элементы в этой строке/колонке = 0), которая выглядит следующим образом:

# xt1 
# xt   1   2   3   4   5 
# 1 0.5000000 0.0000000 0.0000000 0.0000000 0.5000000 
# 2 0.3333333 0.3333333 0.0000000 0.3333333 0.0000000 
# 3 0.5000000 0.5000000 1.0000000 0.0000000 0.0000000 
# 4 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 
# 5 0.0000000 0.5000000 0.0000000 0.5000000 0.0000000 

Могу ли я достичь этого, не нажимая беспорядочный цикл? Спасибо.

EDIT: Пожалуйста, используйте этот набор данных вместо:

df = data.frame(cusip = paste("A", 1:10, sep = ""), xt = c(2,2,3,2,3,5,2,4,5,4), xt1 = c(1,4,2,1,1,4,2,3,2,5)) 
    cusip xt xt1 
1  A1 2 1 
2  A2 2 4 
3  A3 3 2 
4  A4 2 1 
5  A5 3 1 
6  A6 5 4 
7  A7 2 2 
8  A8 4 3 
9  A9 5 2 
10 A10 4 5 

теперь мы имеем матрицу перехода следующим образом:

res <- with(df, table(xt, xt1)) 
res/rowSums(res)     
    xt1 
xt  1 2 3 4 5 
    2 0.50 0.25 0.00 0.25 0.00 
    3 0.50 0.50 0.00 0.00 0.00 
    4 0.00 0.00 0.50 0.00 0.50 
    5 0.00 0.50 0.00 0.50 0.00 

Обратите внимание, что строка 1 отсутствует. Теперь я хочу новую строку 1, в которой [1,1] = 1 и другие элементы = 0 (так что эта строка суммируется до 1). Получить что-то вроде:

xt1 
xt  1 2 3 4 5 
    1 1.00 0.00 0.00 0.00 0.00 
    2 0.50 0.25 0.00 0.25 0.00 
    3 0.50 0.50 0.00 0.00 0.00 
    4 0.00 0.00 0.50 0.00 0.50 
    5 0.00 0.50 0.00 0.50 0.00 

Как я могу достичь этого (добавьте недостающую строку)?

+3

Ваши 'xt' и' xt1' должны быть факторами с соответствующими «уровнями», тогда 'table' будет включать в себя даже отсутствующие уровни, а построение матрицы будет hunky-dory (или почти так). Эти вопросы и ответы могут быть полезны: http://stackoverflow.com/questions/1617061/including-missing-values-in-table-results-in-r – Frank

+0

@frank. Проблема заключается в том, что 'xt1' не имеет уровня 3, который является состоянием 3, в 'df', но нам все равно нужно принять это во внимание, поэтому мне нужен столбец 3. – Natalia

+0

@Natalia frank означает, что это' с (df, table (xt, factor (xt1, levels = 1: 5))) ', хотя было бы лучше определить коэффициент/уровни в кадре данных – rawr

ответ

1

Вот способ сделать это (только глядя на второй поставленный вопрос):

# setup 
df = data.frame(
    cusip = paste("A", 1:10, sep = ""), 
    xt = c(2,2,3,2,3,5,2,4,5,4), 
    xt1 = c(1,4,2,1,1,4,2,3,2,5) 
) 

df$xt = factor(df$xt, levels=1:5) 
df$xt1 = factor(df$xt1, levels=1:5) 

# making the transition frequency table 
tab = with(df, prop.table(table(xt,xt1), 1)) 

# xt1 
# xt  1 2 3 4 5 
# 1       
# 2 0.50 0.25 0.00 0.25 0.00 
# 3 0.50 0.50 0.00 0.00 0.00 
# 4 0.00 0.00 0.50 0.00 0.50 
# 5 0.00 0.50 0.00 0.50 0.00 

Это правильная таблица для описания частоты переходов, наблюдаемых в данных df. Если, однако, вы хотите, чтобы применяли правило перехода, где нет данных, есть некоторые варианты. OP хочет приписывать любые ненаблюдаемые состояния «поглощающие состояния»:

r = rowSums(tab,na.rm=TRUE)==0 

tab[r, ] <- diag(nrow(tab))[r,,drop=FALSE] 

# xt1 
# xt  1 2 3 4 5 
# 1 1.00 0.00 0.00 0.00 0.00 
# 2 0.50 0.25 0.00 0.25 0.00 
# 3 0.50 0.50 0.00 0.00 0.00 
# 4 0.00 0.00 0.50 0.00 0.50 
# 5 0.00 0.50 0.00 0.50 0.00 

Я не думаю, что это хорошая идея, так как она скрывает черты истинных данных.

+0

правый. Это не матрица перехода. Но теперь я смущен. Потому что я думаю, что матрица перехода должна быть квадратной (в данном случае это 5 * 5) ... – Natalia

+0

@Natalia Если вы оставите ее равной 0 вместо перехода на 1 (как на вкладке ' 'object), то это матрица перехода. Эмпирическая матрица перехода (то, что вы здесь, просто описывая наблюдаемые частоты), не обязательно должна быть квадратной. Например, если вы видите A-> A и A-> B, и это все, тогда нет способа писать вероятности для того, что происходит, начиная с B, поэтому оно не будет квадратным. – Frank

+0

, но wiki говорит, что определение переходной матрицы C состоит в том, что мы можем предварительно рассчитать C на A и получить B (CA = B). А вот матрица 5 * 1, а В тоже 5 * 1. Если C не 5 * 5 (квадрат), как мы можем получить вектор 5 * 1 B? – Natalia

Смежные вопросы