0

我有一個情節,其中每個x值都有2個Y值。數據也是非線性的。情節是這樣的:在R中的數據繪製單獨的曲線

enter image description here

現在我的問題是,我想單獨適合的迴歸曲線的兩項曲線(上,下)的。我知道這不是一個明確的問題,因爲我手邊沒有獨特的識別方案,但我知道響應系統可以隨機以相同的輸入(或幾乎相同的輸入)以兩種不同的方式運行。

The data file can be found here the headers used here 'sigma' and 'mabs_b'

摘要完整數據集的:

summary(data) 
#  id   sigma    L_gal    M_gal    flux   
# Min. : 1 Min. : 6.214 Min. :1.481e+06 Min. :1.541e+08 Min. : 10.4 
# 1st Qu.: 5118 1st Qu.: 28.438 1st Qu.:1.814e+08 1st Qu.:1.290e+10 1st Qu.: 196.7 
# Median :10236 Median : 41.542 Median :6.725e+08 Median :3.684e+10 Median : 388.0 
# Mean :10236 Mean : 56.599 Mean :3.151e+09 Mean :3.663e+11 Mean : 2551.5 
# 3rd Qu.:15354 3rd Qu.: 65.445 3rd Qu.:2.467e+09 3rd Qu.:1.410e+11 3rd Qu.: 1227.3 
# Max. :20471 Max. :391.988 Max. :3.810e+11 Max. :2.960e+13 Max. :733660.0 
# fluxmax    mabs_b   flag   cstar   
# Min. : 1.191 Min. :-24.25 Min. : 0.000 Min. :0.0001578 
# 1st Qu.: 5.801 1st Qu.:-18.77 1st Qu.: 0.000 1st Qu.:3.0000000 
# Median : 10.111 Median :-17.36 Median : 0.000 Median :3.0000000 
# Mean : 39.649 Mean :-17.33 Mean : 1.217 Mean :2.5267219 
# 3rd Qu.: 26.313 3rd Qu.:-15.94 3rd Qu.: 3.000 3rd Qu.:3.0000000 
# Max. :6600.280 Max. :-10.72 Max. :51.000 Max. :3.0000000 

head(data,20)輸出:

subset_data = structure(list(id = 1:20, sigma = c(391.988, 379.985, 363.682, 
358.969, 362.63, 344.544, 344.544, 331.482, 332.665, 302.539, 
306.977, 287.416, 205.793, 303.279, 297.047, 273.719, 214.59, 
268.891, 291.834, 191.926), L_gal = c(3.81e+11, 3.35e+11, 2.98e+11, 
2.98e+11, 2.93e+11, 2.19e+11, 2.19e+11, 1.84e+11, 1.68e+11, 1.43e+11, 
1.42e+11, 1.12e+11, 1.05e+11, 1.03e+11, 1.02e+11, 9.27e+10, 92017300000, 
91078100000, 85536700000, 83359400000), M_gal = c(2.96e+13, 2.68e+13, 
2.23e+13, 2.05e+13, 2.21e+13, 1.99e+13, 1.99e+13, 1.78e+13, 1.94e+13, 
1.21e+13, 1.34e+13, 1.06e+13, 4.01e+12, 1.56e+13, 1.38e+13, 8.95e+12, 
5.16e+12, 8.12e+12, 1.4e+13, 3.28e+12), flux = c(156286, 129987, 
67801.2, 50110.3, 73118.6, 80827.2, 80827.2, 68568, 142348, 21194.6, 
31081.9, 17414.4, 12121.3, 167441, 81709.3, 13920.7, 51775.8, 
8185.93, 159998, 17393.7), fluxmax = c(6508.29, 4956.37, 2381.87, 
2200.22, 2986.29, 2396.81, 2396.81, 2278.94, 4875.65, 854.856, 
1264.36, 750.337, 19.7162, 6082.21, 724.639, 204.966, 281.601, 
214.372, 6304.41, 182.002), mabs_b = c(-24.2475, -24.1079, -23.9807, 
-23.9799, -23.9618, -23.6449, -23.6449, -23.4586, -23.3587, -23.1847, 
-23.1745, -22.9178, -22.8463, -22.826, -22.8183, -22.7122, -22.7042, 
-22.693, -22.6249, -22.5969), flag = c(35L, 0L, 0L, 0L, 3L, 2L, 
2L, 2L, 3L, 2L, 0L, 2L, 35L, 2L, 3L, 35L, 2L, 2L, 0L, 2L), cstar = c(0.989659, 
0.989581, 0.988048, 0.993796, 0.986398, 0.990529, 0.990529, 0.997505, 
0.995231, 0.990121, 0.986176, 0.984495, 0.0007165, 0.987469, 
0.0287568, 0.379966, 0.028632, 0.898742, 0.999391, 0.0286844)), .Names = c("id", 
"sigma", "L_gal", "M_gal", "flux", "fluxmax", "mabs_b", "flag", 
"cstar"), row.names = c(NA, 20L), class = "data.frame") 
+2

