#r #if-statement
#r #оператор if
Вопрос:
Я сделал кодирование в R, как показано ниже,
data1<-c(25,35,60,79,50)
data2<-c(100,150,170,200,1000)
g1=sort(data1)
g2=sort(data2)
ybar1<-mean(g1)
ybar2<-mean(g2)
#BIWEIGHT
med1=median(g1)
med2=median(g2)
mad1=1.4826*(median(abs(g1-med1)))
mad2=1.4826*(median(abs(g2-med2)))
u1=(g1-med1)/(9*mad1)
u2=(g2-med2)/(9*mad2)
#cat("nu1:",u1)
u=rbind(u1,u2)
print(u)
abs=abs(u)
print(abs)
for(j in abs){
if(j < 1){
num1 = ((g1-med1)^2)*((1-(u1^2))^4)
den1 = ((1-(u1^2))*(1-5*(u1^2)))
num2 = ((g2-med2)^2)*((1-(u2^2))^4)
den2 = ((1-(u2^2))*(1-5*(u2^2)))
}
}
cat("num2:",num2)
но когда я вычисляю вручную, для data1 каждое значение u1 меньше 1, таким образом, кодирование соответствует моему ручному вычислению, но для data2 оно включает значение u2, которое больше 1. кто-нибудь может помочь мне понять, почему это происходит и как это исправить?
заранее благодарю вас.
Комментарии:
1. Вы перезаписываете
num2
в каждом циклеfor
цикла, поэтому значениеnum2
, которое вы печатаете, относится к конечному числу вabs
2. как я должен это исправить?
3. Объявляйте свои переменные как пустые векторы, выполняя
num1 <- den1 <- num2 <- den2 <- c()
перед циклом, а во время цикла donum1 = c(num1, (((g1-med1)^2)*((1-(u1^2))^4))
и так далее для каждой из 4 переменных (т. Е. Объединяйте результат цикла с векторами в каждом цикле)4. для части if он по-прежнему считывает значение
abs
, которое больше 1, даже если условиеif
меньше 1 :((
Ответ №1:
Мне кажется, проблема в том, что внутри if
условия (и, следовательно, также внутри for
цикла) вы всегда берете целые векторы ( g1
, g2
, u1
, u2
). Вы не указываете R использовать только те значения в g1 и g2, для которых j<1. Вместо этого вы используете весь вектор столько раз, сколько значений в abs
нем <1.
Кроме того, вы объединяете u1
и u2
как 2-строчную матрицу, но оставляете g1 и g2 отдельными. Это сбивает с толку и создает вам еще больше проблем. Я предлагаю вам выполнить отдельные циклы для двух векторов.
Вы можете сделать это следующим образом:
idx1 <- which(abs(u1) < 1) #Gives you the indexes/positions in vector u1, where abs(u1)<1 is TRUE
idx2 <- which(abs(u2) < 1) #same for u2
for(i in idx1){
num1[i] = ((g1[i]-med1)^2)*((1-(u1[i]^2))^4)
den1[i] = ((1-(u1[i]^2))*(1-5*(u1[i]^2)))
}
for(j in idx2){
num2[j] = ((g2[j]-med2)^2)*((1-(u2[j]^2))^4)
den2[j] = ((1-(u2[j]^2))*(1-5*(u2[j]^2)))
}
Таким образом, num1
и den1
иметь 5 элементов, потому что все абсолютные значения u1 равны <1.
Напротив, num2
и den2
имеет 4 элемента, потому что последнее значение u2 составляет около 2.07.
Надеюсь, это вам поможет.
РЕДАКТИРОВАТЬ: Забыл добавить индексы ( [i] and [j]
) в num1
/ 2
и den1
/ 2
.
Комментарии:
1. Большое вам спасибо за помощь, всю прошлую неделю я сталкивался с одним и тем же. Еще раз спасибо :))