Почему я получаю сообщение об ошибке «Аргумент длины 0» - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь создать функцию, которая имеет сложение и вычитание векторов. Итак, я сделал следующее

Qhat <- function(x, groups,I,n,H){
  Q4 <- array(0,dim=c(p,I))
  p = dim(x)[2]
  I=length(unique(groups));
  for (i in 1:I){
    for (j in 1:n[i]){
    xobs<-x[groups==i]
    n[i]<- length(xobs)
    Q1 <- 1/((n[i]*(n[i]-1))*det(H^(1/2)))
    sub <- t(sapply(1:nrow(xobs), function(x) if (x == 1) { xobs[x, ] - xobs[nrow(xobs), ] }  else {xobs[x, ] - xobs[x-1, ]}))
    add <- t(sapply(1:nrow(xobs), function(x) if (x == 1) { xobs[x, ] + xobs[nrow(xobs), ] }  else {xobs[x, ] + xobs[x-1, ]}))
    Q2 <- 1/2*add%*%(dmvnorm((sub)%*%(solve(H^(1/2)))))
    Q3 <- matrix(c(sum(Q2[,1]), sum(Q2[,2])), nrow =1, ncol=p)
    Q4 <- t(Q1[i]*Q3[i])
    }
  }
  return (Q4)
}

, где я использую данные

H <- n[1]^(-1/(p+4))*solve(sigma^(1/2))
p <- 2
n<-c(20,20,20) 
mu1=rep(1,p)
mu2=rep(1,p)
mu3=rep(1,p)
sigma <- matrix(c(1.0, 0,
                  0, 1.0), nrow = 2)
groups<-rep(1:3, n)
x1=mvrnorm(n[1], mu1,sigma)
x2=mvrnorm(n[2], mu2,sigma)
x3=mvrnorm(n[3], mu3,sigma)
x=rbind(x1,x2,x3)

Однако я получаю ошибку

Ошибка в 1: nrow (xobs) ): аргумент длины 0

Я не понимаю, почему у меня есть проблема в функции, хотя, когда я пытаюсь сделать то же самое с числами вне функции, она работает просто отлично.

Edit:

В основном я пытаюсь создать функцию, которая берет каждый вектор (строку) (2-мерный) в данных и вычитает / добавляет его из / к остальным векторам для каждой группы. Итак, в этом примере у меня есть 3 группы, и я хочу сделать что-то, что вычислило бы следующую функцию

enter image description here

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

В строке 9 у вас есть:

9: sub <- t(sapply(1:nrow(xobs), function(x) if (x == 1) { 
      xobs[x, ] - xobs[nrow(xobs), ] }  else {xobs[x, ] - xobs[x-1, ]}))

Но xobs - это вектор без измерения, поэтому 1:nrow(xobs) терпит неудачу.

xobs создается в строке 7 :

7: xobs <- x[groups==i]

Если вы хотите, чтобы это был подобный матрице объект, похожий на x, вам нужно добавить запятую:

7: xobs <- x[groups==i,]

Устраняет ли это проблему?

0 голосов
/ 27 марта 2020

В вашей функции xobs представляется вектором, вы используете xobs[nrow(xobs)], но вектор класса не имеет строк, попробуйте:

nrow(1:10) # NULL
x[nrow(x)] # yields Error in 1:10[nrow(1:10)] : argument of length 0  
# but
nrow(as.matrix(1:10))
# [1] 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...