如果你有可變識別上,下點,則可以1.使用它作爲在估計器的指示符;或者2.對每個組分別進行估算。 – lmo

+0

如果您需要幫助,爲您的數據選擇適當的統計方法,則應該在[stats.se]處詢問。否則,請清楚說明您希望R爲您做什麼。計算機應該如何將分數分組。除非你能回答這個問題,否則你的問題不屬於這個網站。你想使用什麼統計模型? – MrFlick

+0

@MrFlick如果問題就像「如何將R中的迴歸應用於給定的數據,並將數據分成兩個獨立的箱子?」 –

回答

2

有與之間的間隙點的兩個集羣。數據不包含指標。我假設你想要先定義位於間隙之上的點應該在一個組中,而位於間隙之下的點應該在另一個組中。

在這種情況下,我恐怕沒有得到解決這個問題,而沒有爲這兩個組自己創建一個指示變量。

幸運的是,這可以使用locator()函數完成。在這種情況下,該功能起作用,因爲兩組之間存在明顯的差距。它仍然使用locator()來追蹤穿過間隙的線,並檢查哪些西格瑪值位於該追蹤線之上和之下。

一旦你有這個指標,你可以使用任何你喜歡的擬合方法......但這是一個不同的職位(可能在交叉驗證)。

library('ggplot2') 

d<-read.csv("SIS_TFFJ_all_sorted_R.csv") 

uniq_sigma<-unique(d$sigma) 

gap<-locator() 

這裏有差距的內容從我的跟蹤:

> gap 
$x 
[1] -24.66446 -24.45990 -24.15305 -23.74391 -23.48820 -22.82336 -22.46536 -22.12442 -21.74938 -21.40843 -21.06749 -20.70950 -20.52198 -19.89123 -20.07875 -19.31162 -18.66382 -18.25469 -17.82851 
[20] -17.07842 -16.39653 -15.64645 -15.08389 -14.24858 -13.44735 -12.40747 -11.19711 

$y 
[1] 346.67767 331.34710 315.20967 294.23100 277.28669 249.85305 229.68126 213.54382 194.17890 173.20024 159.48342 145.76660 136.08413 120.75357 123.98106 107.84362 92.51306 87.67183 79.60311 
[20] 67.50003 58.62444 49.74885 44.10075 38.45265 30.38393 23.92896 17.47398 

現在,我也行分兩個組的估計,我可以簡單地檢查哪些點的上方和線下。

d$x_pos<-cut(d$mabs_b, gap$x) 
names(gap$y)<-unique(d$x_pos) 
d$y_pos<-gap$y[d$x_pos] 

d$cohort<-ifelse(d$sigma>d$y_pos,'upper','lower') 

最後,使用geom_smooth()進行模型擬合繪圖。再一次,你想要適合的模型是一個完全不同的問題......更適合交叉驗證的問題。

ggplot(data=d, aes(x=mabs_b, y=sigma, col=cohort, group=cohort))+geom_point()+geom_smooth(col='black') 

enter image description here