Я работаю с фреймом данных с несколькими переменными и без проблем создаю корреляционные матрицы. Я только что создал новую переменную, которая представляет собой соотношение двух других переменных, и попытался провести корреляцию между этой новой переменной и другими. R возвращает «NaN» (не число). Все соответствующие переменные являются числовыми, is.nan(NEW VARIABLE)
вернул все FALSE, и я попытался ограничить количество десятичных знаков в моей новой переменной, думая, что их слишком много. Это ничего не дало. Вот мой соответствующий код:
S1901Income_2022_crimetest <- S1901Income2022 |>
select(HouseholdsTotal , Pct0to10k , Pct10kto14999 , Pct15kto24999...8 , Pct25kto34999 , Pct35kto49999 , Pct50kto74999 , Pct75kto99999 , Pct100kto149999 , Pct150kto199999 , Pct200korMore...22 , HouseholdMedianIncome)
ratiohighlow <- (S1901Income_2022_crimetest$Pct200korMore...22 / S1901Income_2022_crimetest$Pct0to10k)
ratiohighlow <- round(ratiohighlow , digits = 8)
Crime2022_S1901Income <- Crime2022 |>
select(-FIPS, -year)
IncomeandCrime2022 <- cbind(Crime2022_S1901Income , S1901Income_2022_crimetest , ratiohighlow)
cor(IncomeandCrime2022$TotIncidents , ratiohighlow)
В этом коде «ratiohighlow» — это новая проблемная переменная. Я без проблем провел корреляцию между «TotIncidents» и другими переменными. Вот образец моего вывода, как и просили:
# A tibble: 10 × 12
HouseholdsTotal Pct0to10k Pct10kto14999 Pct15kto24999...8 Pct25kto34999 Pct35kto49999 Pct50kto74999
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 265794 6.6 5 8.6 8.4 11.9 16.7
2 1665560 4.2 2.5 5.5 6.6 10.6 17.1
3 151490 4.4 2.2 6 7.2 11.4 20.2
4 74678 6.9 4.5 9.3 9.8 14.1 20.2
5 6559 6.2 7.4 13.1 7.2 7.9 22.4
6 7194 9 8 16 7.8 13.3 18.6
7 19021 5.3 3.6 14.7 12.8 16.8 20.2
8 104164 2.9 2.2 5.3 6 10.2 17.3
9 15172 5.7 5 10.9 10.8 15.1 20.6
10 3587 8.8 10.2 15 8.7 13.6 17.9
# ℹ 5 more variables: Pct75kto99999 <dbl>, Pct100kto149999 <dbl>, Pct150kto199999 <dbl>, Pct200korMore...22 <dbl>,
# HouseholdMedianIncome <dbl>
Pct100kto149999
<dbl>
Pct150kto199999
<dbl>
Pct200korMore...22
<dbl>
HouseholdMedianIncome
<dbl>
ratiohighlow
<dbl>
14.1 7.3 9.3 63595 1.4090909
18.6 9.5 11.3 80675 2.6904762
19.4 7.6 6.3 73313 1.4318182
13.3 4.8 4.1 56439 0.5942029
14.0 5.0 2.6 58695 0.4193548
12.0 2.4 2.2 44804 0.2444444
Я не могу сказать этого по предоставленным вами данным, но я предполагаю, что у вас есть Inf
в векторе ratiohighlow
, что может привести к делению на 0. Это может означать, что Pct0to10k
содержит нули.
Вероятно, у вас есть нули в переменной Pct0to10k
.
Предположим, мы моделируем
set.seed(123)
Pct0to10k <- runif (100, 0, 100)
Pct200korMore <- runif (100, 0, 100)
ratiohighlow <- (Pct200korMore / Pct0to10k)
TotIncidents <- rpois(100, 20)
cor(TotIncidents, ratiohighlow)
# [1] 0.03587604
Теперь вставьте куда-нибудь ноль:
Pct0to10k[2] <- 0
ratiohighlow <- (Pct200korMore / Pct0to10k)
cor(TotIncidents, ratiohighlow)
# [1] NaN
Вы можете идентифицировать индексы нулей с помощью
indx <- which(is.infinite(ratiohighlow))
Указание R вычислять корреляцию только между полными наблюдениями не будет работать, поскольку функция ищет NA
, а не Inf
.
cor(TotIncidents, ratiohighlow, use = "complete.obs")
# [1] NaN
Но вы можете опустить эти значения при расчете корреляции:
cor(TotIncidents[-indx], ratiohighlow[-indx], use = "complete.obs")
[1] 0.03582789
да, в этом и была проблема: одно нулевое значение из 1474 наблюдений, и ваше решение сработало. Спасибо!
Вам нужно будет предоставить (пример) свои данные, желательно с помощью
dput()
.