Výpočet STISKNĚTE statistika pomocí vlastní datové sady produkuje chybě v R

0

Otázka

Pokoušel jsem se vypočítat STISKNĚTE statistika použití PRESS() funkce z qpcR balíček. Poprvé jsem se vytvořit regresní funkce z dat, která jsem dovážené:

> job_proficiency_lm_first_order_formula_best = job_proficiency ~ T_1 + T_3 + T_4
> job_proficiency_lm_first_order_best_subs = lm(data = Job_Proficiency, formula = job_proficiency_lm_first_order_formula_best)
> summary(job_proficiency_lm_first_order_best_subs)

Call:
lm(formula = job_proficiency_lm_first_order_formula_best, data = Job_Proficiency)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.4579 -3.1563 -0.2057  1.8070  6.6083 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -124.20002    9.87406 -12.578 3.04e-11 ***
T_1            0.29633    0.04368   6.784 1.04e-06 ***
T_3            1.35697    0.15183   8.937 1.33e-08 ***
T_4            0.51742    0.13105   3.948 0.000735 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.072 on 21 degrees of freedom
Multiple R-squared:  0.9615,    Adjusted R-squared:  0.956 
F-statistic:   175 on 3 and 21 DF,  p-value: 5.16e-15

Jak můžete vidět, že regresní funkce je vypočítaná na tažné zařízení.

Ale když jsem se pokusil vypočítat PRESS statistiku jsem si následující:

> PRESS(object = job_proficiency_lm_first_order_best_subs)
.
Error in eval(predvars, data, env) : object 'T_1' not found

Otestovat, že PRESS() funkce sama o sobě pracovala, jsem se pokusil získat STISKNĚTE statistika s vestavěným v sadě údajů z R, zejména swiss datová sada:

> test = lm(data = swiss, formula = Fertility ~ Agriculture + Examination)
> PRESS(test)
.........10.........20.........30.........40.......
$stat
[1] 4594.711

$residuals
 [1]   5.86874937  -0.11299684   8.99475044   9.63703923   6.86207418  -4.99681787  15.67581939  21.66065932   7.37038439  11.95400827  15.75323917   0.44045951  -4.80167644
[14]   2.81771330  -0.11677715   2.18088788   0.62738886  -6.43338393  -2.03263398   0.06287026   2.99119927  -7.88458225  -7.23342328  -8.51283184  -1.12064764   1.82564228
[27] -10.11322228  -9.54214928  -4.12165698  -6.78996076  -8.18443581  -9.65615193  -3.18410523  -2.56286583  -0.78611489 -12.32904436  10.00836421   6.33398831  11.08423270
[40]   7.20518930   6.42985483  15.41461736   4.64693055   4.94386095 -18.45443801 -27.04073067 -23.95733041

$P.square
[1] 0.3598858

Jak lze vidět nebyl žádný problém. Tak to musí být něco, vyskytující se pod kapotou. Tak jsem tu s dotazem, co by mohlo být problém narážím?

Pro odkaz tady je můj importované datové sady není příliš velká, doufejme, že to neporušuje žádné pravidla:

> dput(Job_Proficiency)
structure(list(job_proficiency = c(88, 80, 96, 76, 80, 73, 58, 
116, 104, 99, 64, 126, 94, 71, 111, 109, 100, 127, 99, 82, 67, 
109, 78, 115, 83), T_1 = c(86, 62, 110, 101, 100, 78, 120, 105, 
112, 120, 87, 133, 140, 84, 106, 109, 104, 150, 98, 120, 74, 
96, 104, 94, 91), T_2 = c(110, 97, 107, 117, 101, 85, 77, 122, 
119, 89, 81, 120, 121, 113, 102, 129, 83, 118, 125, 94, 121, 
114, 73, 121, 129), T_3 = c(100, 99, 103, 93, 95, 95, 80, 116, 
106, 105, 90, 113, 96, 98, 109, 102, 100, 107, 108, 95, 91, 114, 
93, 115, 97), T_4 = c(87, 100, 103, 95, 88, 84, 74, 102, 105, 
97, 88, 108, 89, 78, 109, 108, 102, 110, 95, 90, 85, 103, 80, 
104, 83)), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -25L), spec = structure(list(cols = list(
    job_proficiency = structure(list(), class = c("collector_double", 
    "collector")), T_1 = structure(list(), class = c("collector_double", 
    "collector")), T_2 = structure(list(), class = c("collector_double", 
    "collector")), T_3 = structure(list(), class = c("collector_double", 
    "collector")), T_4 = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 0), class = "col_spec"))

