2017-10-04 95 views
1

我是R的新手,想用它使我的生活更輕鬆地分析我的熒光檢測的數據。 在我在Excel中手動進行分析之前,現在想通過爲它設置一個r腳本來簡化分析。我的數據的隨着時間的推移計算熒光的斜率

一個示例將是這樣:

> df <- data.frame(time=1:10, sample1=4*1:10, sample2=3*1:10, sample3=2*1:10) 
> df 
    time sample1 sample2 sample3 
1  1  4  3  2 
2  2  8  6  4 
3  3  12  9  6 
4  4  16  12  8 
5  5  20  15  10 
6  6  24  18  12 
7  7  28  21  14 
8  8  32  24  16 
9  9  36  27  18 
10 10  40  30  20 

所以第一列永遠是我測定的時間和下面的列表示各樣品在給定時間點的熒光信號。然後,我想要計算每個樣本隨時間變化的熒光斜率(例如隨時間變化的樣本1,隨時間變化的樣本2,隨時間變化的樣本3 ...)。因此,我應該得到每列斜率的一個值。在我使用的excel中:slope(B2:BX; $ A $ 2:$ A $ X) 由於我通常有96個樣本,這使得在Excel中手工更加煩人。

通過@missuse

apply(df[,2:ncol(df)], 2, function(x){ 
    model = lm(x ~ df$time - 1) 
    return(coef(model)) 
}) 

提供的解決方案爲樣本DF我之上,但沒有表現出我的真實數據。

按照要求,這裏是我的真實數據的一部分:

> df1 
     Time  1  2  3  4  5  6  7  8  9  10  11  12  13 
1  0 24315.5 21446.5 46748.5 36008 15501 16799.5 24847 25354.5 16617.5 10576 43422.5 40036 15988.5 
2  26.1 25592.5 22667.5 47310.0 36284.0 15790.5 16815.5 25108.0 25535.0 16702.5 10418.0 43602.0 40301.5 16227.0 
3  52.1 26493.0 22839.5 47356.5 36549.0 15773.5 16804.0 25307.5 25538.5 16697.5 10390.0 43682.0 40332.0 16271.0 
4  78.2 26889 23585 47496.5 36525 15942.5 16903 25498 25565 16796.5 10369.5 43768.5 40253.5 16584 
5 104.3 27320.5 23914 47331.5 36680.5 16033.5 16912 25717 25798.5 16903.5 10356.5 43960 40299 16604.5 
6 130.4 27823.0 24208.0 47815.0 36591.0 16132.0 17052.5 25669.5 25614.5 16958.0 10306.0 44104.5 40266.0 16682.5 
7 156.4 28335.0 24647.0 47838.0 36718.0 16269.5 17001.0 25945.0 25754.5 16995.0 10397.5 43998.5 40256.5 16838.5 
8 182.5 28859.5 25128 48056 36887 16385 17032.5 25832.5 25710 16980.5 10306.5 44282.5 40461 16995 
9 208.6 29324.0 25369.0 48094.5 36889.5 16360.5 16931.0 25961.0 25918.5 17259.0 10271.0 44297.0 40511.0 17033.0 
10 234.6 29920.5 25803.5 48314.5 36755.5 16566.0 17106.5 26210.0 25595.5 17293.5 10268.5 44355.5 40503.5 17047.5 
11 260.7 30412.5 26314.5 48709.5 36848.5 16630.5 17208.0 26065.0 25702.0 17448.5 10296.0 44805.0 40383.5 17029.5 
12 286.8 30883.0 26624.0 48570.5 36845.0 16804.0 17116.5 26237.0 25817.0 17523.0 10274.0 44743.5 40727.5 17167.5 


> dput(df1[1:5, 1:3]) 
    structure(list(Time = structure(c(44L, 1L, 2L, 47L, 45L), .Names = c("X__2", 

"X__3", "X__4", "X__5", "X__6"), .Label = c(" 26.1", " 52.1", 
" 130.4", " 156.4", " 208.6", " 234.6", " 260.7", " 286.8", 
" 312.8", " 338.9", " 365.0", " 391.0", " 417.1", " 443.2", 
" 469.2", " 495.3", " 521.4", " 547.4", " 573.5", " 599.6", 
" 625.6", " 651.7", " 677.8", " 703.9", " 729.9", " 756.0", 
" 782.1", " 808.1", " 834.2", " 860.3", " 886.3", " 912.4", 
" 938.5", " 964.5", " 990.6", " 1016.7", " 1042.7", " 1068.8", 
" 1094.9", " 1120.9", " 1147.0", " 1173.1", " 1199.1", "0", "104.3", 
"182.5", "78.2"), class = "factor"), `1` = structure(1:5, .Names = c("X__2", 
"X__3", "X__4", "X__5", "X__6"), .Label = c("24315.5", "25592.5", 
"26493.0", "26889", "27320.5", "27823.0", "28335.0", "28859.5", 
"29324.0", "29920.5", "30412.5", "30883.0", "31599.5", "31958.0", 
"32744.0", "33065.5", "33432.0", "34269.0", "34603.5", "35214.5", 
"35570.5", "36149.0", "36596.5", "37087.5", "37520.0", "38254.5", 
"38540.5", "39200.5", "39718.0", "40126.0", "40808.0", "41235.0", 
"41537.5", "42316.5", "42755.5", "42927.0", "43772.0", "44095.0", 
"44669.0", "45027.0", "45607.0", "45976.5", "46624.5", "46961.0", 
"47338.0", "48147.5", "48499.0"), class = "factor"), `2` = structure(1:5, .Names = c("X__2", 
"X__3", "X__4", "X__5", "X__6"), .Label = c("21446.5", "22667.5", 
"22839.5", "23585", "23914", "24208.0", "24647.0", "25128", "25369.0", 
"25803.5", "26314.5", "26624.0", "27103.5", "27366.5", "27656.5", 
"28195.0", "28655.0", "28912.5", "29316.5", "29530.0", "29931.0", 
"30401.5", "30899.0", "30973.5", "31643.0", "31740.5", "32313.0", 
"32597.5", "32967.0", "33331.5", "33825.0", "34051.5", "34438.0", 
"34646.0", "35299.0", "35365.5", "35980.0", "36217.0", "36634.0", 
"37005.0", "37338.5", "37842.0", "38039.0", "38501.5", "38694.0", 
"39057.5", "39330.5"), class = "factor")), .Names = c("Time", 
"1", "2"), row.names = c(NA, 5L), class = "data.frame") 