EDIT: Takže první chyba byla opravena díky @Otto, ale teď jsem dostal jinou chybu:

> job_proficiency_lm_first_order_best_subs = lm(data = Job_Proficiency, formula = job_proficiency ~ T_1 + T_3 + T_4)
> PRESS(job_proficiency_lm_first_order_best_subs)
.........10.........20.....
Error in PRESS.res^2 : non-numeric argument to binary operator

Všechno, co jsem udělal, bylo, vstoupit do mého vzorec do regresní model, ručně.

data-science dataset package r
2021-11-19 07:49:30
1

Nejlepší odpověď

1

Z nějakého důvodu PRESS() zdá se očekávat, že vzorec se uvádí jako řetězec. Toto funguje:

library('qpcR')
job_proficiency_lm_first_order_best_subs = lm(data = Job_Proficiency, formula = job_proficiency ~ T_1 + T_3 + T_4)
PRESS(job_proficiency_lm_first_order_best_subs)
.........10
$stat
[1] 56.11556

$residuals
 [1]  4.24693620 -0.02950692 -0.24941392 -1.68812204  0.37184702 -3.35442911
 [7]  1.86363303 -1.48719175  3.34459605 -2.62766088

$P.square
[1] 0.9785162

Co se týče vaší druhé chyby "Error in PRESS.res^2 : non-numeric argument to binary operator"Mám podezření, že to je způsobeno tím, že vaše Job_Proficiency je tibble, a ne data.rám. Obě reprezentace dat jsou téměř stejné, s výjimkou, když nejsou.

Možná nejjednodušší způsob, jak řešit druhá chyba je transformovat vaše vstupní data do data.rám z tibble o

Job_Proficiency <- as.data.frame(Job_Proficiency) 

a pak pokračovat s vaší analýze.

Jak se mě týče, obě otázky jsme našli (vzorec nemůže být pre-přidělen, a tibblese způsobit chyby) jsou jasné chyby, které by měly být oznámeny balíček pro vývojáře.

2021-11-19 10:35:42

hmmm zajímavé....tak musím explicitně uvést vzorec v mém regresní model....EDIT: Teď jsem dostal jinou chybu.....
dc3rd

Údaje, které jste zaslali neopakuje chyby. Můžete přidat ukázková data, která produkuje chybě?
Otto Kässi

Jen jsem přidal celý soubor dat na mou otázku a já jsem byl schopen produkovat chybu znovu.
dc3rd

@dc3rd zkuste, jak.data.rám(Job_Proficiency) -> Job_Proficiency
Otto Kässi

Moje data je již datový rámec.
dc3rd

Ne, to není, alespoň podle dput() výstup. class = c("spec_tbl_df", "tbl_df", "tbl", "data.rám"). Pravděpodobně jste číst v datech pomocí readr (), takže můžete skončit import tibble.
Otto Kässi

dobře jsem udělal, použití read_table2() z tidyverse balíček a vím, že mají tendenci přiklánět k tibblese. Ale když jsem se ptal na program, který jsem použil is.data.frame() a to reagovalo, jako TRUE....
dc3rd

To funguje pomocí váš návrh......Díky. Jdu to zkusit a hlásit je na vývojáři
dc3rd

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................