當我用@missuse我得到的,而不是下面的一個斜率值的每個列提供的解決方案:

> df1 
         1  2  3  4  5  6  7  8  9  10  11  12  13 
data8$Time 26.1 25592.5 22667.5 47310.0 36284.0 15790.5 16815.5 25108.0 25535.0 16702.5 10418.0 43602.0 40301.5 16227.0 
data8$Time 52.1 26493.0 22839.5 47356.5 36549.0 15773.5 16804.0 25307.5 25538.5 16697.5 10390.0 43682.0 40332.0 16271.0 
data8$Time 130.4 27823.0 24208.0 47815.0 36591.0 16132.0 17052.5 25669.5 25614.5 16958.0 10306.0 44104.5 40266.0 16682.5 
data8$Time 156.4 28335.0 24647.0 47838.0 36718.0 16269.5 17001.0 25945.0 25754.5 16995.0 10397.5 43998.5 40256.5 16838.5 
data8$Time 208.6 29324.0 25369.0 48094.5 36889.5 16360.5 16931.0 25961.0 25918.5 17259.0 10271.0 44297.0 40511.0 17033.0 
data8$Time 234.6 29920.5 25803.5 48314.5 36755.5 16566.0 17106.5 26210.0 25595.5 17293.5 10268.5 44355.5 40503.5 17047.5 
data8$Time 260.7 30412.5 26314.5 48709.5 36848.5 16630.5 17208.0 26065.0 25702.0 17448.5 10296.0 44805.0 40383.5 17029.5 
data8$Time 286.8 30883.0 26624.0 48570.5 36845.0 16804.0 17116.5 26237.0 25817.0 17523.0 10274.0 44743.5 40727.5 17167.5 
data8$Time 312.8 31599.5 27103.5 48943.5 36966.0 16807.0 17150.0 26306.5 25697.0 17566.0 10375.0 44674.0 40740.5 17309.0 
+1

你能提供實際數據,而不是照片?這並不難(使用dput),但是如果你想要一個響應,你需要花時間寫一個更好的問題 – User632716

+0

嗨User632716,我編輯了我的問題。我希望現在更清楚。我確切知道我想做什麼,但不知道如何制定它,以便其他人瞭解它。如果還有其他要求,請告訴我。 – Hotte

+0

謝謝你,祝你好運與R :) – User632716

回答

1

這裏是一個可能的解決方案

apply(df[,2:ncol(df)], 2, function(x){ 
    model = lm(x ~ df$time - 1) 
    return(coef(model)) 
}) 
#ouput 
sample1 sample2 sample3 
4  3  2 

它假定截距是0。如果喲ü想截距評價使用:

model = lm(x ~ df$time)

什麼這個代碼是apply數據幀(df)超過列的功能(由2表示)。它從第二個到最後一個的所有列([2:ncol(df]),並進行線性迴歸(model = lm(x ~ df$time - 1)並返回係數(s)(return(coef(model))。

如果第一列不總是被命名爲time,則:

model = lm(x ~ df[,1] - 1)

指示第一列是x

編輯:問題是變量不編碼爲數字。這裏是一個解決方案:

df$Time = as.numeric(df$Time) #convert time to numeric 

沒有攔截:

apply(df[,2:ncol(df)], 2, function(x){ 
     x = as.numeric(x) #convert x to numeric 
     model = lm(x ~ df$Time - 1) 
     return(coef(model)) 
    }) 

截距:

apply(df[,2:ncol(df)], 2, function(x){ 
    x = as.numeric(x) #convert x to numeric 
    model = lm(x ~ df$time) 
    return(coef(model)[2]) 
}) 
+0

對不起,這是我的一次。所以在你的幫助下,我得到了數據趨勢線的斜率。問題是,通過這樣,該趨勢線的截距設置爲0,因爲截距是!= 0,所以它不能很好地顯示我的數據。你知道如何解決這個問題嗎? – Hotte

+0

非常感謝@missuse – Hotte

+0

歡迎@Hotte。如果一切都滿意,現在考慮將答案標記爲已接受。 – missuse

相關問題